Android實現來電和去電的監聽

寫個實例實現Android中來電和去電的監聽,來電可以使用PhoneStateListener對電話狀態的改變進行監聽,去電需要動態或者靜態去註冊廣播接收器,對去電進行監聽;
來電:
來電所對應的三種靜態成員常量:
1、CALL_STATE_IDLE:空閒狀態,沒有任何活動。
2、CALL_STATE_OFFHOOK:摘機狀態,至少有個電話活動。該活動或是撥打(dialing)或是通話,或是 on hold。
3、CALL_STATE_RINGING:來電狀態,電話鈴聲響起的那段時間或正在通話又來新電,新來電話不得不等待的那段時間。

去電:
通過自定義廣播接收器,監聽手機發出的android.intent.action.NEW_OUTGOING_CALL的廣播,然後在廣播接收器中處理去電的相關邏輯。


實例代碼實現:

public class PhoneListenService extends Service {

    private static final String tag = "PhoneListenService";

    // 電話管理者對象
    private TelephonyManager mTelephonyManager;
    // 電話狀態監聽者
    private MyPhoneStateListener myPhoneStateListener;
    // 動態監聽去電的廣播接收器
    private InnerOutCallReceiver mInnerOutCallReceiver;

    @Override
    public void onCreate() {
        mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        myPhoneStateListener = new MyPhoneStateListener();
        mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
        // 動態註冊廣播接收器監聽去電信息
        mInnerOutCallReceiver = new InnerOutCallReceiver();
        // 手機撥打電話時會發送:android.intent.action.NEW_OUTGOING_CALL的廣播
        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
        registerReceiver(mInnerOutCallReceiver, intentFilter);
        super.onCreate();
    }

    /**
     * 動態註冊廣播接收器監聽去電信息
     */
    class InnerOutCallReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // 獲取播出的去電號碼
            String outPhone = getResultData();
            Log.i(tag, "outPhone:" + outPhone);
        }
    }

    /**
     * 自定義內部類對來電的電話狀態進行監聽
     */
    class MyPhoneStateListener extends PhoneStateListener {
        // 重寫電話狀態改變時觸發的方法
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i(tag, "響鈴:" + incomingNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i(tag, "接聽");
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i(tag, "掛斷");
                    break;
            }
        }
    }

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

    @Override
    public void onDestroy() {
        // 取消來電的電話狀態監聽服務
        if (mTelephonyManager != null && myPhoneStateListener != null) {
            mTelephonyManager.listen(myPhoneStateListener, PhoneStateListener.LISTEN_NONE);
        }
        // 取消去電的廣播監聽
        if (mInnerOutCallReceiver != null) {
            unregisterReceiver(mInnerOutCallReceiver);
        }
        super.onDestroy();
    }
}

權限添加:

    <!--讀取電話的狀態信息的權限-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <!--處理撥出電話,允許程序監視,修改或放棄播出電話-->
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />

另外: 這裏給大家提供一個AndroidManifest.xml中權限控制的在線查詢工具:

Android Manifest功能與權限描述大全


測試結果如下:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章