Android - 定位方式,火星坐标系统,一键锁屏,字节 Android 高工面试
private class MyLocationListener implements LocationListener{
//位置发生变化的时候
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
location.getLatitude(); //维度
location.getLongitude(); //经度
}
//当位置提供者状态发生变化的时候,可用-->不可用,不可用-->可用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//当位置提供者可用的时候
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
//当位置提供者不可用的时候
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
4.火星坐标系统
是一种国家保密插件,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
火星坐标的转化
//1.获取数据输入流
File file = new File("axisoffset.dat");
FileInputStream is = new FileInputStream(file);
//2.获取 ModifyOffset 实例
ModifyOffset mo = ModifyOffset.getInstance(is);
//3.转化为火星坐标,standard-->China
PointDouble result = mo.s2c(new PointDouble(113.9083f, 22.5854f));
5.获取手机位置功能所需知识点
1.获取手机经纬度
2.转化为火星坐标
3.由于获取经纬度是耗时任务,在 Service 中来获取
6.在服务中停掉自己
1.调用 stopSelf()方法
7.创建设备管理员的步骤
1.新建一个类,继承 DeviceAdminReceiver
public class MyAdmin extends DeviceAdminReceiver {
}
2.在清单文件中进行配置
<receiver
android:n
ame="com.mythmayor.project.ui.receiver.MyAdmin" //广播接收者的全类名
android:description="@string/sample_device_admin_description" //描述
android:label="@string/sample_device_admin" //标签
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>
3.android:name 处填入广播接收者的全类名
4.新建 label 和 description 对应的字符串,声明标签和描述的内容
5.新建 device_admin_sample.xml 文件,声明要使用的管理员权限
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password /> //设置密码规则
<watch-login /> //监视屏幕解锁尝试次数
<reset-password /> //更改屏幕解锁密码
<force-lock /> //锁定屏幕
<wipe-data /> //清除所有数据
<expire-password /> //设置锁定屏幕密码的有效期
<encrypted-storage /> //设置存储设备加密
<disable-camera /> //停用相机
</uses-policies>
</device-admin>
8.清除数据
1.拿到设备策略管理器
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
2.调用 wipeData 方法
dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);
9.设置密码并锁屏
1.拿到设备策略管理器
DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
2.设置密码调用 resetPassword 方法
dpm.resetPassword("123", 0);
3.锁屏调用 lockNow 方法
dpm.lockNow();
10.一键锁屏应用的问题
1.没有激活设备管理员,导致锁屏功能不能用
2.激活了设备管理员,导致不能卸载
10.一键锁屏的优化
1.如果未激活设备管理员权限,用代码打开设备管理员激活界面
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
ComponentName who = new ComponentName(this, MyAdmin.class);
if (dpm.isAdminActive(who)) {
dpm.lockNow();
} else {
Toast.makeText(this, "请先激活超级管理员", 0).show();
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN,who);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
"请开启管理员权限,开启后可以锁屏,不装扣 500 块钱");
startActivity(intent);
}
2.要卸载具有设备管理员权限的应用,要首先将其设别管理员权限取消,然后在进行卸载
//取消设备管理员权限
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);
ComponentName who = new ComponentName(this, MyAdmin.class);
dpm.removeActiveAdmin(who);
//卸载当前应用
Intent intent = new Intent();
intent.setAction("android.intent.action.DELETE");
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"+getPackageName()));
startActivity(intent);
11.MD5 加密
1.获取 MessageDigest 实例
MessageDigest digest = MessageDigest.getInstance("md5");
2.使用 digest 获取加密后的 byte 数组
byte[] result = digest.digest(password.getBytes());
3.将加密后的 byte 数组转化为定长的 16 进制字符串
StringBuilder sb = new StringBuilder();
for(byte b : result){
int number = b&0xff-3;//加盐
String str = Integer.toHexString(number);
if(str.length()==1){
sb.append("0");
}
sb.append(str);
}
return sb.toString();
MD5 的全称是 Message-Digest Algorithm 5(信息-摘要算法),在 90 年代初由 MIT Laboratory for Computer Science 和 RSA Data Security Inc 的 Ronald L. Rivest 开发出来,经 MD2、MD3 和 MD4 发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。
MD5 是哈希散列算法,对于 MD5 而言,有两个特性是很重要的,第一:明文数据经过散列以后的值是定长的;第二:是任意一段明文数据,经过散列以后,其结果必须永远是不变的。前者的意思是可能存在有两段明文散列以后得到相同的结果,后者的意思是如果我们散列特定的数据,得到的结果一定是相同的。
评论