1. 程式人生 > >繫結sim卡,手機定位,鎖屏,解除安裝軟體

繫結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);