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