1.1 定位功能简介:
常见的定位方式:
①网络定位:(IP地址),拨号上网一般是动态分配,如果网吧公司,就是静态分配的.
比较有名的数据库:纯真Ip数据库,有很多公开的ip信息
根据ip地址定位.可能很准确,也可能只是一个大概的范围
②基站定位:必须有手机卡才能基站定位
根据手机与基站联系的信号强弱+算法定位.
定位效果:可能很准确,(与基站位置相关,周围基站越多越近效果越好.)
③GPS定位:采用卫星定位
利用卫星的位置与手机GPS模块的建立联系,通过算法判断位置.
至少需要三颗卫星,获取手机手机的位置.(头顶必须空旷,不然信号穿透效果很渣)
目前:agps模块,因为手机搜索卫星定位需要一定的时间,所以agps会先获取网络位置,大体的位置获取到了之后,再根据卫星定位获取详细位置.
精确度很高:五米-十米左右的范围.
1.2 获取手机的经纬度.
利用服务LocationManager lm = getSystemService(“LOCATION_SERVICE”);//位置管理服务
//面向对象的思想
List<String>lm.getAllproviders();//获取所有支持的位置信息,返回一个list集合
Passive;基站定位 gps:gps定位,真实手机还支持网络定位,wifi 定制
lm.requestLoactionUpdates(1,2,3,4)//请求位置的更新
1,provider 请求位置的方式:passive,gps,.....
2,minTime 请求的间隔 毫秒值
3,minDistance 请求位移的距离
4,listener 位置的提供者监听(带一些回调的方法)
4,实现LocationListener接口
重写的方法:
①onProviderEnabled //当位置提供者可用的时候
②onProviderDisabled //不可用的时候
③onStateChanged()//状态变化,可用>>不可用,不可用>>可用,当上面两个方法被调用,它就会被调用
④onLocationChanged(location)//当手机位置发生了变化就会被调用
location.getAccuracy()//获取定位精确度
location.getLatitude();//获取维度
location.getLongitude();//获取经度
额外:①ACCESS_FINE_LOCATION 权限//得到手机精准的位置
DDMS 可以设置模拟器的经纬度.
②注册了监听器之后要记得取消监听器,耗电很快的
onDestory() lm.removeUpdates(listener);
③如果GPS响应太慢,可以把距离大小,时间间隔设置为0,但是耗电更快
2 火星坐标系统
2.1 使用网站:map.baidu.com //百度把 WEB端的屏蔽掉了,手机端有
所以使用:ditu.google.cn可以直接搜索经纬度 //因确实挺
定位位置超出预期:火星坐标系统,对坐标进行了加密操作(国防安全防御系统)
错误的地图就对上错误的坐标,所以在国内地图没问题.而在国外的地图是不准确的.
一般导航软件都加入了国家保密算法,这样就可以跟导航电子地图匹配,不过这个保密算法是需要钱去买的,才能得到这一套COM接口.
地球坐标与火星坐标在网上已经有互换的算法了,可以通过这套api转换坐标.
个人小范围使用,最好不要在公开场合使用,会被查水表哦.
2.2 api:Modifyoffset.java(网上可以下到)
使用方式,拷贝该文件,创建它的对象(is)//需要一个输入流
//要把对应的数据库文件放到项目下
Mo.s2c(new PointDouble(经度,纬度))//standrad火星坐标>>实际坐标
3,手机防盗获取经纬度
①获取经纬度是一个耗时操作,但是广播接收者的生命周期比较短,所以需要开启一个后台的服务,在服务里获取手机的位置,这样即使应用被关闭了,在后台也能长期存在获取到位置信息,更符合要求.
分包:mobliesafe.service,创建服务,配置清单文件,服务是没有界面的
②在服务类中
定义一个LocationManager,并初始化, getSystemService(Location_SERVICE);
//获取所有的位置提供者lm.getAllProviders()//返回list集合
判断是否有GPS位置提供者.并且这个集合的长度大于0(防止空指针)
lm.requestLoctionUpdates(位置提供者,0,0,监听器)//请求间隔,位置间隔都为0
//自定义监听器类(方便关闭获取GPS信息)
③获取经纬度,在监听器中onLocationChanged()中参数Location.getLatitude()//获取.
保存在sp中
然后通过短信发送给安全号码
额外:发送短信之后,停止监听器,lm.removerUpdates(listenser);listener=null
停止服务stopSelf()//停止自身服务
权限:FINE_LOCATION,COARSE_LOCATION(大体位置)
④在接收指令的receiver中,开启该服务.
4,立刻清楚数据和远程锁屏操作
4.1 设备的超级管理员
查看api文档:Develop>>API Guides>>Administration>>Device Policies
作用:可以同步邮箱邮件应用,设置密码类型,远程删除数据,加密硬盘,禁用照相机,锁定设备,很多操作它都可以执行
4.2, 使用步骤:
①创建类,继承DeviceAdminReceiver.
②拷贝文档中的清单文件配置,需要更改的有receiver对应的全路径.
<receiver android:name=".app.DeviceAdminSample$DeviceAdminSampleReceiver"
android:label="@string/sample_device_admin"
android:description="@string/sample_device_admin_description"
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>
Label:用户可读的说明,任意字符串(例如:手机卫士管理员)
Description:对Label的详细说明.
<meta-data>//原数据节点,不要修改name属性
resource资源文件:声明所用的安全权限.
③拷贝文档中device-admin的权限代码,创建一个XML文件夹,然后再创建一个文件(Device_admin_simple)保存
<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>
额外:在系统设置中,安全>>设备管理器>>可以看到设备管理员,需要点击激活
4.3 远程锁屏和清楚数据的代码实现
//得到超级管理员管理器
DevicePolicyManager dpm = context.getSystemService(context.DEVICE_POLICY_SERVICE);
dpm.wipeData()//清楚数据,参数:WIPE_EXTERNAL_STORAGE//清楚外部内部所有.
0,只清除手机内部存储数据
//这个指令模拟器并不支持,有效果,但无作用,真实手机不要随便尝试
dpm.resetPassword(“密码”,0);//设置锁屏密码
dpm.lockNow()//立刻锁定屏幕
//记得最后把短信截取掉abortBroadCast();
5.一键锁屏应用:点击应用之后,手机就锁屏了
①点击应用就锁屏,可以通过onCreate()方法实现 ,这里用一个按钮去实现
DevicePolicyManager dpm = getSystemService(DEVICE_POLICY_RECEIVER);
Dpm.locknow();//立即锁屏
直接运行会提示:缺少超级管理员组件No active admin owned byXXX
②创建特殊的广播接收者
③配置清单文件,拷贝对应的receiver节点,修改需要修改的属性.
④拷贝权限文件,为了以防万一,不引起用户警惕,只保留force-lock标签锁屏.
额外,①需要先激活设备超级管理员(在应用里)
②一旦这个应用激活了超级管理员就不能被卸载和清除了.
卸载步骤:取消超级管理员,取消激活即可.
5.2,锁屏应用的优化:用户可能没激活应用,也可能不会取消
①执行dpm.locknow()之前判断一下是否激活了超级管理员权限
dpm.isAdminActive(who);//哪一个组件被激活了权限,返回 boolean
ComponentName who = new ComponentName(this,MyAdmin.class);
②判断是否激活了权限,并提示用户需要激活
③担心用户不知道怎么激活权限,再创建一个按钮,打开设备管理员的激活页面.
帮助文档里有Enabling the application(在超级管理员页面中)//启动超级管理页面.
下面有一段实例代码,复制即可.修改一些参数即可(激活的组件who,描述文本)
④添加一个卸载按钮帮助用户卸载
取消设备激活超级管理员:获取dpm
dpm.removeActivityAdmin(who);//取消对应组件的超级管理员
卸载当前应用:
创建意图对象,复制上层源码的packageInStaller清单文件中uninstallerativty对应的意图过滤器
注意:intent.setData(Uri.parse(“package:” + 包名(getPackageName())))
5.3 手机防盗的细节处理
5.3.1防盗界面的密码加密:md5加密解释
MessageDigest digest = MessageDigest.getInStance(“md5”);//md5是不可逆的
Md5是数字的hash摘要算法,原文>>>密文,密文XXX原文
Byte[] result = Digest.digest(byte[]);
遍历result,把每个byte转换成16进制数;
byte b ,
Int a =b&0xff 转换成int数//ff是 二进制11111111,10进制的255
Intent.toHexString(转换后的数)
然后用StringBuffer把这个byte转换的int数给拼接出来
网上的破解MD5,实际上是把大量的数据进行MD5加密之后保存在数据库,用户将查询的MD5加密串输入进去,会匹配存在的MD5串,匹配到就显示原字符串(本质还是不可逆的)
//一般向银行会对密码进行10-20次重复加密,这样得出的md5更是无法查询到了
//也可以在转换的时候b&0XFF + XX数,俗称加盐,这样也是无法查询到的
5.3.2 抽取成一个工具类,在保存密码的时候通过md5加密即可.比对密码的时候也进行加密后的字符串进行比较
6,骚扰拦截模块
业务需求:不想接收某个人的短信或电话,添加进黑名单,然后这个短信和电话就会被拦截了.以后接收到这个信息就不会再提醒了.
6.1 创建骚扰拦截的界面activity,配置清单文件,创建布局文件
6.2 标题,黑名单列表,添加按钮(右上角,设置状态选择器)
考虑到黑名单列表可能比较多,不适合放到SharedPreferences里,放到数据库里.
6.3 黑名单数据库
表字段:id标志,姓名,号码,拦截模式(手机0,短信1,两者都拦截2);
创建db包
①开启帮助类,继承父类构造,super(上下文,表名称,游标工厂,版本号)
onCreate()里定义表的SQL语句,db.execSQL(XXXX);
_id integer primary key autoincrement,主键自增长
②数据库的DAO包,实现具体的业务逻辑
在构造方法里就初始化openHelper,传入上下文
增删改查,修改的时候只需要修改拦截模式就行,因为号码输错了一般人都会删掉.
查询实际上也只是查询拦截模式而已.
6.4 单元测试 数据库增删改查
①创建一个类继承 AndroidTestCast,所有的测试逻辑都应该向测试框架抛出异常
需要上下文就getContext()
②配置清单文件,
指令集<Instumenttation>配置name,targetpackage测试的包.
Application中配置标签,导入需要的jar包,use-library
7.黑名单号码添加界面
点击添加按钮,应该就跳转到黑名单号码的添加页面
要带有返回值startActivityForResult(intent);
额外:一键锁屏的两个界面
添加两个Activity主入口就可以了
但是需要给另一个界面单独开启进程
在activity中 属性
process = “:process.sub”
启动模式:launchMode = “singleInstance”