Android 权限:电话:读取电话状态和身份信息。

70
我的安卓应用程序与电话无关,但是我发现当我在测试设备上安装调试版本时,它需要“电话:读取电话状态和身份识别”权限(在AndroidManifest.xml中没有提到)。我想尽可能少地使用权限,并想知道有没有人知道如何消除这个权限。我注释掉了一些记录从Build.MODELBuild.VERSION.*等中获取的信息的部分,并注释掉了检测横向/纵向方向的部分,以为那可能是“电话状态”,但是这两者都似乎不能消除所需的权限。 我找到了这个bug报告:http://code.google.com/p/android/issues/detail?id=4101,但它被标记为按照意图工作,并附有有关来自市场的权限是否正确的说明。这是其他人的经验吗?否则,有谁知道是否有API可以避免调用,使得我的应用程序不需要这个权限?谢谢!
2个回答

90

(为了帮助其他遇到同样问题的人,我来回答自己的问题。)

在 Android 源代码的 PackageParser.java 文件中查找后,我发现系统会自动分配

android.permission.WRITE_EXTERNAL_STORAGE and 
android.permission.READ_PHONE_STATE

对于任何声明目标SDK版本小于4(甜甜圈)的应用程序,都必须存在兼容性原因。也许针对旧版本的应用程序可以假设它们具有这些权限,而无需显式声明它们。因此,如果您不希望这些权限被隐式添加到您的应用程序中,请在AndroidManifest.xml中添加以下部分:

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />

就这些了。

玩得开心,-Mike


那么在1.5及之前的版本中,你是说这些权限默认被分配,并且没有任何补救措施吗? - MattC
这是我看到的情况。否则,我不知道为什么它们会被隐式授予。我想,为了测试,我们可以尝试在1.5模拟器/设备上运行1.5应用程序,不设置任何uses-permission,并查看是否可能(例如)写入sdcard。(这在1.6模拟器/设备上可以工作,但仅因为隐式添加了权限。将targetSdkVersion设置为4将强制您在写入sdcard之前也添加uses-permission。) - Mike Kale
1
我的 android:minSdkVersion 是14,但是 READ_PHONE_STATE 被隐式授权了。我正在使用Facebook SDK和GoogleMaps v2,这些库是否可能负责隐式权限请求? - wkarl

24

Android 1.6更新日志:http://developer.android.com/sdk/android-1.6.html#api

WRITE_EXTERNAL_STORAGE:允许应用程序写入外部存储。在API级别3及更低版本中使用的应用程序将被隐式授予权限(并且用户可见);使用API Level 4或更高版本的应用程序必须显式请求此权限。

但这只是其中之一。由于某种原因,官方变更日志中缺少有关 READ_PHONE_STATE 的信息。完整的故事在这里清晰地解释了:http://blogs.zdnet.com/Burnette/?p=1369&page=3

新增权限。1.6程序必须显式请求 WRITE_EXTERNAL_STORAGE 权限,以便能够修改SD卡内容,并且必须显式请求 READ_PHONE_STATE 权限,以便能够检索电话状态信息。早期版本的应用程序始终会隐含请求这些权限。

因此,您可以看到,在面向运行1.6或更高版本的手机安装时,没有办法发布针对1.5或更早版本的应用程序而不请求这些权限。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接