现在的位置: 首页 > 综合 > 正文

[Android] 使用广播接收器Braodcast Receiver 监听手机来电 去电 挂断的事

2013年09月21日 ⁄ 综合 ⁄ 共 2138字 ⁄ 字号 评论关闭

Braodcast Receiver顾名思义就是广播接收器,它和时间处理机制类似,但是事件处理机制是程序组件级别的(比如:按钮的单击事件),而广播事件处理机制是系统级别的。我们可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。我们同样可以在自己的应用程序中实现Broadcast
Receiver来监听和响应广播的Intent。

事件的广播通过创建Intent对象并调用sendBroadcast()方法将广播发出。事件的接受是通过定义一个继承BroadcastReceiver的类来实现的,继承该类后覆盖其onReceive()方法,在该方法中响应事件。

public class PhoneReceiver extends BroadcastReceiver {

	 
	@Override
	public void onReceive(Context context, Intent intent){
		// TODO Auto-generated method stub

	}
	
}

下面我们就用广播接收器实现电话状态改变时启动(来电、接听、挂断、拨打电话),但是暂时没法实现拨打电话时判断对方是否接听、转语音信箱等。Android在电话状态改变是会发送action为android.intent.action.PHONE_STATE的广播,而拨打电话时会发送action为android.intent.action.NEW_OUTGOING_CALL的广播,但是我看了下开发文档,暂时没发现有来电时的广播。知道这个就好办了,我们写个BroadcastReceiver用于接收这两个广播就可以了。

public class PhoneReceiver extends BroadcastReceiver {

         
        @Override
        public void onReceive(Context context, Intent intent){
                // TODO Auto-generated method stub
                System.out.println("action"+intent.getAction());
                if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
                        //如果是去电(拨出)
                        System.out.println("拨出");
                }else{
                        //查了下android文档,貌似没有专门用于接收来电的action,所以,非去电即来电
                        System.out.println("来电");
                        TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);   
                        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
                        //设置一个监听器
                }
        }
        PhoneStateListener listener=new PhoneStateListener(){
 
                @Override
                public void onCallStateChanged(int state, String incomingNumber) {
                        // TODO Auto-generated method stub
                        //state 当前状态 incomingNumber,貌似没有去电的API
                        super.onCallStateChanged(state, incomingNumber);
                        switch(state){
                        case TelephonyManager.CALL_STATE_IDLE:
                                System.out.println("挂断");
                                break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                                System.out.println("接听");
                                break;
                        case TelephonyManager.CALL_STATE_RINGING:
                                System.out.println("响铃:来电号码"+incomingNumber);
                                //输出来电号码
                                break;
                        }
                } 
        };
}

因为我们这是监听的系统事件,所以需要AndroidManifest.xml注册广播接收器:

        <receiver android:name=".PhoneReceiver">
                <intent-filter>
                        <action android:name="android.intent.action.PHONE_STATE"/>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                </intent-filter>
        </receiver>


不要忘记添加权限

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


抱歉!评论已关闭.