繫結sim卡,手機定位,鎖屏,解除安裝軟體
19.繫結sim卡
獲得sim卡的序列號需要用到電話管理器TelephonyManager,並用tm.getSimSerialNumber()方法得到sim卡號。此外還需要新增讀取手機狀態的許可權:READ_PHONE_STATE。
監聽手機重啟需要用廣播接收者,接收者關心的動作是:BOOT_COMPLETED。接收者需要新增的許可權是:RECEIVE_BOOT_COMPLETED。
20.手機定位
手機定位最好是後臺長期執行,所以要放到服務裡面。
實現手機定位需要用到系統的位置管理器LocationManager,通過getSystemService(Context.LOCATION_SERVICE)方法
手機定位的方法有三種:網路(network)、基站(passive)、GPS(gps)。網路是根據IP實現的定位。
實現手機定位需要新增許可權:ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION、ACCESS_MOCK_LOCATION。分別是精確的位置、模糊的位置、模擬的位置。
通過定位獲得的經緯度是準確的,但是由於中國所謂的考慮國家安全,對經緯度做了手腳(火星座標)之後才在地圖上顯示,這時顯示的結果當然就有偏差,為了消除偏差,在地圖上顯示之前,先將經緯度轉換一下。
轉換時,資料庫axisoffset.dat放到assets目錄下,ModifyOffset.java檔案跟服務在同一個包
下面程式碼寫在服務的onCreate();方法中:
<span style="font-size:18px;">lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); //得到一個定位標準的例項 Criteria criteria = new Criteria(); //設定精確度 criteria.setAccuracy(Criteria.ACCURACY_FINE); String provider = lm.getBestProvider(criteria, true);//獲得當前最好的定位方法 /** * 第一個引數provider 定位採取的方式 * 第二個引數minTime 更新位置最小間隔時間,單位是ms,做專案的話一般設為60000,這裡用0 * 第三個引數minDistance 更新位置最小間隔距離,單位是米,一般設為50米,這裡用0 * 第四個引數listener 位置監聽器,通過實現接口裡面的方法來做相應處理 */ lm.requestLocationUpdates(provider, 0, 0, new LocationListener() { //狀態改變(手機上GPS定位功能是否開啟)時呼叫此方法 @Override public void onStatusChanged(String provider, int status, Bundle extras) { } //某一種定位方法提供者可以使用時呼叫此方法 @Override public void onProviderEnabled(String provider) { } //某一種定位方法提供者不可用時呼叫此方法 @Override public void onProviderDisabled(String provider) { } //位置改變時呼叫此方法 @Override public void onLocationChanged(Location location) { //得到當前位置的經度 String longitude = "經度"+location.getLongitude(); //得到當前位置的緯度 String latitude = "緯度"+location.getLatitude(); //把標準的經緯度轉換成火星座標 try { InputStream is = getAssets().open("axisoffset.dat"); ModifyOffset offset = ModifyOffset.getInstance(is); PointDouble s2c = offset.s2c(new PointDouble(location.getLongitude(), location.getLatitude())); //火星座標的經緯度 longitude = "經度"+offset.X; latitude = "緯度"+offset.Y; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } //儲存經緯度 SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE); Editor editor = sp.edit(); editor.putString("lastlocation", longitude +","+ latitude); editor.commit(); } });</span>
21.一鍵鎖屏
一鍵鎖屏功能的實現需要用到系統的裝置策略管理器DevicePolicyManager。
跟其他系統的管理器一樣,也是通過getSystemService();方法來得到一個例項,然後直接呼叫dpm.lockNow();方法即可。另外,鎖屏時還可以設定解鎖密碼用dpm.resetPassword();方法。但是實現這個簡單的方法的背後,需要先做下面的準備工作:
步驟可以參考API-->Administration-->Device Policies寫:
首先,寫一個廣播接收者(如:MyAdminReceiver)繼承DeviceAdminReceiver(DeviceAdminReceiver繼承了BroadCastReceiver),由於是一個廣播接收者,所以需要在清單檔案中配置,配置的時候需要給receiver節點加上許可權:
android:permission="android.permission.BIND_DEVICE_ADMIN"
設定關心的動作為:DEVICE_ADMIN_ENABLED
另外,還需要配置下列資訊:
<span style="font-size:18px;"><receiver android:name="com.uc.mobilesafe.receiver.MyAdminReceiver"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data android:name="android.app.device_admin"
android:resource="@xml/device_admin_sample"/>
<intent-filter >
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED"/>
</intent-filter>
</receiver></span>
需要在res目錄下建立xml資料夾,再在xml資料夾下建立device_admin_sample.xml檔案,檔案內容是:
另外,實現一鍵鎖屏還需要開啟管理員:
1.建立一個意圖,新增裝置管理員
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
2.得到一個要啟用主鍵的例項,這裡啟用MyAdminReceiver
ComponentName cn = new ComponentName(context, MyAdminReceiver.class);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cn);
//勸說使用者開啟管理員許可權,可無
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "開啟管理員許可權就可以一鍵鎖屏!");
//開啟啟用管理員的介面
startActivity(intent);
判斷管理員是否已經啟用:
pdm.isAdminActive(cn)
開啟管理員許可權後,鎖屏功能就生效啦!
清除資料也是比較簡單的:
dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);
如果是dpm.wipeData(0);的話,是恢復出廠設定。
22.解除安裝軟體
解除安裝時需要先清除管理員許可權、然後就是普通應用的解除安裝了。
dpm.removeActiveAdmin(cn);
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"+getPackageName()));
startActivity(intent);