码迷,mamicode.com
首页 > 移动开发 > 详细

手机卫士04_ 手机定位_超级管理员_数据库

时间:2016-06-14 01:05:34      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

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”

 

手机卫士04_ 手机定位_超级管理员_数据库

标签:

原文地址:http://www.cnblogs.com/adventurer/p/5582564.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!