【问题标题】:Why is my app asking for phone id permission?为什么我的应用要求电话 ID 权限?
【发布时间】:2015-07-28 10:12:22
【问题描述】:

在我的清单中,我只要求这两个权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

但是当我在手机上安装该应用程序时,我也会收到此通知:

Low-risk permissions
Phone ID
Get your phone ID, including IMEI, IMSI, etc.

根据我从this SO answer 收集到的信息,我应该需要使用TelephonyManager 并调用

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

需要此权限。但我没有使用 TelephonyManager 或调用该权限。我不想要求用户授予此权限。我查看了我的清单和 gradle 文件。会不会是我使用的某些代码触发了这个权限,而我没有特别要求它被调用?我知道我不会给你太多的帮助,因为我不知道还能去哪里看。

更新 1

我在 Android Studio 中创建了一个全新的项目,并从中生成了一个签名的 APK。我安装了它,但没有要求任何权限。 (这至少向我证实,并不是 Android Studio 中的某个“新功能”自动请求此权限。)

更新 2

在@antonio 的回答中,我找到了app/build/outputs/logs/manifest-merger-release-report.txt 但是,我没有发现任何隐含的权限被请求。

更新 3

以下是我的应用使用的依赖项(来自 gradle.build):

dependencies {
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+'
}

我测试了一个具有这两个依赖项的新应用程序,并且没有请求任何权限。

我的下一步是从头开始重新添加每个活动,看看我是否可以找到开始调用此权限的位置。待续……

更新 4

我尝试将所有内容复制到一个新项目并重构项目名称并删除部分,但结果证明它非常复杂。我无法找出原因。

更新 5

我将 targetSdkVersion 设置为 1。这会在安装应用程序之前宣布权限时给出一条新消息:

读取手机状态和身份

允许应用访问设备的电话功能。这 权限允许应用程序确定电话号码和设备 ID,呼叫是否处于活动状态,以及通过 a 连接的远程号码 打电话。

我一开始写的旧电话ID许可通知仍然存在(安装应用程序后显示)。这让我想知道它是否与操作系统有关(我在小米手机上使用 MIUI Android)。该应用程序仍有一些问题会导致它显示在此应用程序中,但不会显示在其他应用程序中。接下来我需要在其他设备上进行测试。

【问题讨论】:

  • 你的targetSdkVersion是什么?
  • @Mattia,build.gradle 中的当前设置是 targetSdkVersion 21、minSdkVersion 8、compileSdkVersion 19

标签: android permissions


【解决方案1】:

发生这种情况是因为您导入的库的 targetSdkVersion 低于应用程序的 targetSdkVersion

来自Manifest Merger documentation

当导入一个 targetSdkVersion 低于 导入应用程序 targetSdkVersion,可能有一些权限 自动添加到生成的合并清单文件中。 这是必要的,因为此类库以隐式授予此类权限的运行时为目标。因此,没有必要宣布此类许可。但是,在最近的 Android 版本中,这些权限不会自动授予。因此,一旦合并到针对更新运行时的应用程序中,针对此类旧运行时而没有权限的库将无法正常工作。

可以添加的权限有:

  • WRITE_EXTERNAL_STORAGE 在导入具有 targetSdkVersion 的库时添加
  • READ_EXTERNAL_STORAGE在导入声明为 WRITE_EXTERNAL_STORAGE 的库时添加
  • READ_PHONE_STATE 在导入具有 targetSdkVersion 的库时添加
  • READ_CALL_LOG在导入 targetSdkVersion
  • WRITE_CALL_LOG在导入 targetSdkVersion

您可以检查 Manifest Merger 生成的报告(在 \app\build\outputs\logs\manifest-merger-XXX-report 中),以查看导致添加 READ_PHONE_STATE 权限的库。你会看到类似的东西:

android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from AndroidManifest.xml:2:1 reason: the.library has a targetSdkVersion < 4

在多模块 gradle-project 中,必须应用匹配的配置,例如 defaultConfig{ ... },其中应指定 targetSdkVersion 以解析这些隐含权限。

【讨论】:

  • 这很有趣。我觉得我现在离解决这个问题更近了。我找到了您描述的报告(请参阅我的更新),但找不到任何要求 READ_PHONE_STATE 权限的内容。
  • 您是否依赖于另一个 Android 项目?您能否发布 build.gradle 的 dependencies 部分?
  • 我发布了依赖项。我还将尝试在没有 SQLiteAssetsHelper 的情况下运行该应用程序,看看是否会有所不同。
  • 您可以尝试在您的项目中将 targetSdkVersion 设置为 1 吗?如果 READ_PHONE_STATE 权限消失,我们就会知道我们正走在正确的轨道上,认为 Manifest Merger 正在添加它。
  • 这很有帮助。 (请参阅更新 5)虽然问题尚未解决,但它向我表明,我最初看到的消息可能实际上不是 READ_PHONE_STATE 权限。不要再花时间在这上面了。我感谢你已经给我的所有新线索。如果我得到最终解决方案,我会发布更新。
【解决方案2】:

将以下代码添加到您的 AndroidManifest.xml 以删除不必要的权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />

来源:

https://stackoverflow.com/a/27542669/406295

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多