jjzjj

基于Android平台的手机安全卫士的设计与实现

biyezuopinvip 2024-04-19 原文

目 录
第1章 引言 1
1.1 研究背景及意义 1
1.2 安全软件的现状 1
1.3 本文主要工作 2
1.4 本文的组织结构 2
第2章 Android的相关技术介绍及分析 3
2.1 搭建Android开发环境 3
2.1.1 搭建Ubuntu系统下Java开发环境 3
2.1.2 搭建Ubuntu系统下Android开发环境 3
2.2 Android项目目录结构 4
2.3 Activity 5
2.3.1 Activity生命周期方法 5
2.3.2 与其他应用程序交互 5
2.4 BroadcastReceiver 6
2.4.1 广播接收者的分类 6
2.4.2 注册广播接收者的两种方式 6
2.5 Service 7
2.5.1 什么是服务 7
2.5.2 本地服务 7
2.5.3 远程服务 7
第3章 手机安全卫士分析与设计 8
3.1 手机防盗功能需求分析与设计 8
3.2 通讯卫士功能需求分析与设计 9
3.3 软件管理功能需求分析与设计 10
3.4 进程管理功能需求分析与设计 10
3.5 程序锁功能需求分析与设计 10
3.6 手机杀毒功能需求分析与设计 11
3.7 系统优化功能需求分析与设计 12
3.8 自动升级功能需求分析与设计 12
第4章 手机安全卫士详细设计与实现 13
4.1 欢迎界面实现 13
4.1.1 检查升级功能实现 14
4.1.2 升级对话框显示功能实现 14
4.2 应用程序主界面实现 14
4.3 程序锁实现 16
4.4 手机防盗实现 18
4.5 手机杀毒实现 19
4.6 系统优化实现 21
4.7 通讯卫士实现 21
4.8 软件管理实现 23
4.9 高级工具实现 23
4.10 系统设置实现 25
第5章 结论与展望 27
5.1 结论 27
5.2 进一步工作的方向 27
参考文献 28
致 谢 29
第3章手机安全卫士分析与设计
手机防盗功能需求分析与设计
落地有声:由于我的眼镜是透明的,经常一觉睡醒找不到眼镜,每次这个时候都想能通过手机控制眼镜发出声音以便更快的找到眼镜。落地有声就是由这个想法演变来的,如果用户的爱机刚被盗不久,那么手机还在用户附近的,如果此时设定的安全号码手机可以用,只需要用安全手机发送一条警报指令给丢失的手机,那么丢失的手机就会播放报警音乐,以便用户在第一时间找回丢失的爱机。
换卡先知:Android手机换SIM卡都需要重启手机,每次手机重启的时候判断当前SIM卡的串号是否和被保护的SIM卡的串号是否相同,如果不相同,则手机将在后台自动发送短信给安全手机,这样就在小偷不知道的情况下第一时间得知小偷的手机号码,大大提升找回手机的可能性。
远程开启防盗:当用户爱机没有开起防盗功能的时候,使用任意的手机发送应用和密码和远程开启防盗功能命令时可以开起防盗功能,并设置当前手机号码安全手机号码,从而为找回手机打下基础。
通信拦截:获取丢失的爱机的外拨电话、来电号码、外发短信和收到的短信,并转发给安全手机。这样就可以爱机丢失的第一时间和盗窃者取得联系,也获取了盗窃者朋友的手机号码,进一步增加找回手机的可能性,也大大影响了丢失爱机的正常使用,使盗窃者觉得丢失的爱机拿来也无用,还给手机主人好些。
保护隐私:当用户的爱机丢失时,通过短信发送特定的指令,可将丢失手机通讯录里面的所有联系人、通话记录以及短信内容全部删除,及时保护用户的相关隐私信息。
充电防盗:在某些特殊的场合,用户的爱机急需充电,而用户又不在手机周围,这时开启手机充电防盗就能很好地监控手机的状况,一旦有其他人蓄意拔出正在充电的手机,手机就会立即发出警报音,并同时发送短信通知安全手机。

package com.bingoogol.frogcare;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Process;

import com.bingoogol.frogcare.util.Constants;
import com.bingoogol.frogcare.util.DateUtil;
import com.bingoogol.frogcare.util.Logger;
import com.bingoogol.frogcare.util.SpUtil;
import com.bingoogol.frogcare.util.StorageUtil;
import com.bingoogol.frogcare.util.ToastUtil;

/**
 * 保存应用程序全局状态的基类
 * 
 * @author bingoogol@sina.com 2014-4-25
 */
public class App extends Application {
	private static final String TAG = "App";

	/**
	 * 应用程序中所有正在使用的activity集合,主要是用来实现完全退出应用程序功能
	 */
	private List<Activity> mActivities;

	/**
	 * 上一次按下返回键时的时间戳
	 */
	private long lastTime;

	@Override
	public void onCreate() {
		super.onCreate();
		mActivities = new ArrayList<Activity>();
		SpUtil.init(this);
		Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
	}

	/**
	 * 添加activity到全局状态中
	 * 
	 * @param activity
	 */
	public void addActivity(Activity activity) {
		mActivities.add(activity);
	}

	/**
	 * 从全局状态中移除activity
	 * 
	 * @param activity
	 */
	public void removeActivity(Activity activity) {
		mActivities.remove(activity);
	}

	/**
	 * 双击返回键退出应用程序
	 */
	public void exitWithDoubleClick() {
		if (System.currentTimeMillis() - lastTime <= 1500) {
			exit();
		} else {
			lastTime = System.currentTimeMillis();
			ToastUtil.makeText(this, R.string.exit_tips);
		}
	}

	/**
	 * 退出应用程序
	 */
	public void exit() {
		for (Activity activity : mActivities) {
			activity.finish();
		}
		System.exit(0);
	}

	private class MyUncaughtExceptionHandler implements UncaughtExceptionHandler {

		@Override
		public void uncaughtException(Thread thread, Throwable ex) {
			FileWriter fw = null;
			try {
				File file = new File(StorageUtil.getFeedbackDir(), DateUtil.dateToDayString(new Date()) + ".log");
				boolean flag = file.exists();
				// 这行执行完,file就存在了,所以得在这之前判断文件是否已经存在
				fw = new FileWriter(file, true);
				if (!flag) {
					fw.write("当前应用版本:" + getCurrentVersionName() + "\n");
					fw.write("当前设备信息:\n");
					fw.write(getMobileInfo());
					fw.write("----------------------------------------------------------------------------\n");
				}
				fw.write(getErrorInfo(ex));
				fw.write("----------------------------------------------------------------------------\n");
				fw.flush();
				// TODO 正式发布后删掉
				ex.printStackTrace();
			} catch (Exception e) {
				Logger.e(TAG, e.getMessage());
			} finally {
				if (fw != null) {
					try {
						fw.close();
					} catch (IOException e) {
						Logger.e(TAG, e.getMessage());
					}
				}
			}
			Process.killProcess(Process.myPid());
			// TODO 定期上传错误日志到服务器
		}

		private String getErrorInfo(Throwable throwable) {
			Writer writer = new StringWriter();
			PrintWriter pw = new PrintWriter(writer);
			throwable.printStackTrace(pw);
			pw.close();
			return writer.toString();
		}

		private String getMobileInfo() {
			StringBuffer sb = new StringBuffer();
			// 通过反射获取系统的硬件信息
			try {
				Field[] fields = Build.class.getDeclaredFields();
				for (Field field : fields) {
					// 暴力反射 ,获取私有的信息
					field.setAccessible(true);
					sb.append(field.getName() + "=" + field.get(null).toString());
					sb.append("\n");
				}
			} catch (Exception e) {
				Logger.e(TAG, e.getMessage());
			}
			return sb.toString();
		}

	}

	/**
	 * 获取当前版本名称
	 * 
	 * @return
	 */
	public String getCurrentVersionName() {
		try {
			return getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
		} catch (Exception e) {
			// 利用系统api getPackageName()得到的包名,这个异常根本不可能发生
			return null;
		}
	}

	/**
	 * 获取当前版本号
	 * 
	 * @return
	 */
	public int getCurrentVersionCode() {
		try {
			return getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
		} catch (Exception e) {
			// 利用系统api getPackageName()得到的包名,这个异常根本不可能发生
			return 0;
		}
	}

	/**
	 * 获取安装apk文件的意图对象
	 * 
	 * @param apkFile
	 *            要安装的apk文件
	 * @return
	 */
	public Intent getInstallApkIntent(File apkFile) {
		Intent installApkIntent = new Intent();
		installApkIntent.setAction(Intent.ACTION_VIEW);
		installApkIntent.addCategory(Intent.CATEGORY_DEFAULT);
		installApkIntent.setDataAndType(Uri.fromFile(apkFile), Constants.mime.APK);
		return installApkIntent;
	}
}














有关基于Android平台的手机安全卫士的设计与实现的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  4. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  5. ruby - 如何安全地删除文件? - 2

    在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?

  6. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  7. 怎样用一台手机做自媒体? - 2

    其实做自媒体的成本并不高,入门只需要一部手机即可!在手机上找视频素材、使用手机剪辑视频、最后使用手机发布视频作品获得收益!方法并不难,今天这期内容就来给粉丝们分享一种小方法,每天稳定收益100-300,抓紧点赞收藏!1、找素材(1)使用手机拍摄自己喜欢的经典段落,使用程序把文案内容提取出来(2)也可以在豆瓣、知乎、微博等网站中找一些自己需要的文案素材(3)把文案进行润色修改,可以加入一些自己的观点(4)视频素材可以使用软件中自带的素材,也可以在素材网站中下载完整版的素材2、文案配音(1)把复制好的文案直接导入小程序中(2)调整音色、音调后一键合成音频即可(3)可以选择自己朗读配音,需要花一点时

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

随机推荐