在Android中监控来电和去电

本文介绍了如何在Android中使用TelephonyManager和BroadcastReceiver监控来电和去电。对于来电,通过PhoneStateListener监听CALL_STATE变化获取来电号码;拨出电话时,通过ACTION_NEW_OUTGOING_CALL的BroadcastReceiver获取拨出号码,并需添加PROCESS_OUTGOING_CALLS权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:温尚书,华清远见嵌入式培训中心讲师。

在Android中,有的时候我们需要监控拨出电话和拨入电话,在Android中,可以使用其提供的API来实现这2个功能。

如果要实现监控来电电话,可以通过Android中提供的TelephonyManager这个类,这是一个系统服务,其中提供了对手机状态、手机通话状态以及运营商信息等的访问方法。我们这里主要来看如何通过它来获得拨入电话号码。

获得来电的步骤主要如下:

1、获得系统服务TelephonyManager对象,这可以通过Context上的getSystemService(String serviceName)来获得;

2、在TelephonyManager对象上调用listen()方法,让其监听电话状态的变化,其中需要给它注册一个监听器:PhoneStateListener,以及制定其监听的事件类型为通话状态(CALL STATE),可以通过PhoneStateListener.LISTEN_CALL_STATE常量来指定,如下:

telMgr.listen(PhoneStateListenerImpl lsn,PhoneStateListener.LISTEN_CALL_STATE)

3、在实现的PhoneStateListener类中,覆盖onCallStateChanged()方法,这个方法是一个回调方法,当电话通话状态发生改变时会被调用,这个方法会将来电号码传入,我们直接使用这个号码即可。下面是获得来电号码的关键代码:

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        CallListener lsn = new CallListener();
        tm.listen(lsn,
        PhoneStateListener.LISTEN_CALL_STATE);
        … …
        class CallListener extends PhoneStateListener
        {
                 public void onCallStateChanged(int state, String incomingNumber)
                {
                         // 响铃
                         if (state == TelephonyManager.CALL_STATE_RINGING)
                         {
                                 Log.e("", "Incoming Call:" + incomingNumber);
                        }
                 }
        }

而如果要获得拨出电话号码,则需要使用BroadcastReceiver来处理。因为当在Android手机上拨出电话时,它会发出一个广播消息,其对应的Intent的action为android.intent.action.NEW_OUTGOING_CALL,并且将拨出电话号码放到了Intent.EXTRA_PHONE_NUMBER这个名称对应的Extra中,数据类型为String,因此,我们可以在覆盖的onReceive()方法中将其读取出来,下面是对应的BroadcastReceiver的定义:

public class ServiceReceiver extends BroadcastReceiver
         {
                 public void onReceive(Context context, Intent intent)
                {
                         String pn = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
                         Log.e("","phone num:"+pn);
                 }
         }

然后在AndroidManifest.xml中,注册这个Receiver,代码如下:
        <receiver android:name=".ServiceReceiver">
        <intent-filter>
        <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
         </intent-filter>
         </receiver>

另外要注意的是,读取拨出电话需要给应用加上相关的权限,其定义如下:

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

完整的Java代码如下:(包括如何读取运营商信息等)

import android.app.Activity;
        import android.content.IntentFilter;
        import android.os.Bundle;
        import android.telephony.PhoneStateListener;
        import android.telephony.TelephonyManager;
        import android.util.Log;
        import android.widget.TextView;

public class Main extends Activity
        {
                TextView tv6;
                 TextView tv7;
                ServiceReceiver receiver;

/** Called when the activity is first created. */
         @Override
         public void onCreate(Bundle savedInstanceState)
        {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.main);
                 TextView tv1 = (TextView) findViewById(R.id.textView1);
                TextView tv2 = (TextView) findViewById(R.id.textView2);
                TextView tv3 = (TextView) findViewById(R.id.textView3);
                TextView tv4 = (TextView) findViewById(R.id.textView4);
                TextView tv5 = (TextView) findViewById(R.id.textView5);
                tv6 = (TextView) findViewById(R.id.textView6);
                tv7 = (TextView) findViewById(R.id.textView7);
                TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
                 tv1.setText("设备编号:" + tm.getDeviceId());
                 tv2.setText("Sim卡国家代号:" + tm.getSimCountryIso());
                 tv3.setText("Sim卡系列号:" + tm.getSimSerialNumber());
                 tv4.setText("Sim卡状态:" + tm.getSimState());
                 tv5.setText("网络运营商:" + tm.getNetworkOperatorName());
                 // tv7.setText(""+tm.getLine1Number());
                 android.util.Log.e("", "aaa" + tm.getLine1Number());
                 CallListener lsn = new CallListener();
                 tm.listen(lsn,
                //PhoneStateListener.LISTEN_CALL_STATE);
                 PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);
                receiver = new ServiceReceiver();
                IntentFilter filter = new IntentFilter();
                registerReceiver(receiver, filter);
         }
        @Override
         public void onPause()
         {
                 Log.e("", "onPause");
                 super.onPause();
        }
        public void onDestroy()
        {
                unregisterReceiver(receiver);
                 super.onDestroy();
         }
        class CallListener extends PhoneStateListener
        {
                public void onCallStateChanged(int state, String incomingNumber)
                {
                        // 响铃
                        if (state == TelephonyManager.CALL_STATE_RINGING)
                         {
                                Log.e("", "Incoming Call:" + incomingNumber);
                        }
                        // 摘机
                        if (state == TelephonyManager.CALL_STATE_OFFHOOK)
                         {
                                Log.e("", "Dialing");
                         }
                 }
        }
        }

layout文件略。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值