Android 权限:电话:读取电话状态和身份
Posted
技术标签:
【中文标题】Android 权限:电话:读取电话状态和身份【英文标题】:Android permissions: Phone Calls: read phone state and identity 【发布时间】:2009-11-17 07:31:37 【问题描述】:我的 android 应用与电话无关,但我看到当我在测试设备上安装调试版本时,它需要“电话:读取电话状态和身份”权限。 (我在AndroidManifest.xml
中没有提到这一点)。
我想拥有尽可能少的权限,并想知道是否有人知道如何摆脱它?我注释掉了我从Build.MODEL
、Build.VERSION.*
等记录一些东西的部分。我还注释掉了我检测横向/纵向方向的部分,认为这可能是“电话状态”。但这些似乎都没有删除所需的权限。
我发现了这个错误报告:http://code.google.com/p/android/issues/detail?id=4101,但它被标记为按预期工作,并附有说明市场上的权限是正确的,但不是其他的。这是别人的经验吗? (我不想为了测试而不得不发布到市场上。)否则,有谁知道是否有一个我可以避免调用的 API 可以让我的应用程序不需要这个权限?
谢谢!
【问题讨论】:
【参考方案1】:(回答我自己的问题,以防其他人遇到此问题并搜索它。)
在android源码的PackageParser.java里翻了一圈,发现系统会自动分配
android.permission.WRITE_EXTERNAL_STORAGE and
android.permission.READ_PHONE_STATE
适用于声明 targetSdk 版本小于 4(甜甜圈)的任何应用。这肯定有兼容性的原因,也许针对旧版本的应用程序可以假设他们拥有这些权限,而没有明确声明它们。因此,如果您不希望将这些权限隐式添加到您的应用中,请在 AndroidManifest.xml 中添加如下部分
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="4" />
就是这样。
玩得开心,-迈克
【讨论】:
所以在 1.5 及之前的版本中,您是说这些权限是默认分配的,没有办法缓解这种情况? 对我来说就是这样。否则,我不知道为什么他们会被这样含蓄地授予。我想对于测试,我们可以尝试在 1.5 模拟器/设备上运行 1.5 应用程序,而不设置任何使用权限并查看是否可以(例如)写入 sdcard。 (这确实适用于 1.6 模拟器/设备,但只是因为隐式添加的权限。将 targetSdkVersion 设置为 4 将强制您在写入 sdcard 之前也添加使用权限。) 我的android:minSdkVersion
是 14,但 READ_PHONE_STATE
是隐式授予的。我正在使用 Facebook SDK 和 GoogleMaps v2,这些库是否可能负责隐式权限请求?【参考方案2】:
Android 1.6 更新日志:http://developer.android.com/sdk/android-1.6.html#api
WRITE_EXTERNAL_STORAGE:允许 应用程序写入外部 贮存。 使用 API 级别的应用程序 3 及以下将被隐式授予 此权限(这将是 对用户可见);应用 必须使用 API 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 或更早版本的应用。
【讨论】:
以上是关于Android 权限:电话:读取电话状态和身份的主要内容,如果未能解决你的问题,请参考以下文章