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

本文详细介绍手机定位技术,包括网络定位、基站定位及GPS定位等,并深入解析位置监听器的实现方法。此外,还介绍了如何创建黑名单数据库,实现电话与短信的拦截功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明出处:https://blog.youkuaiyun.com/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. 是一种国家保密插件,其实就是对真实坐标系统进行人为的加偏处理,按照特殊的算法,将真实的坐标加密成虚假的坐标,而这个加偏并不是线性的加偏,所以各地的偏移情况都会有所不同。而加密后的坐标也常被人称为火星坐标系统。
  2. 火星坐标的转化

    //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"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值