资源描述
吉首大学信息科学与工程学院
课程设计报告书
课 程
课 题: 基于Android的手机安全卫士
姓 名:
学 号:
专 业: 网络工程
年 级: 2012级
指导教师:
2016 年 6 月
一、项目介绍与设计目的
1.1课程设计目的
(1)掌握Android编程环境的安装。
(2)学会使用模拟器模拟手机环境。
(3)掌握Android的APP开发过程。
(4)掌握Android能够实现的功能。
(5)掌握手机安全卫士APP功能设计。
1.2课程设计要求
(1)开发出一款手机安全卫士APP。
(2)能够实现文件管理功能。
(3)能够实现对手机安全保护。
(4)实现电话安全管理。
1.3课程设计内容
(1)Android开发环境搭建与配置。
(2)手机安全卫士功能设计。
(3)代码编写。
(4)测试与调试。
1.4课程设计意义
通过课程设计,我们学习到了Android开发的流程和简单的APP开发经历,并初步打好编程基础。根据这次课程设计的经历,我们可以更快,更有方向的进行更深入的学习。这次课题是基于安卓手机安全卫士开发一款手机应用软件,对于手机安全软件的功能实现有了更准确的认识,能够感受到当前手机
数据保护对于用户来说是一个多么重要的事情。我们要实现对手机端的安全保护是刻不容缓的事情,继续探索安全保护方法是我们接下来要继续努力完成的任务。
二、设计方案
1.格式布局
1.1 下面是本次课程设计规划的logo登陆界面(如图1):
图1 Logo界面
1.2 下面是本次课程设计规划的功能界面(如图2):
图2功能界面
2. 功能设计内容
2.1 SIM卡信息
功能介绍:此功能可以获取手机网络、SIM卡相关信息。(如图3)根据SIM卡设备当前位置信息,通过可以查询到本机所在地的位置。(如图4)
图3 SIM卡信息
图4 基站查询结果
2.2 通讯卫士
功能介绍:该功能可以对手机通话状态进行监听。(如图5)当手机来电铃声想起时,程序会把来电号码记录到文件中。这个文件保存在手机数据库里的data/data/org.crazyit.manager/files目录下的phoneList文件中。将文件导入到电脑中可以查看该文件内容。(如图6)
图5 通讯卫士
图6 phoneList文件内容
2.3文件管理
功能介绍:查看系统文件夹和文件,SD卡文件夹和文件(如图7)。
图7 文件管理
2.4发送短信
功能介绍:在收件人号码输入框内输入收信人的电话号码,在短信内容内输入内容后就可以发送短信了。(如图8)
图8 发送短信
3. 主要代码实现
3.1 SIM卡信息模块
public class TelephonyStatus extends Activity
{
ListView showView;
// 声明代表状态名的数组
String[] statusNames;
// 声明代表手机状态的集合
ArrayList<String> statusValues = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.sim_main);
// 获取系统的TelephonyManager对象
TelephonyManager tManager = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
// 获取各种状态名称的数组
statusNames = getResources().getStringArray(R.array.statusNames);
// 获取代表SIM卡状态的数组
String[] simState = getResources()
.getStringArray(R.array.simState);
// 获取代表电话网络类型的数组
String[] phoneType = getResources().getStringArray(
R.array.phoneType);
// 获取设备编号
statusValues.add(tManager.getDeviceId());
// 获取系统平台的版本
statusValues.add(tManager.getDeviceSoftwareVersion()
!= null ? tManager.getDeviceSoftwareVersion() : "未知");
// 获取网络运营商代号
statusValues.add(tManager.getNetworkOperator());
// 获取网络运营商名称
statusValues.add(tManager.getNetworkOperatorName());
// 获取手机网络类型
statusValues.add(phoneType[tManager.getPhoneType()]);
// 获取设备所在位置
statusValues.add(tManager.getCellLocation() != null ? tManager
.getCellLocation().toString() : "未知位置");
// 获取SIM卡的国别
statusValues.add(tManager.getSimCountryIso());
// 获取SIM卡序列号
statusValues.add(tManager.getSimSerialNumber());
// 获取SIM卡状态
statusValues.add(simState[tManager.getSimState()]);
// 获得ListView对象
showView = (ListView) findViewById(R.id.show);
ArrayList<Map<String, String>> status =
new ArrayList<Map<String, String>>();
// 遍历statusValues集合,将statusNames、statusValues
// 的数据封装到List<Map<String , String>>集合中
for (int i = 0; i < statusValues.size(); i++)
{
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", statusNames[i]);
map.put("value", statusValues.get(i));
status.add(map);
}
// 使用SimpleAdapter封装List数据
SimpleAdapter adapter = new SimpleAdapter(this, status,
R.layout.line, new String[] { "name", "value" }
, new int[] { R.id.name, R.id.value });
// 为ListView设置Adapter
showView.setAdapter(adapter);
}
}
3.2 通讯卫士模块
public class MonitorPhone extends Activity
{
TelephonyManager tManager;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.phone_main);
// 取得TelephonyManager对象
tManager = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
// 创建一个通话状态监听器
PhoneStateListener listener = new PhoneStateListener()
{
@Override
public void onCallStateChanged(int state, String number)
{
switch (state)
{
// 无任何状态
case TelephonyManager.CALL_STATE_IDLE:
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
break;
// 来电铃响时
case TelephonyManager.CALL_STATE_RINGING:
OutputStream os = null;
try
{
os = openFileOutput("phoneList", MODE_APPEND);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
PrintStream ps = new PrintStream(os);
// 将来电号码记录到文件中
ps.println(new Date() + " 来电:" + number);
ps.close();
break;
default:
break;
}
super.onCallStateChanged(state, number);
}
};
// 监听电话通话状态的改变
tManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}
}
3.3文件管理模块
public class FileManagerActivity extends Activity {
private FileService fileService;
TabListener listener = new TabListener() {
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
//标签被选中的时候触发这个方法
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
int position = tab.getPosition();//标签的索引
// tab.getText().toString();//标签的文本标题
switch (position) {
case 0:
try {
fileService.getFiles(0);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 1:
try {
fileService.getFiles(1);
} catch (Exception e) {
e.printStackTrace();
}
break;
case 2:
//弹出窗口,让用户输入新建文件夹的名称
break;
case 3:
//粘贴逻辑
break;
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
};
private static final int ITEM_CREATE = 1;
private static final int ITEM_COPY = 2;
private static final int ITEM_PAST = 3;
private static final int ITEM_DELETE= 4;
private DataService service;
private ActionBar bar;
private ListView listView;
private TextView pathView;
private Button button;
private List<FileItem> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_file_manager);
listView = (ListView) findViewById(R.id.listView);
pathView = (TextView) findViewById(R.id.currentPath);
service = new DataService();
button = (Button) findViewById(R.id.button);
fileService = new FileService();
try {
initListView("/");
} catch (Exception e) {
e.printStackTrace();
}
initActionBar();
initEvents();
}
private void initEvents() {
//给每一个Item添加点击事件
listView.setOnItemClickListener(listener1);
//界面上每一个视图组件都可以使用上下文菜单
registerForContextMenu(listView);
}
@Override
public void onCreateContextMenu(android.view.ContextMenu menu, View v, android.view.ContextMenu.ContextMenuInfo menuInfo) {
menu.add(1, ITEM_CREATE, 0, "新建");
menu.add(1, ITEM_COPY, 1, "复制");
menu.add(1, ITEM_PAST, 2, "粘贴");
menu.add(1,ITEM_DELETE , 2, "删除");
};
@Override
public boolean onContextItemSelected(MenuItem item) {
// 触发上下文菜单的组件
AdapterContextMenuInfo info =(AdapterContextMenuInfo) item.getMenuInfo();
int position = info.position;
int itemId = item.getItemId();
switch (itemId) {
case ITEM_CREATE:
button.setEnabled(true);
break;
case ITEM_COPY:
button.setEnabled(true);
break;
case ITEM_PAST:
button.setEnabled(true);
break;
case ITEM_DELETE:
boolean flag = doubleCheck();
break;
}
return true;
}
private boolean doubleCheck() {
final Result res = new Result(false);
Builder builder = new Builder(this);
builder.setTitle("警告");
builder.setMessage("你确定删除吗?");
builder.setPositiveButton("确认", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// 匿名内部类在使用外部作用域的变量的时候,不能修改这个变量
res.setFlag(true);
}
});
builder.setNegativeButton("取消", null);
return res.isFlag();
}
public void past(View v) {
button.setEnabled(true);
}
private OnItemClickListener listener1 = new OnItemClickListener() {
public void onItemClick(android.widget.AdapterView<?> parent, View view, int position, long id) {
com.jsu.mobilesafe.bean.FileItem item = list.get(position);
String path = item.getFilePath();
try {
initListView(path);
} catch (Exception e) {
e.printStackTrace();
}
};
};
private void initListView(String path) throws Exception{
list = service.getFiles(path);
MyAdapter adapter = new MyAdapter(this,R.layout.list_item, list);
//绑定适配器
listView.setAdapter(adapter);
pathView.setText(path);
}
private void initActionBar() {
bar = getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for (int i = 0; i < Constants.TABS_TITLE.length; i++) {
addTab(Constants.TABS_TITLE[i]);
}
}
private void addTab(String title) {
Tab tab = bar.newTab();
tab.setText(title);
tab.setTabListener(listener);
bar.addTab(tab);
}
}
3.4发送短信模块
public class SendSms extends Activity
{
EditText number, content;
Button send;
SmsManager sManager;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.sendsms_main);
// 获取SmsManager
sManager = SmsManager.getDefault();
// 获取程序界面上的两个文本框和按钮
number = (EditText) findViewById(R.id.number);
content = (EditText) findViewById(R.id.content);
send = (Button) findViewById(R.id.send);
// 为send按钮的单击事件绑定监听器
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
// 创建一个PendingIntent对象
PendingIntent pi = PendingIntent.getActivity(
SendSms.this, 0, new Intent(), 0);
// 发送短信
sManager.sendTextMessage(number.getText().toString(),
null, content.getText().toString(), pi, null);
// 提示短信发送完成
Toast.makeText(SendSms.this, "短信发送完成", 8000).show();
}
});
}
}
三、总结和分析
本次课程设计,经过一周时间的指导学习,我们设计出了课程设计Android作品,并成功答辩通过。我们的课程设计功能按照课程设计的要求基本实现,并有新颖的可以查询到手机的当前所在位置信息的功能,可以记录手机用户的通话记录,用户在手机里是无法查看到此系统文件,实现了保密的效果。还能够实现手机的发送短信的常规功能。此次课程设计提高了我们的动手能力,增强了我们的开发经验,为以后的学习提供了很大的帮助。希望我们能够接着再接再厉,把Android开发学的更全面、更透彻、更深入,为进入工作后增加一个新的技能,新的方向。
本组成员在课程设计中,团队合作,分工明确,齐心协力做好本次课程设计的作品。分工如下:
A负责整体代码设计。
B负责logo图片、格式布局的设计。
C负责文档的撰写,功能初步设计。
课程设计过程中的不足之处:
1、 界面不够完善,logo图片没有商业软件那样好看。
2、 没有实现手机定位功能,只是能够查询到手机所在位置周围的基站,没有能够呈献给用户最直接的地址信息。
3、 文件管理器没有实现SD卡文件的管理。
指导老师评语:
成绩评定:
指导老师签名:
基地指导老师签名:
年 月 日
教研室意见
教研室主任签章
年 月 日
学院意见
分管院长签章
年 月 日
展开阅读全文