Android READ_PHONE_STATE runtime permission asks to make and manage phone calls
在应用程序中,我希望通过TelephonyManager.getDeviceId()获取唯一的手机ID。 要使用它,我需要此权限READ_PHONE_STATE。 问题在于Android 6的运行时权限。在运行时权限弹出对话框中,它要求授予"制作和管理电话"权限,这可能会吓到用户使用应用程序。 可以做些什么? 或者,如果不使用如此大的权限,我可以获得设备的任何其他唯一标识符
1 2 3
| TelephonyManager TM = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = TM.getDeviceId(); |
-
你可以设置它将在android 6中运行的"targetSdkVersion 22",并且它不会显示询问运行时权限的弹出窗口。它将自动授予访问权限。:)
-
你为什么要用TelephonyManager.getDeviceId()? 在大多数情况下,Android上有更好的标识符。
-
你可以参考这个答案找到唯一的ID。
-
我在我的应用程序中面临同样的问题。 在我的应用程序中,我必须阅读IMEI。
我在我的应用程序中使用它作为唯一的设备标识符,我不需要任何运行时权限。
1 2
| String android_id = Settings.Secure.getString(getApplicationContext().getContentResolver(),
Settings.Secure.ANDROID_ID); |
或者您可以使用它
1
| String uuid = UUID.randomUUID().toString(); |
-
信息性,但仍然是上面的核心问题尚未得到解答。 为什么READ_PHONE_STATE会导致对话文本"拨打和管理电话"
-
因为使用READ_PHONE_STATE,您可以处理传入和传出呼叫以及许多其他事情,因此它说制作和管理电话呼叫。 但问题是如何在不使用READ_PHONE_STATE权限的情况下获取设备的唯一ID。 他问另一种方式。
-
这样用户可以删除android_id并生成一个新的。 然后,他可以滥用促销代码的滥用。 获得无法删除的Id的唯一方法是Rafael这样做的方式。 为此,他需要获得许可,问题是Android出于此目的的错误对话。 当然,人们会拒绝这种许可,因为他们害怕被召唤。 所以这不是解决方案,而是使滥用成为可能。
要求来自某个权限组的权限会打开一个对话框,该对话框将授予所述组的每个权限(前提是您还在清单中请求了这些权限)。
示例:在清单中询问READ_PHONE_STATE和CALL_PHONE。 在运行时仅请求READ_PHONE_STATE。 获得权限对话框。 验证您是否已被授予两种权限。
危险权限和权限组列表:https://developer.android.com/guide/topics/permissions/requesting.html
自Android 6以来,此行为未发生变化,但将来可能会更改。