1. 程式人生 > >【達內課程】Android中關於電話的操作

【達內課程】Android中關於電話的操作

在這裡插入圖片描述

關鍵程式碼如下:

        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_CALL);
        intent.setData(Uri.parse("tel:"+editText.getText().toString()));
        startActivity(intent);

menifest

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

在這裡插入圖片描述
在這裡插入圖片描述

manifest.xml增加讀取電話狀態的許可權

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

MainActivity中增加一個內部類

public class MainActivity extends Activity implements View.OnClickListener {
    ......
    private MyPhoneStateListener listener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	......
        //開啟監聽
        TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        //呼叫listen方法開啟監聽,監聽電話狀態
       listener = new MyPhoneStateListener();
        manager.listen(listener,PhoneStateListener.LISTEN_CALL_STATE);
    }

    @Override
    protected void onDestroy() {
        TelephonyManager manager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
        //什麼也不監聽了,這樣就取消監聽了
        manager.listen(listener,PhoneStateListener.LISTEN_NONE);
        super.onDestroy();
    }

    @Override
    public void onClick(View view) {
        ...
    }

    //電話狀態監聽器
    class MyPhoneStateListener extends PhoneStateListener {
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            Log.i("TelephonyManager", "incoming number:" + incomingNumber);
            switch (state) {
            	 //無任何狀態時 
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.i("TelephonyManager", "CALL_STATE_IDLE");
                    break;
                 //接起電話時
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.i("TelephonyManager", "CALL_STATE_OFFHOOK");
                    break;
                //電話進來時 
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.i("TelephonyManager", "CALL_STATE_RINGING");
                    break;
            }
        }
    }
}

現在執行程式,檢視列印日誌,空閒狀態,incoming number為空

I/TelephonyManager: incoming number:
				   CALL_STATE_IDLE

現在我們撥出一個電話

I/TelephonyManager: incoming number:
    			    CALL_STATE_OFFHOOK

當我們把這個撥出電話結束通話時

 I/TelephonyManager: incoming number:
    				     CALL_STATE_IDLE

當我們用另一個手機給這個這臺手機打電話時,未接聽時,既振鈴狀態時,incoming number是可以拿到值的,但是不知道為什麼我拿不到啊…誰知道告訴我下…

I/TelephonyManager: incoming number:
                                   CALL_STATE_RINGING

接通,然後結束通話

I/TelephonyManager: incoming number:
    CALL_STATE_OFFHOOK
    I/TelephonyManager: incoming number:
    CALL_STATE_IDLE

在這裡插入圖片描述

public class MainActivity extends Activity implements View.OnClickListener {
    ......
    private MyPhoneReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
	......
        //註冊廣播接收器
        receiver = new MyPhoneReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
        this.registerReceiver(receiver,filter);
    }

    @Override
    protected void onDestroy() {
        //取消註冊廣播接收器
        unregisterReceiver(receiver);

       ......
    }

	......

    //攔截撥出電話的receiver
    class MyPhoneReceiver extends BroadcastReceiver{

        @Override
        public void onReceive(Context context, Intent intent) {
            //獲取撥出電話的電話號碼
            String number = getResultData();
            Log.i("MyPhoneReceiver",number);
            if(number.equals("13333333333")){
                //阻止撥出電話
                setResultData(null);
            }
        }
    }
	......
}

manifest中增加撥出電話許可權

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

真機上執行程式,撥打1008611檢視日誌

I/MyPhoneReceiver: 撥出的電話號碼是:1008611

當我們撥打13333333333時,會直接結束通話

自動結束通話電話
在這裡插入圖片描述
程式碼不寫了。有興趣的同學自己實現一下