【達內課程】Android中關於電話的操作
阿新 • • 發佈:2018-12-26
關鍵程式碼如下:
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時,會直接結束通話
自動結束通話電話
程式碼不寫了。有興趣的同學自己實現一下