Android - 定位方式,火星坐标系统,一键锁屏,MD5加密,骚扰拦截,黑名单数据库,增删改查单元测试

xiaoxiao2021-02-27  232

转载请注明出处:https://blog.csdn.net/mythmayor/article/details/72878192

1.定位方式

1.网络定位 (ip地址) 根据ip地址定位,如果是静态ip很准确,如果是动态ip是一个大概的范围 2.基站定位 根据附近的基站数量来决定定位的精度,附近基站越多定位越准确 3.GPS定位 通过三颗以上的卫星获取手机的位置(头顶必须空旷) AGPS,利用网络进行大致定位,利用卫星进行修正定位

2.获取手机经纬度

1.添加权限 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 2.获取系统服务LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE); 3.请求位置数据 lm.requestLocationUpdates("gps", 60*1000, 100, locationListener); 4.不用的时候注销掉监听器 lm.removeUpdates(locationListener); locationListener = null;

3.位置监听器

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:name="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而言,有两个特性是很重要的,第一:明文数据经过散列以后的值是定长的;第二:是任意一段明文数据,经过散列以后,其结果必须永远是不变的。前者的意思是可能存在有两段明文散列以后得到相同的结果,后者的意思是如果我们散列特定的数据,得到的结果一定是相同的。

12.骚扰拦截需求分析

1.界面 1.1 黑名单列表界面 1.2 添加黑名单界面 2.功能 2.1 黑名单的添加、删除 2.2 拦截电话 2.3 拦截短信

13.黑名单数据库的创建

1.分析需要的字段 id 主键自增长,phone 电话号码,mode 拦截模式 2.创建数据库打开类BlackNumberDBOpenHelper,继承SQLiteOpenHelper public class BlackNumberDBOpenHelper extends SQLiteOpenHelper { public BlackNumberDBOpenHelper(Context context) { super(context, "mythmayor.db", null, 1); } //数据库第一次被创建的时候调用,适合初始化数据库的表结构 @Override public void onCreate(SQLiteDatabase db) { //id 主键自增长, phone 电话号码 mode 拦截模式 db.execSQL("create table blacknumber (_id integer primary key autoincrement, phone varchar(20),mode varchar(2))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } 3.创建数据库数据操作类BlackNumberDao,实现增删改查方法

14.增删改查单元测试

1.创建测试类TestBlackNumberDao,继承AndroidTestCase,测试增删改查方法 2.在清单文件中对测试类进行如下配置: 2.1 manifest节点下添加 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.mythmayor.project" > </instrumentation> 2.2 application节点下添加 <uses-library android:name="android.test.runner"/>
转载请注明原文地址: https://www.6miu.com/read-9030.html

最新回复(0)