基于Android系统的定位及辅助服务软件设计

2020-06-09 12:20马玉春吴淑婷汪文彬孙冰
软件 2020年2期
关键词:情景模式智能手机

马玉春 吴淑婷 汪文彬 孙冰

摘  要: 老人在使用智能手机的过程中,常常由于误操作而将手机设置为静音模式,或者关闭Wi-Fi,导致接听来电和微信视频受到影响。本文实现了白名单自动开启手机正常情景模式,监测Wi-Fi状态并提醒用户开启,还可以无干扰查询地理位置及将余额不足信息发送到白名单手机中,协助老人无障碍使用智能手机。

关键词: 智能手机;情景模式;位置查询;辅助服务

中图分类号: TP311.52    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2020.02.017

【Abstract】: The elderly often set the smartphones to silent mode or turn off Wi-Fi by mistake, and it will affect incoming calls of telephone and WeChat video. In this paper, normal mode will be set through whitelists, and Wi-Fi status will be supervised and the elderly will be notified to switch on automatically. Location and other information such as that balance is not enough will be sent to whitelists quietly in order to assist the elderly using smartphones without obstacles.

【Key words】: Smartphone; Scenario mode; Address inquiry; Auxiliary service

0  引言

智能手机可以用于语音通话,也可用于数据传输,特别是常用的定位与微信视频,因而,便于子女掌握老人的地理位置,通过视频聊天慰藉老人。但是,老人由于误操作,经常会将手机设置为静音模式,导致呼入电话无反应;或者关闭Wi-Fi,导致微信视频呼叫不成功。如果手机欠费,则更是失去所有功能。这些不足,老人由于视力不好或者文化程度不高,难以自行解决。本文通过多项广播接收器解决以上问题,并将软件以服务形式常驻内存,对手机进行监控。

1  主窗体功能及服务的实现

定位及辅助服务软件的主要功能在后台完成,实现对手机的监控。前台主要由一个主窗体完成,实现白名单的添加、删除、备份与恢复。在完成后台功能时,需要查看对比这些白名单以便做出决策:只有白名单电话呼入才能自动将静音或振动模式切换为正常模式并将音量设置为最大,白名单短信查询位置才会给予回复。白名单仅以电话号码表示,通过自定义ListView组件进行显示,可以手动调整顺序,当收到服务商发送的手机余额不足短信时,该信息将发送给第一条手机号码的白名单[1]。白名单中的数据,通过多线程技术调用FileOutputStream对象写入外部文本文件,从而复制到外部存储器保存;也可以调用FileInputStream对象从外部存储器中恢复数据,便于换机操作。

当系统资源减少,为了保障拥有用户焦点的应用程序正常运行,Android系统会强行终止一个服务。如果服务被拥有用户焦点的Activity绑定着,则它一般不会被强行终止。如果服务声明为“在前台运行服务”,则它几乎不会被终止。否则,如果服务已被启动并且已运行了很长时间,那么系统将会随着时间的推移而降低它在后台任务列表中的级别,此类服务将很有可能会被强行终止[2]。启動服务可以在主窗体中进行,也可以在开机完成广播接收器中进行。在服务代码的onCreate方法中,获得时间戳strDate,然后调用系统方法startForeground显示服务通知栏图标,以时间戳作为图标内容,其代码如下所示:

public void onCreate() {

super.onCreate();

Calendar cl = Calendar.getInstance();

Date dt = cl.getTime();

String strDate = dt.toString();

startForeground(FOREGROUND_ID,

buildForegroundNotification (strDate));

}

自定义函数buildForegroundNotification用来构建通知栏图标,返回一个Notification的对象notify。PendingIntent对象pi指向主窗体MainActivity,通过调用notify的setContentIntent方法并传入该pi对象,即可通过点击通知图标打开主窗体;方法setOngoing中传入true,表示有正在执行的后台任务;方法setPriority中传入参数Notification. PRIORITY_MAX,使得该图标被置于最前列。

private Notification buildForegroundNotification(String strContent) {

Intent intent = new Intent(this, MainActivity.class);

intent.setFlags(Intent.FLAG_ACTIVITY_ NEW_TASK |

Intent.FLAG_ACTIVITY_CLEAR_TASK);

PendingIntent pi = PendingIntent.getActivity (this, 0, intent,

PendingIntent.FLAG_UPDATE_ CURRENT);

Notification notify = new Notification. Builder(this)

.setOngoing(true)

.setPriority(Notification.PRIORITY_HIGH)

.setContentIntent(pi)

.setContentTitle("Address Server")

.setContentText(strContent)

.setSmallIcon(R.drawable.ic_launcher)

.build();

return notify;

}

2  Wi-Fi設置变化的监控

为了对Wi-Fi状态进行监控,需要在配置文件中声明ACCESS_NETWORK_STATE和ACCESS_WIFI_STATE权限,并用自定义广播接收器WiFiChangeReceiver进行监控[3]。通过系统方法getSystemService获得WifiManager对象,从而调用getWifiState方法获取Wi-Fi的状态,如果为WIFI_STATE_DISABLED状态,则调用WifiManager对象的setWifiEnabled(true)方法打开Wi-Fi开关。低版本的Android系统可以直接被打开,高版本的Android系统仍然需要用户授权。监控Wi-Fi设置的广播接收器WiFiChangeReceiver的关键源代码如下所示。

public class WiFiChangeReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

WifiManager wifiManager = (WifiManager)

context.getSystemService (Context.WIFI_SERVICE);

int status =wifiManager.getWifiState();

switch(status){

case WifiManager.WIFI_STATE_ DISABLED:

Toast.makeText(context, "WIFI_ STATE_DISABLED",

Toast.LENGTH_SHORT).show();

wifiManager.setWifiEnabled(true);

break;

default:

break;

}

}

}

3  通话状态监控

在配置文件中声明READ_PHONE_STATE权限,并实现自定义广播接收器PhoneStateReceiver,当状态内容为EXTRA_STATE_RINGING,即有电话呼入时,获取电话号码,存入inPhone,如果电话号码为空值(即匿名电话)则直接返回[4]。如果电话号码不在白名单集合strPhoneSet中,或者白名单集合以“000000”开头,则不予处理,否则,将情景模式设置为RINGER_MODE_NORMAL(正常)模式,并将铃音设置为最大。这里,白名单电话号码“000000”有特殊功能,当该号码在主窗体中移到最前面,表示软件不开启白名单呼入电话自动切换至正常模式,同时设置最大音量。

public class PhoneStateReceiver extends BroadcastReceiver {

String strPhoneSet;

private String inPhone="";

public void onReceive(Context context, Intent intent) {

String state = intent.getStringExtra (TelephonyManager.EXTRA_STATE);

if(TextUtils.isEmpty(state)) return;

if (!state.equals(TelephonyManager. EXTRA_STATE_RINGING)) return;

strPhoneSet = MainActivity. readStorage();

inPhone = intent.getStringExtra(

TelephonyManager.EXTRA_ INCOMING_NUMBER);

if(TextUtils.isEmpty(inPhone)) return;

if((!strPhoneSet.contains(inPhone)) ||

strPhoneSet.startsWith ("000000")) return;

Sound.setSoundMode(context, AudioManager.RINGER_MODE_NORMAL);

Sound.setMaxInCallVolume(context); // 设置最大音量

}

}

4  余额不足短信的获取与转发

当收到“100”开头的移动服务提供商发送的短信,就提取短信文本内容,以此为参数调用tipRemainder函数,抽取“余额”与“元”之间的浮点数,如果该值大于给定的最小值(比如20元),则返回;否则将白名单集合strPhoneSet转换为字符串数组,从第一个开始逐个比对,将余额不足短信发送到第一个白名单手机号码[5]。自定义函数tipRemainder的定义如下所示。

private void tipRemainder(String body){

String strValue = StringProcess. getDecimalString(body, "余额","元");

float fVal = Float.parseFloat(strValue);

if(fVal >= MONEY_MIN) return;

String strPhoneSet = MainActivity. readStorage();

String strArray[] = strPhoneSet.split("/");

for(int i=0; i

if(PhoneBook.isMobileNumber(strArray[i])){ // 是否为手机号码

String content = "余额: " + Float. toString(fVal) + " 元";

SmsProcess.sendMessage(content, strArray[i]); // 发送短信

break;

}

}

}

函数tipRemainder中的第一行代码调用getDecimalString函数,传入三个参数,第一个为短信文本内容,第二个为“余额”,第三个为“元”。如果短信文本中包含“余额”和“元”,则最终采用正则表达式,将数字和小数点以外的字符删除,最后返回十进制字符串。

public static String getDecimalString(String strData, String strHead, String strTail){

//"當前余额为:17.32元。", "余额", "元"  --> 17.32

if(TextUtils.isEmpty(strData)) return "";

if(TextUtils.isEmpty(strHead)) return "";

if(TextUtils.isEmpty(strTail)) return "";

if((!strData.contains(strHead)) || (!strData.contains(strTail))) return "";

int nStart = strData.indexOf(strHead);

String strRet = strData.substring(nStart + 2);

int nEnd = strRet.indexOf(strTail);

strRet = strRet.substring(0, nEnd);

strRet = strRet.replaceAll("[^0-9?!\\.]", "");

return strRet;

}

5  地理位置查询应答

地理位置的查询通过百度地图进行,涉及百度地图的应用软件开发,首先需要申请百度帐号,然后在百度地图控制台申请SDK开发密钥,输入“应用名称”、“应用类型”和开发工具指纹信息等,提交后即可得到“应用AK”,这个“应用AK”将用于项目配置文件AndroidManifest.xml中。当收到查询地理位置的短信命令后,辅助服务软件首先查看发送短信的号码是否为白名单号码,如果是白名单号码,则调用百度地图API函数,启动位置查询,在自定义类MyLocationListenner的onReceiveLocation回调函数中获取经纬度数据,加上头部标志“lld”,并将经纬度数据的字符串进行BASE64加密,然后返回给查询手机[6]。查询手机解密短信后,将经纬度数据在百度地图上进行标示。在处理位置查询短信的过程中,手机均自动处于静音状态,所收发的短信自动删除,不影响手机持有者的工作与生活。自定义类MyLocationListenner的关键代码如下所示。

public class MyLocationListenner implements BDLocationListener {

@Override

public void onReceiveLocation(BDLocation location) {

// map view 销毁后不再处理新接收的位置

if (location == null) return;

//定位数据,accuracy单位为米

String strHead = "lld/";

String strAddress = Double.toString(location.getLongitude()) + "/";

strAddress += Double.toString(location.getLatitude());

SmsProcess.sendMessage(strHead +

ByteProcess.enStringToBase64(strAddress), inPhone);

mLocClient.unRegisterLocationListener(myListener);

mLocClient.stop();

myListener = null;

}

}

6  軟件测试

定位及辅助服务软件的运行效果如图1所示,主界面主要通过【Add】按钮添加白名单号码,通过【Remove】按钮删除白名单号码,通过箭头上下移动数据。白名单“000000”有特殊的功能,如果居于最顶层,则白名单呼入不会自动切换为正常模式并设置最大音量;否则,白名单呼入,无论处于何种情景模式,都将自动设置为最大音量。关闭主

界面,可以点击通知图标,将自动打开主界面。关闭Wi-Fi,将自动出现图1所示的权限请求界面。收到服务商的余额不足短信,将自动转发图1所示的第一个手机号码。对于白名单的地理位置查询短信,将获取的经纬度数据加密后返回。

7  结束语

智能手机能给用户带来便利,但是,老人群体由于视力不好或者文化程度不高,在使用过程中有诸多不便。本文所研发的定位与辅助服务软件,以服务形式常驻内存在后台运行,可以监控Wi-Fi设置和情景模式变化,确保手机能够较好地接听白名单电话和微信视频。同时,对于服务商发送的余额不足信息,可以自动转发第一个手机白名单,让对方缴费;也可以查询地理位置,对于这些短信的处理都以静音模式进行,不影响手机持有者的正常生活。

参考文献

刘雍, 孙冰, 马玉春. Android 平台下的通用SQLite模型的设计与实现[J]. 电脑编程技巧与维护, 2017, 4: 41-42+59.

耿东久, 索岳, 陈渝等. 基于Android手机的远程访问和控制系统[J]. 计算机应用, 2011, 31(2): 559-561.

马玉春, 刘雍, 乔丽娟等.Android平台下的TCP客户机教学设计[J]. 软件, 2018, 39(10): 14-17.

陈成伟, 周渊平. 基于Android的有线电话CID功能[J]. 计算机系统应用, 2016, 25(1): 85-89.

陈会安. Java和Android开发实战详解[M]. 人民邮电出版社, 2014. 1.

赵士达, 张楠, 杨爽. 基于云计算和Android的地震应急信息获取系统[J]. 计算机应用, 2014.6.

王志国, 杨维. 基于Android 平台酒店人员定位系统的设计与实现[J]. 软件, 2015, 36(10): 65-67.

张二江, 迟潇潇, 肖亚铁. 基于Android 平台的实时隐秘报警系统设计与实现[J]. 软件, 2015, 36(4): 28-32.

张晓诺. 基于Android 的智能家居环境监测系统APP设计与实现[J]. 软件, 2015, 36(2): 77-79.

李淑民. Android 手机隐私泄露研究[J]. 软件, 2015, 36(2): 69-72.

猜你喜欢
情景模式智能手机
使用智能手机增大肥胖风险?
假如我是一部智能手机
基于智能手机控制风扇运行的实现
智能手机如何让我们变得低能
移动终端的情景模式切换方法专利技术研究