绑定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);

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值