安卓手机卫士第五天(手机定位,设备管理器,电话归属地)


  • 手机定位

    • 网络定位

      根据IP显示具体的位置, 原理是建立一个库那个IP地址对应那个地方;早期警方破案就采用此特点;纯真IP数据库软件介绍有局限性:针对固定的IP地址。
      如果手机网或者ip地址是动态分布IP,这个偏差就很大。这种情况是无法满足需求的。
      
    • 基站定位

      工作原理:手机能打电话,是需要基站的。手机定位也是用基站的。
      手机附近能收到3个基站的信号,就可以定位了。
      基站定位有可能很准确,比如基站多的地方;
      如果基站少的话就会相差很大。
      精确度:几十米到几公里不等;
      
    • GPS定位

      至少需要3颗卫星;
      特点是:需要搜索卫星, 头顶必须是空旷的;
      影响条件:云层、建筑、大树。卫星:美国人、欧洲人的卫星。
      北斗:中国的,但没有民用,只是在大巴,战机等使用。A-GPS: 通过GPS和网络共同定位,弥补GPS的不足, 精确度可达到15米以内, 一般手机都采用此种定位方式
      
  • 定位Demo演示

    lm = (LocationManager) getSystemService(LOCATION_SERVICE);//获取系统位置服务
    List<String> allProviders = lm.getAllProviders();//获取所有位置提供者listener = new MyLocationListener();//位置监听器
    lm.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0,listener);//更新位置, 参2和参3设置为0,表示只要位置有变化就立即更新class MyLocationListener implements LocationListener {//位置发生变化
    @Override
    public void onLocationChanged(Location location) {System.out.println("onLocationChanged");String longitude = "经度:" + location.getLongitude();String latitude = "纬度:" + location.getLatitude();String accuracy = "精确度:" + location.getAccuracy();String altitude = "海拔:" + location.getAltitude();tvLocation.setText(longitude + "\n" + latitude + "\n" + accuracy+ "\n" + altitude);
    }//位置提供者的状态发生变化
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {System.out.println("onStatusChanged");
    }//位置提供者可用
    @Override
    public void onProviderEnabled(String provider) {System.out.println("onProviderEnabled");
    }//位置提供者不可用
    @Override
    public void onProviderDisabled(String provider) {System.out.println("onProviderDisabled");
    }}@Override
    protected void onDestroy() {super.onDestroy();lm.removeUpdates(listener);//为了节省性能,当页面销毁时,删除位置更新的服务listener = null;
    }需要权限:
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>//获取准确GPS坐标的权限
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>//允许模拟器模拟位置坐标的权限
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>//获取粗略坐标的权限(网络定位时使用)
    
  • 火星坐标

    获取到坐标后在谷歌地图上查询,发现坐标有所偏移, 不准确.这是因为中国的地图服务,为了国家安全, 坐标数据都经过了政府加偏处理, 加偏处理后的坐标被称为火星坐标.技术牛人通过对美国地图和中国地图的比对,生成了一个查询数据库, 专门用与标准坐标和火星坐标的转换.导入数据库文件axisoffset.dat和工具类ModifyOffset.java,创建一个java工程进行演示public static void main(String[] args) {try {ModifyOffset offset = ModifyOffset.getInstance(Demo.class.getResourceAsStream("axisoffset.dat"));//加载数据库文件PointDouble s2c = offset.s2c(new PointDouble(116.2821962,40.0408444));//标准坐标转为火星坐标System.out.println(s2c);} catch (Exception e) {e.printStackTrace();}
    }
    
  • 开启服务,动态存储最新的坐标

    LocationServicepublic void onCreate() {lm = (LocationManager) getSystemService(LOCATION_SERVICE);// 获取系统位置服务Criteria criteria = new Criteria();criteria.setAccuracy(Criteria.ACCURACY_FINE);// 准确度良好criteria.setCostAllowed(true);// 是否允许花费(比如网络定位)String bestProvider = lm.getBestProvider(criteria, true);// 获取当前最好的位置提供者System.out.println("位置提供者:" + bestProvider);listener = new MyLocationListener();// 位置监听器lm.requestLocationUpdates(bestProvider, 0, 0, listener);// 更新位置,// 参2和参3        设置为0,表示只要位置有变化就立即更新
    };// 位置发生变化
    @Override
    public void onLocationChanged(Location location) {String longitude = "j:" + location.getLongitude() + "\n";String latitude = "w:" + location.getLatitude() + "\n";String accuracy = "a:" + location.getAccuracy() + "\n";// 保存经纬度信息SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);sp.edit().putString("last_location", longitude + latitude + accuracy).commit();stopSelf();// 停止位置服务
    }----------------------------------SmsReceiverif ("#*location*#".equals(body)) {System.out.println("获取手机地理位置");context.startService(new Intent(context, LocationService.class));// 开启位置服务SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);String location = sp.getString("last_location", null);String reply = location;if (TextUtils.isEmpty(reply)) {reply = "getting location...";}SmsManager.getDefault().sendTextMessage(address, null, reply,null, null);abortBroadcast();// 中断广播的传递
    }
    

    注意添加权限!

    项目演示

    开启两个模拟器,发送短信#location#,查看是否可以收到经纬度的短信.第一次发送时,sp中没有保存,返回的是”getting location…”, 为了保证模拟器能更新sp,需要在控制台发送模拟的经纬度信息. LocationService启动后获取经纬度,一旦获取成功,马上停止服务,这样可以节省耗电量. 演示服务开启和结束的场景.

  • 超级管理员

Administration官方文档介绍: http://developer.android.com/guide/topics/admin/device-admin.html

网站推荐: http://www.androiddevtools.cn/ 查看中文文档

应用: 锁屏, 清除系统数据

ApiDemo中的案例演示

配置超级管理员步骤:
1. 自定义Receiver,继承DeviceAdminReceiver
2. 配置manifest<receiverandroid:name=".AdminReceiver"android:description="@string/sample_device_admin_description"android:label="@string/sample_device_admin"android:permission="android.permission.BIND_DEVICE_ADMIN" ><meta-dataandroid: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. 添加配置文件@xml/device_admin_sample
4. 获取DevicePolicyManagermDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE)5. 一键锁屏mDPM.lockNow();//锁屏mDPM.resetPassword("123", 0);//设置锁屏密码注意: 必须先打开设置->安全->设备管理器的权限,否则运行崩溃6. 通过代码打开超级管理员权限public void openAdmin(View view) {Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);ComponentName component = new ComponentName(this, AdminReceiver.class); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, component);intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,"打开超级管理员权限,可以一键锁屏,删除数据等");startActivity(intent);}7. 验证是否已经激活设备管理员ComponentName component = new ComponentName(this, AdminReceiver.class);if (mDPM.isAdminActive(component)) {}8. 桌面应用,一键锁屏, 应用市场搜索
9. 如何卸载应用public void uninstall(View view) {ComponentName component = new ComponentName(this, AdminReceiver.class); mDPM.removeActiveAdmin(component);//删除超级管理权限//跳转到卸载页面Intent intent = new Intent(Intent.ACTION_VIEW);intent.addCategory(Intent.CATEGORY_DEFAULT);intent.setData(Uri.parse("package:" + getPackageName()));startActivity(intent);}10. 清除数据//mDPM.wipeData(0);//恢复出厂设置//mDPM.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);//清除sdcard内容

高级工具

    AToolsActivity布局文件:<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/button"android:drawableLeft="@android:drawable/ic_menu_camera"android:drawablePadding="5dp"android:gravity="center_vertical"android:onClick="numberAddressQuery"android:padding="5dp"android:clickable="true"android:text="电话归属地查询" ></TextView>
  • 号码归属地查询

    NumberAddressActivity
    
    • 原理分析

      • 网络查询(百度搜索手机归属地查询)
      • 数据库查询(数据库可以从网上下载,也可从网络购买)
    • sqlite导入本地数据库

      • 原始数据库, 有很多地名重复,可以进一步优化

         将地名和卡类型的数据单独导入一张表中, 再将手机号前缀导入另外一张表,通过外键查询,数据量大大减小select area,city,cardtype from info group by area,city,cardtype
        
      • 小米数据库

        1. 根据号码前7位查询外键select outkey from data1 where id="1861094"
        2. 根据外键查询位置信息select area,location from data2 where id=91
        3. 组合查询,直接根据号码前7位查询位置信息select area,location from data2 where id=(select outkey from data1 where id="1861094")
        
  • 拷贝数据库

    SQLiteDatabase不支持直接从assets读取文件,所以要提前拷贝数据库

    NumberAddressDaopublic static final String PATH = "data/data/com.itheima.mobilesafeteach/files/address.db";SQLiteDatabase db = SQLiteDatabase.openDatabase(PATH, null,SQLiteDatabase.OPEN_READONLY);---------------------------------SplashActivity更新版本前,先拷贝数据库address.db
    /*** 拷贝数据库*/
    private void copyDB(String dbName) {File file = new File(getFilesDir(), dbName);// 目的文件if (file.exists()) {System.out.println("数据库" + dbName + "已存在,无须拷贝!");return;}FileOutputStream out = null;InputStream in = null;try {out = new FileOutputStream(file);in = getAssets().open(dbName);// 源文件int len = 0;byte[] buffer = new byte[1024];while ((len = in.read(buffer)) > 0) {out.write(buffer, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {try {out.close();in.close();} catch (Exception e) {e.printStackTrace();}}
    }
    
  • 查询数据库

    Cursor cursor = db.rawQuery("select location from data2 where id=(select outkey from data1 where id=?)",new String[] { number.substring(0, 7) });if (cursor != null) {if (cursor.moveToNext()) {address = cursor.getString(0);System.out.println("address:" + address);}cursor.close();}
    
  • 号码合法性判断

正则表达式

手机号: “^1[345678]\d{9}"; 数字: "^\\d+ "; 数字: "^\\d+ "; 数字: "^\\d+”

- 特殊号码判断switch (number.length()) {case 3:// 匪警电话 ,110,120等address = "报警电话";break;case 4:// 模拟器电话,5554,5556address = "模拟器";break;case 5:// 客服电话,95555address = "客服电话";break;case 7:case 8:// 本地电话address = "本地电话";break;- 座机判断if (number.startsWith("0") && number.length() > 10) {// 座机号码Cursor cursor = db.rawQuery("select location from data2 where area=?",new String[] { number.substring(1, 4) });if (cursor.moveToNext()) {// 先查询前4位address = cursor.getString(0);}cursor.close();if (TextUtils.isEmpty(address)) {// 如果前4位没有数据,就查询前3位cursor = db.rawQuery("select location from data2 where area=?",new String[] { number.substring(1, 3) });if (cursor.moveToNext()) {address = cursor.getString(0);}cursor.close();}}

注意: db.close();//关闭数据库

  • 监听文字变化,动态查询

    etNumber.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {System.out.println("onTextChanged");if (s.length() >= 3) {String address = NumberAddressDao.getAddress(s.toString());if (!TextUtils.isEmpty(address)) {tvResult.setText(address);} else {tvResult.setText("无结果");}}}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {System.out.println("beforeTextChanged");}@Overridepublic void afterTextChanged(Editable s) {System.out.println("afterTextChanged");}
    });
    
  • 抖动效果

    1. 引入ApiDemo,查找抖动效果的代码
    2. 拷贝相关代码到自己的项目中,运行
    3. 代码解读,插补器介绍

      结合Interpolator的子类,如线性插补器和循环插补器的源码来分析,更容易理解Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);
      shake.setInterpolator(new Interpolator() {@Overridepublic float getInterpolation(float x) {float y = x;//线程插补器return y;}
      });
      
  • 振动效果

    private void vibrate() {Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);// vibrator.vibrate(2000);//震动2秒long[] pattern = new long[] { 1000, 2000, 1000, 3000 };// 先等待1秒,再震动2秒,再等待1秒,再震动3秒...vibrator.vibrate(pattern, -1);// 参2等于-1时,表示不循环,大于等于0时,表示从以上数组的哪个位置开始循环
    }注意权限:  <uses-permission android:name="android.permission.VIBRATE"/>
    

安卓_手机卫士_第五天(手机定位,设备管理器,电话归属地)相关推荐

  1. 手机卫士 java_[Java教程]Android 手机卫士2

    [Java教程]Android 手机卫士2 0 2016-10-17 21:00:07 1,自定义获取焦点的TextView FocusTextView.java 1 package com.ithe ...

  2. 手机卫士15-归属地界面和手机定位功能

    首先,先把我之前写的那个更新操作的一个bug修复先,这个bug就是在Android4以上,我们已经不能在主线程里面进行网络操作的啦,如果进行网络操作,就会报错 所以我们就要做一下改动,我们在onCre ...

  3. android 电话号码标记,强化电话标记功能 360手机卫士3.0安卓版体验

    作为"房产商",上海仁恒置地集团营销总监姚伟示通常每天也要接到20个左右房产或其他推销电话."现在已经形成了一个机械的对应方式,对于此类推销电话,很多人包括我自己已经麻木 ...

  4. 360手机卫士经典案例分析

    摘要 对360手机卫士在保持和吸引顾客方面的独特之处进行了研究,从360手机卫士产品本身,到与产品有关的一系列渠道.定价和促销的营销组合,分析360手机卫士给顾客传递和传播的价值,并结合顾客感知价值这 ...

  5. Android之手机卫士涉及的知识点总结

    手机卫士涉及的知识点总结 Splash界面 splash: 溅,洒 展现产品的logo提升产品的知名度 初始化操作(创建数据库,读取配置文件) 连接服务器检查软件授权 连接服务器检查软件的更新 自动更 ...

  6. i9500android操作系统跑流量,手机流量去哪了 横评显示360手机卫士成节流王

    今年两会期间,加快4G建设.下调天价资费等话题成为热门议题,手机流量关注度在日益提高.而当前,市面上有不少流量监控软件均号称能省流量,但到底谁才是4G时代下的必备品呢?为此,我们从其中甄选出三款较常见 ...

  7. 金山手机卫士正式版发布 永久免费

    近日,金山安全软件有限公司首次公开发布金山手机卫士正式版,并宣布下载,安装,升级金山手机卫士完全免费,手机卫士是金山安全软件公司今年成立后回馈用户的又一力作.目前支持主流的智能手机操作系统--塞班S6 ...

  8. 微信惊现任意代码执行漏洞 360手机卫士提供自检方案

    吓得我赶紧打开微信更了个新..不过啊,  这个漏洞应该更早之前发现的吧 ---------------------------------------------------------------- ...

  9. 怎么看手机系统android版本,怎么查看手机型号、配置、版本【图文教程】

    怎么查看手机型号.配置.版本[图文教程] 很多人在购买手机之后突然想起要查看一下手机型号.配置等,那么怎么看手机型号配置呢?下面教大家怎么看手机型号配置的两种方法,都来看看吧. 步骤1.首先来说说第一 ...

最新文章

  1. 输入两个整数a和b,计算a+b的和
  2. java中是引用传递还是值传递....
  3. 推荐系统笔记(内容推荐)
  4. BugkuCTF-Misc:多种方法解决
  5. Altium designer中导入CAD文件
  6. LLVM与Codegen技术
  7. centos5.8上安装git server
  8. AVS 分像素运动估计优化算法
  9. 众咖齐聚!2018智能汽车跨界融合高峰论坛开幕在即
  10. python把485读回来的转为位_我能用Python读取从计算机上接收到的Modbus RS485数据吗?...
  11. 更改vs2010帮助文档的位置
  12. 《Cortex-M0权威指南》之体系结构---系统模型
  13. Windows Phone 7, Hammock, OAuth and Sina Weibo’s API
  14. “21天好习惯”第一期-20
  15. 如何用HTML制作一个3行3列的表格,如何利用表格制作网页
  16. 野火linux开发板6ULL,野火i.MX 6ULL开发板 嵌入式Linux开发板 nand版本
  17. 国外java、IT技术网站
  18. Hadoop-3.3.0安装 Centos 8.2安装Hadoop-3.3.0 Hadoop-3.3.0安装指南
  19. 查询mysql数据库中表的所有字段名
  20. 无线地磁传感器更适合路边停车系统

热门文章

  1. android设置页面转场特效
  2. c语言 谭浩强第五版第五章习题第17题 乒乓球比赛
  3. Hi-Fi小经验(转)
  4. 性格孤僻的原因和改善方法
  5. 配置MyBatis Plus 的乐观锁功能
  6. MySQL——MySQL备份
  7. 服务器怎么清空系统盘,服务器怎么清空数据
  8. DOS命令,卸载程序
  9. 【Lesson 3】 小调音阶及小调和弦
  10. 22考研全年备考规划表,这5个时间点你必须知道!