0
点赞
收藏
分享

微信扫一扫

Pro Android学习笔记(一二三):Telephony API(5):Phone


作者@恺风Wei。

拨打电话

拨打电话和发Email一样不属于Telephony API,通过intent调用拨号器App应用的。代码例子如下:

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("tel:13312345678"));
startActivity(intent);       

如果我们希望直接呼出,可以采用ACTION_CALL,但需要android.permission.CALL_PHONE的权限。代码例子如下:

//要求 <uses-permission android:name="android.permission.CALL_PHONE"/>
Intent intent = new Intent(Intent.ACTION_CALL,Uri.parse("tel:13312345678"));
startActivity(intent);       

监听电话状态

应用在很多情况下会监听电话状态,例如一个音乐播放器,当监听到有来电时,应当停止播放音乐,当监听到来电结束时,恢复播放。同样,当用户拨打电话时(去电)也应当停止播放,结束时恢复。Android通过android.intent.action.PHONE_STATE来广播电话状态的变化,我们可以通过广播接收器来进行处理。此外,我们也可以通过TelephonyManager来进行监听,小例子也将采用这种方法。

要监听电话状态,需要获得授权:

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

小例子代码如下:

public class PhoneCallActivity extends Activity{ 
     private class MyPhoneStateListener extends PhoneStateListener{
         @Override // onCallStateChanged()只是其中一个回调函数,还有其他很多,例如onSignalStrengthChanged()等等。
        public void onCallStateChanged(int state, String incomingNumber) { 
             super.onCallStateChanged(state, incomingNumber); 
             
             switch(state){ 
             case TelephonyManager.CALL_STATE_IDLE: 
                 debug("Call state idle, incoming number is " + incomingNumber); 
                 break; 
                 
             case TelephonyManager.CALL_STATE_RINGING:   //来电振铃 
                debug("Call state ringing, incoming number is " + incomingNumber);
                 break; 
                 
             case TelephonyManager.CALL_STATE_OFFHOOK:   //摘机(接通来电) 
                 debug("Call state offHook, incoming number is " + incomingNumber);
                 break; 
                 
             default: 
                 debug("Call state changed : state=" + state + " incomming number is " + incomingNumber);
             } 
         }          
     }  
      
    private TextView tv = null; 
     private TelephonyManager telMgr = null; 
     private MyPhoneStateListener myListener = null; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState); 
         setContentView(R.layout.phone_activity); 
         tv = (TextView)findViewById(R.id.callText); 
         telMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); //android.telephony.TelephonyManager可以获得subscriber的信息,注册监听telephony state的变化。        myListener = new MyPhoneStateListener(); 
         telMgr.listen(myListener, PhoneStateListener.LISTEN_CALL_STATE); //开始监听电话状态变化。当注册后,将马上会的当前的电话状态,例如Idle。    }         
      
     @Override 
     protected void onDestroy() {  
         telMgr.listen(myListener, PhoneStateListener.LISTEN_NONE);  //停止监听电话状态,本例我们使用了onCreate()和onDestroy()作为开启和停止监听,在Activity中使用onResume()和onPause()会更为普遍,因为当来电是,其他应用(如拨号器)将进行处理,应用被覆盖,即onPause()          super.onDestroy(); 
     } 
       
    private void debug(String info){ 
         Log.i("WEI",info); 
         tv.setText(info + "\n" + tv.getText()); 
     } 
 }

对于某个来电,检测的状态依次为:

1、Call state ringing, incoming number is 12345678来电振铃,给出来电号码
2、Call state offHook, incoming number is用户接通,来电号码为空
3、Call state idle, incoming number is通话结束,来电号码为空

如果用户拒听,状态依次为ringing、idle。

对于去电,检测状态依次为:

1、Call state offHook, incoming number is 用户去电,来电号码为空
2、Call state idle, incoming number is

无法检测电话是否真正接通,对方接通时无状态反馈。实际上检测的状态和传统的话机相似,能够检测到拿起话筒(offhook),恢复原状(放回话筒,idle),以及振铃(ringing)。

通过TelephonyManager可以读取电话的信息,下面是代码片段:

private void getSubscriberInfo(){        
     debug("Operator name: " + telMgr.getNetworkOperatorName()); 
     debug("operator: " + telMgr.getNetworkOperator()); 
     debug("Network type : " + telMgr.getNetworkType() + " ,EVDO_A(" + TelephonyManager.NETWORK_TYPE_EVDO_A +")");
     debug("Roaming? " + telMgr.isNetworkRoaming()); 
     
     debug("SIM serialNumber : " + telMgr.getSimSerialNumber()); 
     debug("SIM operator : " + telMgr.getSimOperator()); 
     
     debug("subscriber id : " + telMgr.getSubscriberId()); 
     //Device ID :Returns the unique device ID, for example, the IMEI for GSM and the MEID or ESN for CDMA phones. Return null if device ID is not available.
     debug("Device Id : " + telMgr.getDeviceId()); 
     //debug("MMS user agent : " + telMgr.getMmsUserAgent());  //要求API Level 19    
}

小例子代码在:Pro Android学习:telephony小例子


举报

相关推荐

0 条评论