一周前老师布置了一个任务,要求实现一个简单的手机防盗软件,这东西在好些年前非常流行,几乎每个XX管家都搞了一个这个功能,当然现在也是

时过境迁,其实好多功能已经不太能够实现了。

最近开始试着去画思维导图,其实这篇文章是来展现我高超的思维导图技巧的~

实际上就是把实验报告全部贴上来了,又水了一篇文章,真开心~

项目心得就不贴了,害羞


项目简介与功能说明

(主要介绍本项目的应用意义与要完成的所有功能)

项目分析与设计

(主要描述针项目的分析与设计过程,如:项目的总的结构框图,项目功能模块、项目的技术难点以及解决这些难点的方法)

 项目实现与关键代码

(以流程图和关键代码来说明各功能模块的实现)

备注:

(1)流程图有点复杂,所以不方便用直线+实线,只好用虚线+曲线的形式给出。

(2)部分逻辑并未体现在图内,实际上设置信息及安全号码通过sharepreferences保存,所有功能模块执行前需要判断一次sharepreferences里的对应设置内容,只有当对应设置开关打开时才允许该功能模块执行。

(3)判断短信内容新添加了根据短信内容设置锁屏密码的机制,如发送lock88888,即将手机密码设置为88888。

关键代码:

实际上项目的重中之重就是SIM状态监听和短信监听了,核心功能的实现基本在这两部分,其余部分如开机启动监听,实际上是为了让项目整体更符合“手机防盗软件”定位的辅助部分。

SIM卡状态监听器(SIM卡状态监听广播)

public class SimReceiver extends BroadcastReceiver {private final static String ACTION_SIM_STATE_CHANGED = "android.intent.action.SIM_STATE_CHANGED";static String old_phonen_umber = null;static String new_phonen_umber = null;@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals(ACTION_SIM_STATE_CHANGED)) {//SharedPreferencesSharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);Boolean checkbox_core = sp.getBoolean("checkbox_core", false);Boolean checkbox_sim = sp.getBoolean("checkbox_sim", false);//Log.i("Theft_phone_number", "**访问onReceive开始,初始号码为:" + old_phonen_umber);TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {Log.i("Theft_phone_number", "没有给予对应的权限而退出");return;}new_phonen_umber = tm.getLine1Number();if (new_phonen_umber != null) {if (!new_phonen_umber.isEmpty()) {if (checkbox_core) {Log.i("Theft_setting", "核心服务已启动");if (checkbox_sim) {Log.i("Theft_setting", "SIM监控服务已启动,一切准备就绪");Log.i("Theft_phone_number", "执行了一次有效的电话号赋值:" + new_phonen_umber + "拟将新旧SIM信息进行替换");if (old_phonen_umber == new_phonen_umber) {Log.i("Theft_phone_number", "新旧SIM信息相同,不执行操作");} else {old_phonen_umber = new_phonen_umber;Log.i("Theft_phone_number", "SIM卡发生变化,现在的SIM号码信息已经替换为:" + old_phonen_umber);//读取...String edittext_num = sp.getString("edittext_num", "");if (!edittext_num.equals("")) {SmsManager.getDefault().sendTextMessage(edittext_num, null, "请当心SIM卡状态发生变化,SIM卡号目前为:" + old_phonen_umber, null, null);}}Log.i("Theft_phone_number", "---------------------onReceive执行结束---------------------");} else {Log.i("Theft_setting", "SIM监控服务未启动,终止");}} else {Log.i("Theft_setting", "核心服务未启动,终止");}}}}}
}

短信监听器(短信监听广播)

public class SmsReceiver extends BroadcastReceiver {private DevicePolicyManager mDPM;private PowerManager.WakeLock wakeLock;private PowerManager pm;KeyguardManager km;KeyguardManager.KeyguardLock keyguradLock;@SuppressLint("InvalidWakeLockTag")@Overridepublic void onReceive(Context context, Intent intent) {mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);Bundle bundle=intent.getExtras();if (bundle!=null){SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);Boolean checkbox_unlock = sp.getBoolean("checkbox_unlock", false);Boolean checkbox_lock = sp.getBoolean("checkbox_lock", false);String edittext_num = sp.getString("edittext_num", "");Object[] objs= (Object[]) bundle.get("pdus");SmsMessage[] smsMessages=new SmsMessage[objs.length];for (int i=0;i<objs.length;i++){smsMessages[i]=SmsMessage.createFromPdu((byte[])objs[i]);//发送方的号码String number=smsMessages[i].getDisplayOriginatingAddress();Log.i("Theft_message","监听到的号码:"+number);//获取短信的内容String content = smsMessages[i].getDisplayMessageBody();String pre_four = "nodata";String tel = "123456";Log.i("Theft_message","监听到的内容:"+content);if (!TextUtils.isEmpty(content) && content.length()>=4){pre_four = (content.substring(0,4));Log.i("Theft_message","赋值pre_four为"+pre_four);}if(number.equals("+"+edittext_num)){Log.i("Theft_message","监听到安全号码发送的消息,进行服务启动情况判断");if(pre_four.equals("lock")){if (checkbox_lock) {Log.i("Theft_message", "远程锁屏服务已启动");Log.i("Theft_message","执行锁定操作");//mDPM.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);清除数据if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) {km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);if(km.isKeyguardSecure()){Log.i("Theft_message","已经锁定");mDPM.lockNow();}else{Log.i("Theft_message","没有锁定,进行锁定");//锁屏设置密码if (!TextUtils.isEmpty(content) && content.length()>=4){tel=(content.substring(4,content.length()));Log.i("Theft_message","赋值tel为"+tel);}mDPM.resetPassword(tel, 0);mDPM.lockNow();}}else{Log.i("Theft_message","试图去进行判断锁屏情况,但是API等级不够");}}else{Log.i("Theft_message", "远程锁屏服务未启动");}}else if(content.equals("unlock")){if (checkbox_unlock) {Log.i("Theft_message", "远程解锁服务已启动");Log.i("Theft_message","执行解锁操作");wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP| PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "unLock");wakeLock.acquire();// 键盘锁管理器对象keyguradLock = km.newKeyguardLock("unLock");keyguradLock.disableKeyguard();}else{Log.i("Theft_message", "远程解锁服务未启动");}}}}//黑名单...abortBroadcast();}}

项目调试与结果

(主要介绍项目调试中发现的问题和解决方法以及整个项目正常运行的结果截图)

1)项目UI逻辑(优先级:核心组件>是否打开SIM监控>安全号码>远程锁屏&远程解锁)

只有核心组件被启动,才能开启后续功能模块。

只有SIM监控被启动,才能进行安全号码输入及保存。

只有SIM监控被启动,安全号码被设置完毕,才能启动远程锁屏和解锁,否则弹出如下提示。

2)“钥匙”机制(项目实际为2APP,一个为防盗软件本体,另一个为“钥匙”,防盗软件本体安装后无法在桌面看到图标)

如下图,无法看到本体的图标(本体名为手机防盗助手),但它确实其实已经安装了,可以看到的是Key的图标,打开Key会自动唤醒本体的UI界面,用户只需要在第一次进行配置和需要对配置进行修改的时候下载安装Key即可,平时完全可以把Key卸载,不会影响本体的运行。

上述机制很好的解决了,手机丢失情况下,防盗软件可能被有意卸载,通过隐藏图标的形式保障了本体的安全,而且由于获取了设备管理器权限,实际上在设置界面也是不能直接卸载应用的。

3)动态权限申请(一般情况下,项目首次启动会进行权限申请,会直接跳到对应的申请界面)

这里其实权限要多了…

 

 

(4)远程锁定,格式lock+密码,可以将手机密码远程设置为指定内容。

点击发送,同时配置了完整的日志系统

 

(5)远程解锁,格式unlock,可以将手机远程唤醒

同样也配置了完整的日志系统

6)为了适应API机制,加入了锁定检查,已经锁定的手机无法再次进行锁定,避免了异常的发生,已经锁定的手机收到锁定命令只会执行熄屏。

(7)开机自启动测试

可以看到,并未载入项目UI界面,但是项目已经在后台启动了,在控制台也又有对应的日志文件,同时输出了设备的配置信息。

(8)接上测试,SIM卡状态变化自动发送当前SIM卡号

由于系统重启时重新加载了SIM卡服务,等价于一次SIM卡插拔操作,项目后台自动发送了一条警告信息给安全号码,如下图。左为测试机,右为安全号码机(也已经成功收到短信)

安卓案例分析——实现简单的手机防盗软件相关推荐

  1. 智能手机防盗软件测试自学,用谁找回手机几率最大?手机防盗软件功能大PK

    数据显示,目前我国手机用户平均每18个月就会换一次手机,这其中手机丢失占去不小的比例.很多人在手机丢失时都会惊慌失措,不知从何找起,而就是这短暂的慌乱错过了找手机最佳时间.幸好当前通过手机防盗软件寻回 ...

  2. 分享一个Symbian手机防盗软件源码

    http://download.csdn.net/source/2135024 几年前看到Symbian上流行一种手机防盗软件,一时手痒自己也研做了个,前几天从硬盘旮旯里又找到了,有兴趣的可以下载看看 ...

  3. 哪些软件操作比较简单?手机拼图软件哪个好?

    现在大家出去玩基本都会用相机记录下美好的生活点滴,然后在社交平台上分享这些充满回忆的照片.但是有些社交平台会限制照片的数量,导致我们不能一次性分享所有的照片.其实在这种情况下,我们可以使用拼图软件把图 ...

  4. 手机防盗软件实现(源码)

    <a href="http://blog.csdn.net/xiaoxiao108/archive/2011/04/01/6294067.aspx"></a> ...

  5. Android手机防盗软件

    本程序是郑平老师所做,不错的软件入门小项目. 下载地址:http://download.csdn.net/detail/hong0220/4683329 package com.zhengping.l ...

  6. android项目:手机防盗软件

    基础界面的设置 <EditTextandroid:id="@+id/editText2"android:layout_width="wrap_content&quo ...

  7. COSMIC度量案例:一个简单、明确的软件需求

    培训教室管理 需求描述: 维护教室信息 可新增/修改/删除教室,维护信息字段:教室编号.楼层.容量.功能.说明. 1 有几个功能处理? 新增.修改.删除.查询四个功能处理. 2 为什么查询是单独的一个 ...

  8. 手机防盗软件的实现日志

    关于SharedPreferences 在android平台下用于保存数据有三种方式,1.SQLite 2.SharedPreferences 3.File SharedPreferences是将数据 ...

  9. 安卓防盗软件_开学 | 开学季手机防盗

    手机防盗小贴士 开学机手机防盗小知识来啦 手机保存 重点防范 手机防护 手 机 保 存 SUMMER VACATION TRAINING ①手机贴身放在能够感觉到的部位. ②手机不要放在后背包的外夹层 ...

最新文章

  1. 开发者福利,BCH通用数据库Bitdb 2.0来了
  2. x20 android7.0性能,vivoX7Plus和vivoX20综合对比评测 看完这些优缺点再做判断
  3. 2018 Multi-University Training Contest 10 - CSGO
  4. spring 加载java类_在Spring中基于Java类进行配置的完整步骤
  5. Codeforces Round #630 (Div. 2) E. Height All the Same 排列组合
  6. servlet上传文件接收工具
  7. 手把手教你通过Eclipse工程配置调用JNI完全攻略
  8. mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件
  9. Excel VBA 函数
  10. python方法怎么调用_python函数怎么调用自身?
  11. Android投屏神器scrcpy
  12. 使用pyautogui库实现简单的微信朋友圈自动点赞
  13. 51单片机定时器中断
  14. (转)802.1Q标准中TAG字段简单说明
  15. word 上标快捷方式ctrl+shift++不起作用的可能原因
  16. 弘辽科技:同为女强人,人生道路却大不相同。
  17. rclone 访问web界面
  18. vcfab算法示例_用示例解释贪婪算法
  19. oracle 数据库密码生产同步模拟环境 ,随记常用命令
  20. linux怎么找网卡驱动,linux系统下如何安装网卡驱动

热门文章

  1. java定时器的原理_spring定时器原理是什么?
  2. 军用三维电子沙盘实战应用系统
  3. 谷歌应用商店的85个广告软件安装900万次
  4. 【年终总结】2年计划还是要有的,万一实现了呢?(转自叶小钗)
  5. Head First 设计模式笔记 5.命令模式
  6. Java8 时间转换器
  7. 如果你想专升本那就一定要看的文学常识完整版(一)
  8. 在php中将数组作为树遍历
  9. 【CSS】盒子边框 ① ( 网页布局本质 | 盒子模型 | 盒子边框 Border | border-width 宽度 | border-style 边框样式 | 边框颜色 | 边框设置综合写法 )
  10. RSA与大数运算(转载)