Android攔截電話

來源:互聯網
上載者:User

今天來說一下Android下如何攔截電話CallLog

在Android中,電話跟簡訊一樣,也是有一套訊息(廣播)機制的,我們只需要註冊一個Receiver,接收Android電話的相關廣播就OK了,下面這段代碼是一個完整的BroadcasReceiver類,能夠監聽Android系統下打進來的電話和打出去的電話:

package com.contact.main.receiver;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;

public class IncommingCallLogReceiver extends BroadcastReceiver {

    private final String TAG = IncommingCallLogReceiver.class.getSimpleName();

    public static final String ACTION_PHONE_STATE = TelephonyManager.ACTION_PHONE_STATE_CHANGED;

    private Context mContext;

    @Override
    public IBinder peekService(final Context myContext, final Intent service) {

        return super.peekService(myContext, service);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        mContext = context;
        final String action = intent.getAction();
        final String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        Log.e(TAG, "Call State Changed, Action = " + action);

        if (ACTION_PHONE_STATE.equals(action)) {// 通話狀態改變
            Log.e(TAG, "電話狀態改變");

            if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {// 電話響鈴RINGING

                final String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);

                Log.e(TAG, "Number:" + number);
                Log.e(TAG, "電話響鈴中…");

            } else if (TelephonyManager.EXTRA_STATE_OFFHOOK.equals(state)) {// 接電話OFFHOOK

                Log.e(TAG, "接聽");

            } else if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {// 掛電話IDLE

                Log.e(TAG, "掛斷");

            }
        } else if (Intent.ACTION_NEW_OUTGOING_CALL.equals(action)) {// 攔截呼出電話
            final String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

            Log.e(TAG, "電話呼出,呼出號碼為:" + phoneNumber);

        }

    }

}

 

當然,要想這個Receiver工作起來,還必須在AndroidManifest.xml中進行註冊:

          <receiver android:name="com.contact.main.receiver.IncommingCallLogReceiver" >

           <intent-filter android:priority="10000" >
               <action android:name="android.intent.action.PHONE_STATE" />
               <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
               <action android:name="android.intent.action.BOOT_COMPLETED" />
           </intent-filter>
       </receiver>

 

這樣做了還不夠,因為我們還缺少相應的操作許可權:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
    </uses-permission>
    <uses-permission android:name="android.permission.VIBRATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.INTERNET" >
    </uses-permission>
    <uses-permission android:name="android.permission.GET_TASKS" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_CONTACTS" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_CONTACTS" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_SMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_SMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE" >
    </uses-permission>
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS" >
    </uses-permission>
    <uses-permission android:name="android.permission.SEND_SMS" >
    </uses-permission>

上面的許可權比較全了,包括操作Android系統連絡人,簡訊和通話記錄的所有許可權。

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
    </uses-permission>

這個許可權比較關鍵,缺少它的話,我們是監聽不到本機打出去的電話的,或者說能夠監聽得到,但無法分辨是打出去的還是打進來的,加上這個許可權後,我們就能夠監聽到:Intent.ACTION_NEW_OUTGOING_CALL這個廣播了:

public static final String ACTION_NEW_OUTGOING_CALL =
"android.intent.action.NEW_OUTGOING_CALL";

 

原文地址 http://www.cppcode.com/archives/2012/04/01/259.html

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.