当前位置:首页 > 行业动态 > 正文

Android系统如何监控电话号码?隐私保护下的通话追踪功能解析。

问题:,在Android中如何监控电话号码? 回答:,使用TelephonyManager和PhoneStateListener来监听电话状态变化,并获取来电号码。

Android监控电话号码

一、Android监控电话号码的实现方法

1、使用TelephonyManager监听电话状态

原理:通过注册PhoneStateListener来监听电话状态的变化,包括来电、去电和通话状态的改变,当有来电时,可以在回调方法中获取到来电号码。

代码示例

在AndroidManifest.xml中添加权限:

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

然后在Activity中进行如下操作:

 private lateinit var telephonyManager: TelephonyManager
       private lateinit var mPhoneListener: PhoneStateListener
       override fun onCreate(savedInstanceState: Bundle?) {
           super.onCreate(savedInstanceState)
           telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
           mPhoneListener = object : PhoneStateListener() {
               override fun onCallStateChanged(state: Int, phoneNumber: String?) {
                   when (state) {
                       TelephonyManager.CALL_STATE_IDLE -> {
                           //挂断
                       Log.i("TAG", "onCallStateChanged: 挂断${phoneNumber}")
                       }
                       TelephonyManager.CALL_STATE_OFFHOOK -> {
                           //接听
                       Log.i("TAG", "onCallStateChanged: 接听${phoneNumber}")
                       }
                       TelephonyManager.CALL_STATE_RINGING -> {
                           //响铃
                       Log.i("TAG", "onCallStateChanged: 响铃${phoneNumber}")
                       }
                   }
               }
           }
           telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE)
       }
       override fun onDestroy() {
           super.onDestroy()
           telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE)
       }

2、使用BroadcastReceiver监听电话状态

原理:通过注册一个BroadcastReceiver来接收系统发送的电话状态广播,如来电、去电等,在广播的Intent中可以获取到相关的电话号码信息。

代码示例

在AndroidManifest.xml中添加权限和注册BroadcastReceiver:

 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
       <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
       <receiver android:name=".PhoneStateReceiver">
           <intent-filter>
               <action android:name="android.intent.action.PHONE_STATE"/>
               <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
           </intent-filter>
       </receiver>

创建PhoneStateReceiver类:

 class PhoneStateReceiver : BroadcastReceiver() {
           override fun onReceive(context: Context?, intent: Intent?) {
               val state = intent?.getStringExtra(TelephonyManager.EXTRA_STATE)
               if (TelephonyManager.EXTRA_STATE_OFFHOOK == state) {
                   // 电话正在进行中
               Log.d("PhoneStateReceiver", "电话正在进行中")
               } else if (TelephonyManager.EXTRA_STATE_IDLE == state) {
                   // 电话挂断
               Log.d("PhoneStateReceiver", "电话已挂断")
               } else if (TelephonyManager.EXTRA_STATE_RINGING == state) {
                   val incomingNumber = intent?.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)
                   // 电话正在响铃
               Log.d("PhoneStateReceiver", "来电:" + incomingNumber)
               }
           }
       }

二、单元表格:Android监控电话号码相关权限说明

权限名称 权限说明 是否必须在AndroidManifest.xml中声明 是否需要动态申请(Android 6.0及以上)
READ_PHONE_STATE 允许应用访问电话的状态和身份信息,如获取来电号码等
CALL_PHONE 允许应用拨打电话
ANSWER_PHONE_CALLS 允许应用接听电话
PROCESS_OUTGOING_CALLS 允许应用监控拨出的电话
READ_CALL_LOG 允许应用读取通话记录
WRITE_CALL_LOG 允许应用写入通话记录

三、相关问题与解答

1、问题:在Android中,如果只想获取来电号码而不关心通话状态的变化,应该如何实现?

解答:可以通过注册一个BroadcastReceiver来专门监听来电广播(ACTION_PHONE_STATE),在接收到广播后,判断广播的类型是否为TelephonyManager.EXTRA_STATE_RINGING,如果是,则从Intent中获取来电号码(通过getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)),这样可以避免处理其他通话状态变化的逻辑,只专注于获取来电号码。

2、问题:为什么在一些设备上,即使申请了相关权限并且代码逻辑正确,仍然无法获取到来电号码?

解答:这可能是由于设备厂商对系统进行了定制或者安全策略的限制,部分设备厂商可能会对应用获取敏感信息(如来电号码)进行更严格的管控,导致即使应用有相应的权限,也无法正常获取,也有可能是系统的Bug或者应用与其他应用之间的冲突导致的,在这种情况下,可以尝试联系设备厂商获取支持,或者检查是否有其他应用影响了该功能的正常使用。

0