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

Posted

技术标签:

【中文标题】Android 权限:电话:读取电话状态和身份【英文标题】:Android permissions: Phone Calls: read phone state and identity 【发布时间】:2009-11-17 07:31:37 【问题描述】:

我的 android 应用与电话无关,但我看到当我在测试设备上安装调试版本时,它需要“电话:读取电话状态和身份”权限。 (我在AndroidManifest.xml 中没有提到这一点)。

我想拥有尽可能少的权限,并想知道是否有人知道如何摆脱它?我注释掉了我从Build.MODELBuild.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 权限:电话:读取电话状态和身份的主要内容,如果未能解决你的问题,请参考以下文章

addAction到IntentFilter来处理电话状态更改

Android拨打电话

Android拨打电话   安卓拨打电话权限

Android双卡打电话和发短信

允许该应用创建网络套接字是啥意思

在 Android 中从电话簿中读取联系人