为什么 READ_PHONE_STATE 权限要求“拨打和管理电话”?

Sae*_*eed 3 permissions android

要从此代码中获取我使用的 IMEI:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
       if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
        } else { 
                iMEI = tm.getDeviceId(); 
        }
Run Code Online (Sandbox Code Playgroud)

但是当我的应用程序运行时,会出现这个对话框:

在此处输入图片说明

该程序要求授予“拨打和管理电话”的权限,这可能会吓到用户使用应用程序。

现在我的问题是:

为什么 READ_PHONE_STATE 权限要求“拨打和管理电话”?虽然我没有在我的应用程序中拨打电话和管理电话。

Deˣ*_*Deˣ 7

READ_PHONE_STATE权限被列为危险权限,并提供读取手机状态的权限。它属于Phone权限组。如果询问危险权限,系统会显示与其组相关的对话框。在你的情况下,Phone。这就是原因 - 用户被要求获得“拨打和管理电话”权限。这是询问权限的方式 - https://developer.android.com/training/permissions/requesting

为了更清楚,请参阅 https://developer.android.com/guide/topics/permissions/overview

它说 -

如果设备运行的是 Android 6.0(API 级别 23)且应用的 targetSdkVersion 为 23 或更高版本,则当您的应用请求危险权限时,以下系统行为适用:

  • 如果应用当前在权限组中没有任何权限,系统会向用户显示权限请求对话框,
    描述应用想要访问的权限组。该
    对话框没有描述该组内的特定权限。
    例如,如果应用程序请求 READ_CONTACTS 权限,
    系统对话框只会说应用程序需要访问设备的
    联系人。如果用户授予批准,系统将只
    授予应用程序请求的权限。

  • 如果应用程序在同一权限组中已被授予另一个危险权限,则系统会立即授予该
    权限,而无需与用户进行任何交互。例如,如果一个
    应用程序先前请求并被授予 READ_CONTACTS
    权限,然后它请求 WRITE_CONTACTS,系统会
    立即授予该权限,而不
    向用户显示权限对话框。

有很多更好的方法来获取唯一标识符。例如-

String android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(),
                Settings.Secure.ANDROID_ID);
Run Code Online (Sandbox Code Playgroud)