馬玉春 吳淑婷 汪文彬 孫冰
摘 ?要: 老人在使用智能手機(jī)的過程中,常常由于誤操作而將手機(jī)設(shè)置為靜音模式,或者關(guān)閉Wi-Fi,導(dǎo)致接聽來電和微信視頻受到影響。本文實(shí)現(xiàn)了白名單自動開啟手機(jī)正常情景模式,監(jiān)測Wi-Fi狀態(tài)并提醒用戶開啟,還可以無干擾查詢地理位置及將余額不足信息發(fā)送到白名單手機(jī)中,協(xié)助老人無障礙使用智能手機(jī)。
關(guān)鍵詞:?智能手機(jī);情景模式;位置查詢;輔助服務(wù)
中圖分類號:?TP311.52????文獻(xiàn)標(biāo)識碼:?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??引言
智能手機(jī)可以用于語音通話,也可用于數(shù)據(jù)傳輸,特別是常用的定位與微信視頻,因而,便于子女掌握老人的地理位置,通過視頻聊天慰藉老人。但是,老人由于誤操作,經(jīng)常會將手機(jī)設(shè)置為靜音模式,導(dǎo)致呼入電話無反應(yīng);或者關(guān)閉Wi-Fi,導(dǎo)致微信視頻呼叫不成功。如果手機(jī)欠費(fèi),則更是失去所有功能。這些不足,老人由于視力不好或者文化程度不高,難以自行解決。本文通過多項(xiàng)廣播接收器解決以上問題,并將軟件以服務(wù)形式常駐內(nèi)存,對手機(jī)進(jìn)行監(jiān)控。
1 ?主窗體功能及服務(wù)的實(shí)現(xiàn)
定位及輔助服務(wù)軟件的主要功能在后臺完成,實(shí)現(xiàn)對手機(jī)的監(jiān)控。前臺主要由一個主窗體完成,實(shí)現(xiàn)白名單的添加、刪除、備份與恢復(fù)。在完成后臺功能時,需要查看對比這些白名單以便做出決策:只有白名單電話呼入才能自動將靜音或振動模式切換為正常模式并將音量設(shè)置為最大,白名單短信查詢位置才會給予回復(fù)。白名單僅以電話號碼表示,通過自定義ListView組件進(jìn)行顯示,可以手動調(diào)整順序,當(dāng)收到服務(wù)商發(fā)送的手機(jī)余額不足短信時,該信息將發(fā)送給第一條手機(jī)號碼的白名單[1]。白名單中的數(shù)據(jù),通過多線程技術(shù)調(diào)用FileOutputStream對象寫入外部文本文件,從而復(fù)制到外部存儲器保存;也可以調(diào)用FileInputStream對象從外部存儲器中恢復(fù)數(shù)據(jù),便于換機(jī)操作。
當(dāng)系統(tǒng)資源減少,為了保障擁有用戶焦點(diǎn)的應(yīng)用程序正常運(yùn)行,Android系統(tǒng)會強(qiáng)行終止一個服務(wù)。如果服務(wù)被擁有用戶焦點(diǎn)的Activity綁定著,則它一般不會被強(qiáng)行終止。如果服務(wù)聲明為“在前臺運(yùn)行服務(wù)”,則它幾乎不會被終止。否則,如果服務(wù)已被啟動并且已運(yùn)行了很長時間,那么系統(tǒng)將會隨著時間的推移而降低它在后臺任務(wù)列表中的級別,此類服務(wù)將很有可能會被強(qiáng)行終止[2]。啟動服務(wù)可以在主窗體中進(jìn)行,也可以在開機(jī)完成廣播接收器中進(jìn)行。在服務(wù)代碼的onCreate方法中,獲得時間戳strDate,然后調(diào)用系統(tǒng)方法startForeground顯示服務(wù)通知欄圖標(biāo),以時間戳作為圖標(biāo)內(nèi)容,其代碼如下所示:
public void onCreate() {
super.onCreate();
Calendar cl = Calendar.getInstance();
Date dt = cl.getTime();
String strDate = dt.toString();
startForeground(FOREGROUND_ID,
buildForegroundNotification?(strDate));
}
自定義函數(shù)buildForegroundNotification用來構(gòu)建通知欄圖標(biāo),返回一個Notification的對象notify。PendingIntent對象pi指向主窗體MainActivity,通過調(diào)用notify的setContentIntent方法并傳入該pi對象,即可通過點(diǎn)擊通知圖標(biāo)打開主窗體;方法setOngoing中傳入true,表示有正在執(zhí)行的后臺任務(wù);方法setPriority中傳入?yún)?shù)Notification.?PRIORITY_MAX,使得該圖標(biāo)被置于最前列。
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設(shè)置變化的監(jiān)控
為了對Wi-Fi狀態(tài)進(jìn)行監(jiān)控,需要在配置文件中聲明ACCESS_NETWORK_STATE和ACCESS_WIFI_STATE權(quán)限,并用自定義廣播接收器WiFiChangeReceiver進(jìn)行監(jiān)控[3]。通過系統(tǒng)方法getSystemService獲得WifiManager對象,從而調(diào)用getWifiState方法獲取Wi-Fi的狀態(tài),如果為WIFI_STATE_DISABLED狀態(tài),則調(diào)用WifiManager對象的setWifiEnabled(true)方法打開Wi-Fi開關(guān)。低版本的Android系統(tǒng)可以直接被打開,高版本的Android系統(tǒng)仍然需要用戶授權(quán)。監(jiān)控Wi-Fi設(shè)置的廣播接收器WiFiChangeReceiver的關(guān)鍵源代碼如下所示。
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??通話狀態(tài)監(jiān)控
在配置文件中聲明READ_PHONE_STATE權(quán)限,并實(shí)現(xiàn)自定義廣播接收器PhoneStateReceiver,當(dāng)狀態(tài)內(nèi)容為EXTRA_STATE_RINGING,即有電話呼入時,獲取電話號碼,存入inPhone,如果電話號碼為空值(即匿名電話)則直接返回[4]。如果電話號碼不在白名單集合strPhoneSet中,或者白名單集合以“000000”開頭,則不予處理,否則,將情景模式設(shè)置為RINGER_MODE_NORMAL(正常)模式,并將鈴音設(shè)置為最大。這里,白名單電話號碼“000000”有特殊功能,當(dāng)該號碼在主窗體中移到最前面,表示軟件不開啟白名單呼入電話自動切換至正常模式,同時設(shè)置最大音量。
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); // 設(shè)置最大音量
}
}
4??余額不足短信的獲取與轉(zhuǎn)發(fā)
當(dāng)收到“100”開頭的移動服務(wù)提供商發(fā)送的短信,就提取短信文本內(nèi)容,以此為參數(shù)調(diào)用tipRemainder函數(shù),抽取“余額”與“元”之間的浮點(diǎn)數(shù),如果該值大于給定的最小值(比如20元),則返回;否則將白名單集合strPhoneSet轉(zhuǎn)換為字符串?dāng)?shù)組,從第一個開始逐個比對,將余額不足短信發(fā)送到第一個白名單手機(jī)號碼[5]。自定義函數(shù)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])){ // 是否為手機(jī)號碼 String content = "余額: " + Float.?toString(fVal) + " 元"; SmsProcess.sendMessage(content, strArray[i]); // 發(fā)送短信 break; } } } 函數(shù)tipRemainder中的第一行代碼調(diào)用getDecimalString函數(shù),傳入三個參數(shù),第一個為短信文本內(nèi)容,第二個為“余額”,第三個為“元”。如果短信文本中包含“余額”和“元”,則最終采用正則表達(dá)式,將數(shù)字和小數(shù)點(diǎn)以外的字符刪除,最后返回十進(jìn)制字符串。 public static String getDecimalString(String strData, String strHead, String strTail){ //"當(dāng)前余額為: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??地理位置查詢應(yīng)答 地理位置的查詢通過百度地圖進(jìn)行,涉及百度地圖的應(yīng)用軟件開發(fā),首先需要申請百度帳號,然后在百度地圖控制臺申請SDK開發(fā)密鑰,輸入“應(yīng)用名稱”、“應(yīng)用類型”和開發(fā)工具指紋信息等,提交后即可得到“應(yīng)用AK”,這個“應(yīng)用AK”將用于項(xiàng)目配置文件AndroidManifest.xml中。當(dāng)收到查詢地理位置的短信命令后,輔助服務(wù)軟件首先查看發(fā)送短信的號碼是否為白名單號碼,如果是白名單號碼,則調(diào)用百度地圖API函數(shù),啟動位置查詢,在自定義類MyLocationListenner的onReceiveLocation回調(diào)函數(shù)中獲取經(jīng)緯度數(shù)據(jù),加上頭部標(biāo)志“l(fā)ld”,并將經(jīng)緯度數(shù)據(jù)的字符串進(jìn)行BASE64加密,然后返回給查詢手機(jī)[6]。查詢手機(jī)解密短信后,將經(jīng)緯度數(shù)據(jù)在百度地圖上進(jìn)行標(biāo)示。在處理位置查詢短信的過程中,手機(jī)均自動處于靜音狀態(tài),所收發(fā)的短信自動刪除,不影響手機(jī)持有者的工作與生活。自定義類MyLocationListenner的關(guān)鍵代碼如下所示。 public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 銷毀后不再處理新接收的位置 if (location == null) return; //定位數(shù)據(jù),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 ?軟件測試 定位及輔助服務(wù)軟件的運(yùn)行效果如圖1所示,主界面主要通過【Add】按鈕添加白名單號碼,通過【Remove】按鈕刪除白名單號碼,通過箭頭上下移動數(shù)據(jù)。白名單“000000”有特殊的功能,如果居于最頂層,則白名單呼入不會自動切換為正常模式并設(shè)置最大音量;否則,白名單呼入,無論處于何種情景模式,都將自動設(shè)置為最大音量。關(guān)閉主 界面,可以點(diǎn)擊通知圖標(biāo),將自動打開主界面。關(guān)閉Wi-Fi,將自動出現(xiàn)圖1所示的權(quán)限請求界面。收到服務(wù)商的余額不足短信,將自動轉(zhuǎn)發(fā)圖1所示的第一個手機(jī)號碼。對于白名單的地理位置查詢短信,將獲取的經(jīng)緯度數(shù)據(jù)加密后返回。 7 ?結(jié)束語 智能手機(jī)能給用戶帶來便利,但是,老人群體由于視力不好或者文化程度不高,在使用過程中有諸多不便。本文所研發(fā)的定位與輔助服務(wù)軟件,以服務(wù)形式常駐內(nèi)存在后臺運(yùn)行,可以監(jiān)控Wi-Fi設(shè)置和情景模式變化,確保手機(jī)能夠較好地接聽白名單電話和微信視頻。同時,對于服務(wù)商發(fā)送的余額不足信息,可以自動轉(zhuǎn)發(fā)第一個手機(jī)白名單,讓對方繳費(fèi);也可以查詢地理位置,對于這些短信的處理都以靜音模式進(jìn)行,不影響手機(jī)持有者的正常生活。 參考文獻(xiàn) 劉雍, 孫冰, 馬玉春. Android 平臺下的通用SQLite模型的設(shè)計與實(shí)現(xiàn)[J].?電腦編程技巧與維護(hù), 2017, 4:?41-42+59. 耿東久, 索岳, 陳渝等. 基于Android手機(jī)的遠(yuǎn)程訪問和控制系統(tǒng)[J].?計算機(jī)應(yīng)用, 2011, 31(2): 559-561. 馬玉春, 劉雍, 喬麗娟等.Android平臺下的TCP客戶機(jī)教學(xué)設(shè)計[J].?軟件, 2018, 39(10):?14-17. 陳成偉, 周淵平. 基于Android的有線電話CID功能[J].?計算機(jī)系統(tǒng)應(yīng)用, 2016, 25(1):?85-89. 陳會安. Java和Android開發(fā)實(shí)戰(zhàn)詳解[M].?人民郵電出版社,?2014.?1. 趙士達(dá), 張楠, 楊爽. 基于云計算和Android的地震應(yīng)急信息獲取系統(tǒng)[J].?計算機(jī)應(yīng)用, 2014.6. 王志國, 楊維. 基于Android 平臺酒店人員定位系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].?軟件, 2015, 36(10): 65-67. 張二江, 遲瀟瀟, 肖亞鐵. 基于Android 平臺的實(shí)時隱秘報警系統(tǒng)設(shè)計與實(shí)現(xiàn)[J]. 軟件, 2015, 36(4): 28-32. 張曉諾. 基于Android 的智能家居環(huán)境監(jiān)測系統(tǒng)APP設(shè)計與實(shí)現(xiàn)[J]. 軟件, 2015, 36(2): 77-79. 李淑民. Android 手機(jī)隱私泄露研究[J]. 軟件, 2015, 36(2): 69-72.