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

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处http://blog.csdn.net/flowingflying以及作者@恺风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小例子

相关链接:我的Android开发相关文章

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值