权限READ_PRIVILEGED_PHONE_STATE对TelephonyManager.getSubscriberId不可用,

问题描述

if (ActivityCompat.checkSelfPermission(this.getApplicationContext(),Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_DENIED){
        ActivityCompat.requestPermissions(this,new String[] {Manifest.permission.READ_PHONE_STATE},CALL_REQUEST_CODE);
    }



public void onRequestPermissionsResult(int requestCode,@NonNull String[] permissions,@NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode,permissions,grantResults);
    if (requestCode == CALL_REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
            subscriberId = telephonyManager.getSubscriberId();
        }

我已经在清单中也声明了对READ_PHONE_STATE的许可。但是getSubscriberId()引发错误提示用户10171不符合访问设备标识符的要求。”我需要SubscriberId来跟踪移动网络数据使用情况。清单中没有READ_PRIVILEGED_PHONE_STATE权限,这是networkstatsmanager.queryDetailsForUid的唯一使用方法。 有人可以帮助解决这个问题吗,谢谢!!

解决方法

出于安全目的,Android限制了TelephonyManager类的使用。

从Android 10(API级别29)开始,您无法使用TelephonyManager类获取任何信息以获取更多详细信息,请阅读以下链接中的所有信息

https://developer.android.com/training/articles/user-data-ids#java

,

Android 10(API级别29)为不可重置的标识符(包括IMEI和序列号)增加了限制。您的应用必须是设备或个人资料所有者应用,具有特殊的运营商权限,或具有READ_PRIVILEGED_PHONE_STATE特权,才能访问这些标识符。

您可以通过此链接查看是否有什么可以帮助您-https://developer.android.com/training/articles/user-data-ids