为啥添加了 READ_PHONE_STATE 权限?

Posted

技术标签:

【中文标题】为啥添加了 READ_PHONE_STATE 权限?【英文标题】:Why has the READ_PHONE_STATE permission been added?为什么添加了 READ_PHONE_STATE 权限? 【发布时间】:2017-02-01 18:33:28 【问题描述】:

在我刚刚发布到 Play 商店的最新 beta 版本中,我注意到 READ_PHONE_STATE 自上一版本以来已添加。

我自己没有添加这个。自从上一个版本使用 v9.6.0 的各种播放服务库(是 v9.4.0)以来,我所能记得的所有事情:

compile 'com.google.android.gms:play-services-location:9.6.0'
compile 'com.google.android.gms:play-services-places:9.6.0'
compile 'com.google.android.gms:play-services-auth:9.6.0'

这会做到吗?我看不到它的记录。我可以取消权限吗?

并且我已确保我使用的所有库都与主应用程序相匹配,根据 this answer... 对我的情况没有任何影响。

编辑

好的,基于this article,我已经深入研究了我的日志输出以找到:

ADDED from [Meteogram:jobdispatcher:unspecified] C:\Users\Me\AndroidStudioProjects\Meteogram\app\build\intermediates\exploded-aar\Meteogram\jobdispatcher\unspecified\AndroidManifest.xml:37:25-84 android:uses-permission#android.permission.READ_PHONE_STATE

但自上一个版本以来,jobdispatcher 库(我将其作为 gradle 模块导入到我的项目中)没有任何变化。

EDIT2

这里还有一些来自该日志的内容,我的感觉是可能是由于怀疑是 play-services 库版本?

ADDED from [Meteogram:jobdispatcher:unspecified] C:\Users\Me\AndroidStudioProjects\Meteogram\app\build\intermediates\exploded-aar\Meteogram\jobdispatcher\unspecified\AndroidManifest.xml:37:17-87
    android:name
        ADDED from [Meteogram:jobdispatcher:unspecified] C:\Users\Me\AndroidStudioProjects\Meteogram\app\build\intermediates\exploded-aar\Meteogram\jobdispatcher\unspecified\AndroidManifest.xml:37:25-84
android:uses-permission#android.permission.READ_PHONE_STATE
IMPLIED from C:\Users\Me\AndroidStudioProjects\Meteogram\app\src\pro\AndroidManifest.xml:2:1-12:12 reason: com.google.android.gmscore.integ.client.location has a targetSdkVersion < 4
activity#com.google.android.gms.common.api.GoogleApiActivity

targetSdkVersion &lt; 4 与上面链接的其他答案匹配,但是在这种情况下我能做些什么,因为 play-services 库不是我的?

EDIT3

我找到了答案...与其删除这个问题,我会留下它,提供解决方案,以防它对其他人有用(并且如果其他人有更好的解决方案!)

EDIT4

看起来它已在9.6.1 中修复。

【问题讨论】:

【参考方案1】:

我最终找到了this,它报告了同样的问题。 Answer #3 中提到了一种解决方法,即“手动”删除权限(我的假设是只有非常早期的 Android 版本才需要该权限,这对我来说没问题,因为我的 minSdk 是 16):

<manifest ...
    xmlns:tools="http://schemas.android.com/tools"
    ... >

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

【讨论】:

问题是,它会破坏谷歌服务功能吗?你有遇到什么问题吗? 在早期的 android 版本上甚至不需要该权限。相反,这里发生的情况是,该权限甚至在早期的 android 版本上存在,而现在需要该权限的功能根本不需要任何权限。如果 android studio 认为您有不知道权限的旧代码,则会添加权限。 这应该被视为一种解决方法,直到发布修复程序。事实上,Mikkel Jørgensen 下面提到的问题没有任何进展。 我在下面添加了一些关于在哪里为没有经验的机器人(比如我自己)放置这个解决方法的细节。谢谢drmrbrewer。 即使在添加 tools:node="remove" 之后,如果我运行命令 cordova build android 它再次将权限 READ_PHONE_STATE 添加到 android manifest.xml。任何解决方案从清单文件中删除权限 READ_PHONE_STATE?跨度> 【参考方案2】:

Play Services v 12.0.0 中也存在此问题。有一个开放的issue tracker on it here。似乎这两个权限都存在问题:

android.permission.READ_PHONE_STATE android.permission.WRITE_EXTERNAL_STORAGE

正如我们在 10.0.1 修复中看到的那样(来自原始问题),它可能会在 12.0.1 中修复。

在此之前,我建议按照 drmrbrewer 的回答中所述手动从清单中删除权限。

更新 12.0.1 已于 2018 年 3 月 28 日发布,已解决此问题。 See the release notes here.

在 -license 工件中添加缺少的 minSdkVersion 以防止自动包含 READ_PHONE_STATE 和 READ_EXTERNAL_STORAGE 权限。

【讨论】:

很好的解决方案,但是如果您使用 Crashlytics + Firebase v12.0.0 + 手动删除权限的组合,它会崩溃。留在 v11.8.0 上似乎是安全的。我认为问题出在模块 'com.google.android.gms:play-services-maps:12.0.0' 我同意 - 我也保留 11.8.0 直到修复到达 请检查我的回答。它刚刚在 12.0.1 Firebase 版本中修复。 我可以确认 12.0.1 版本解决了这个问题。【参考方案3】:

更新 #2:Version 10.0.1 再次修复了该问题。

更新:这也发生在 10.0.0 版的 Google Play 服务中,如 this post 中所述。

上一个答案:

根据this post in the Android Developers G+ Community,其中一位版主(我)发表了这条评论:

我昨天已经在内部报告了这个问题,当时有开发者指出,内部已经修复,更新的 SDK 即将推出

现在可以使用更新的 SDK - 使用 9.6.1 Google Play 服务依赖项。

【讨论】:

@ianhanniballake 这在 12.0.0 版中是否再次发生?看起来 com.google.android.gms.license 有一个 targetSdkVersion @darnmason - 是的。 12.0.1 应该很快就会修复。 @ianhanniballake 感谢您的快速回复!有 12.0.1 版本的估计吗?我可能已经告诉客户我今天会发布一个版本,因为 12.0.0 预计会修复严重的崩溃 我刚刚意识到手动删除权限应该是安全的,所以现在就这样做 @darnmason - 12.0.1 现已发布并修复【参考方案4】:

如果您正在寻找与 Firebase 12.0.0 版相关的问题,只需升级到 12.0.1 版即可。 这是12.0.0的包装错误,在12.0.1中得到解决。

查看发行说明: https://developers.google.com/android/guides/releases

【讨论】:

【参考方案5】:

如果您没有使用过 Android(像我一样!)并且不确定 drmrbrewer 的 sn-p 应该放在哪里,答案就在您的主 app/manifests/AndroidManifest.xml 文件中,如下所示:

  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      package="com.your.package">

      ...

      <!-- attempt to combat this issue: https://***.com/questions/39668549/why-has-the-read-phone-state-permission-been-added -->
      <uses-permission
          android:name="android.permission.READ_PHONE_STATE"
          tools:node="remove" />
      <uses-permission
          android:name="android.permission.WRITE_EXTERNAL_STORAGE"
          tools:node="remove" />
  </manifest>

【讨论】:

【参考方案6】:

面临同样的问题。刚刚检查了谷歌发布了新版本。更新到 12.0.1 或最新版本。这个问题就会消失。

【讨论】:

以上是关于为啥添加了 READ_PHONE_STATE 权限?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SmsManager 在某些设备上需要 READ_PHONE_STATE 权限,而在其他设备上不需要?

使用 Build.VERSION.SDK_INT 会自动添加 READ_PHONE_STATE 权限吗?

警告您的 Apk 正在使用需要隐私政策的权限:(android.permission.READ_PHONE_STATE)

Unity Android READ_PHONE_STATE 权限

测试READ_PHONE_STATE的Android M权限(危险权限)

尝试获取 READ_PHONE_STATE 权限时未显示 Android 权限对话框