美文网首页
Android 9 来电监听incomingNumber为空

Android 9 来电监听incomingNumber为空

作者: Fly0_0 | 来源:发表于2019-07-29 10:32 被阅读0次

    为了增强用户隐私,Android 9 引入了若干行为变更,如限制后台应用访问设备传感器、限制通过 Wi-Fi 扫描检索到的信息,以及与通话、手机状态和 Wi-Fi 扫描相关的新权限规则和权限组。

    限制访问电话号码

    在未首先获得 READ_CALL_LOG 权限的情况下,除了应用的用例需要的其他权限之外,运行于 Android 9 上的应用无法读取电话号码或手机状态。

    与来电和去电关联的电话号码可在手机状态广播(比如来电和去电的手机状态广播)中看到,并可通过 PhoneStateListener 类访问。 但是,如果没有 READ_CALL_LOG 权限,则 PHONE_STATE_CHANGED 广播和 PhoneStateListener 提供的电话号码字段为空。

    要从手机状态中读取电话号码,请根据您的用例更新应用以请求必要的权限:

    要通过 PHONE_STATE Intent 操作读取电话号码,同时需要 READ_CALL_LOG 权限和 READ_PHONE_STATE 权限。
    要从 onCallStateChanged() 中读取电话号码,只需要 READ_CALL_LOG 权限。 不需要 READ_PHONE_STATE 权限。

        <!--读取电话的状态信息的权限-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!--读取通话记录的权限-->
        <uses-permission android:name="android.permission.READ_CALL_LOG" />
    
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    
    public class MyPhoneStateListener extends PhoneStateListener {
        private static final String TAG = "MyPhoneStateListener";
        
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                    Log.d(TAG ,"电话挂断...");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.d(TAG ,"正在通话...");
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                    Log.d(TAG ,"电话响铃...");
                    break;
            }
            super.onCallStateChanged(state, incomingNumber);
        }
    }
    

    相关文章

      网友评论

          本文标题:Android 9 来电监听incomingNumber为空

          本文链接:https://www.haomeiwen.com/subject/dhvvrctx.html