监听手机来电

来源:互联网 发布:kali linux ddos攻击 编辑:程序博客网 时间:2024/04/28 22:54
当来电话时,手机会显示对方的电话号,当接听电话时,会显示当前的通话状态。在这其间存在两个状态:来电状态和接听状态。如果在应用程序中要监听这两个状态,并进行一些其他的处理,就需要使用电话服务(TelephonyManager对象)。
    本例通过TelephonyManager对象监听来电状态和接听状态,并在相应的状态显示一个Toast提示信息框。如果是来电状态,会显示对方的电话号,如果是通话状态,会显示“正在通话...”信息。下面先来看看来电和接听时的效果,如图1
和图2所示。





要想获得TelephonyManager对象,需要使用Context.TELEPHONY_SERVICE常量,代码如下:
view sourceprint?
1TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
2MyPhoneCallListener myPhoneCallListener = new MyPhoneCallListener();
3//  设置电话状态监听器
4tm.listen(myPhoneCallListener, PhoneStateListener.LISTEN_CALL_STATE);


其中MyPhoneCallListener类是一个电话状态监听器,该类是PhoneStateListener的子类,代码如下:
view sourceprint?
01public class MyPhoneCallListener extends PhoneStateListener
02{
03    @Override
04    public void onCallStateChanged(int state, String incomingNumber)
05    {
06        switch (state)
07        {
08            //  通话状态
09            case TelephonyManager.CALL_STATE_OFFHOOK:
10                Toast.makeText(Main.this, "正在通话...", Toast.LENGTH_SHORT).show();
11                break;
12            //  来电状态
13            case TelephonyManager.CALL_STATE_RINGING:
14                Toast.makeText(Main.this, incomingNumber,Toast.LENGTH_SHORT).show();
15                break;
16        }
17        super.onCallStateChanged(state, incomingNumber);
18    }
19}

如果读者是在模拟器上测试本例,可以使用DDMS透视图的【EmulatorControl】视图来模拟打入电话。进入【EmulatorControl】视图,会看到如图8.7所示的界面。在【Incoming number】文本框中输入一个电话号,选中【Voice】选项,单击【Call】按钮,这时模拟器就会接到来电。如果已经运行本例,在来电和接听状态就会显示如图8.5和图8.6所示的Toast提示信息。