要通过此代码获取IMEI i:
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();
}
但是当我的应用程序正在运行时,会出现以下对话框:
程序要求授予权限“拨打和管理电话”,这可能使用户害怕使用应用程序。
现在我的问题是:
为什么READ_PHONE_STATE权限询问“拨打和管理电话”?虽然我还没有拨打电话和管理电话 应用程序。
答案 0 :(得分:5)
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);
答案 1 :(得分:2)
为什么READ_PHONE_STATE权限要求“拨打和管理电话”? 虽然我还没有在应用程序中拨打电话和管理电话。
棉花糖之后,我们需要明确调用危险许可下的许可。
READ_PHONE_STATE
在权限组下,称为Phone