【问题标题】:GET_ACCOUNTS permission while using GCM - Why is this needed?使用 GCM 时获得 GET_ACCOUNTS 权限 - 为什么需要这样做?
【发布时间】:2013-08-28 22:46:06
【问题描述】:

我有一个应用,实现了推送通知。

我想了解在实现 GCM 时我们需要“GET_ACCOUNTS”(android.permission.GET_ACCOUNTS) 的原因?一些用户对此权限表示担忧。我已经在清单中使用了这个权限,因为它在官方网站here 中给出。

这个权限有多安全?如果我从清单中删除它,推送通知会起作用吗?

【问题讨论】:

  • 您是否尝试过在没有 GET_ACCOUNTS 权限的情况下推送通知?似乎尝试它比询问并等待答复要快。一旦你知道,请将你的结果作为答案发布。
  • GET_ACCOUNT 用于验证用户是否在移动端同步了谷歌账户,并为每个用户(每个谷歌账户)生成键值。如果设备运行的版本低于 Android 4.0.4,则这是必需的。
  • Okie.. 除了将其保留在清单中之外,还有其他方法吗?
  • 对我来说,无需该许可,它在任何操作系统上都可以正常工作。

标签: android push-notification google-cloud-messaging


【解决方案1】:

它使用现有的 Google 服务连接。对于 3.0 之前的版本 设备,这需要用户在他们的 移动设备。设备不需要 Google 帐户 运行 Android 4.0.4 或更高版本。

所以这就是需要权限的原因

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

读取 Google 帐户。

阅读更多关于这个GCM Overview


GCM 不再需要登录 Google 帐户。因此您不需要 android.permission.GET_ACCOUNTS 权限。

如果您使用带有GoogleCloudMessaging.register 的 GCM API),您不再需要在任何 Android 版本上配置 Google 帐户。但是,如果您使用的是已弃用的库 (GCMRegistrar.register),您仍然需要在旧版本(ICS 之前)上使用 Google 帐户。

更多详情请访问https://groups.google.com/forum/#!topic/android-gcm/ecG-RfH-Aso。另一个类似的线程是Why google Account login is required for GCM to work for devices below 4.0.4 OS?

【讨论】:

  • Okie.. 有没有其他方法可以做到这一点,而不在清单中给出?
  • @VamsiChalla:所有权限都必须在清单中。但是,如果您的 android:minSdkVersion 设置为 14 或更高,我会将文档解释为您不需要此权限。
  • 没有。此任务由 Google 服务完成,您的应用程序无法更改。另一件事是,当您想在 Android 中读取帐户时,将需要此权限。所以最后你必须添加这个权限。尽管您可以在应用程序的信息页面中添加有关此权限的一些描述,以使用户清楚。
  • android 4.0.4以下不使用get_accounts权限,不会收到通知或者应用崩溃?
  • 请阅读Eran的回答。任何设备都不再需要此权限。 Eran 的答案现在是正确的。
【解决方案2】:

GCM 工作不再需要 GET_ACCOUNTS 权限。过去注册 GCM 需要它,但最近的 Play 服务更新停止使用 Google 帐户,即使在 Froyo 和 Gingerbread 上也是如此。如果您使用 Play 服务(即使用 GoogleCloudMessaging.register)注册到 GCM,则在任何 Android 版本上都不再需要此权限。如果您使用的是已弃用的库 (GCMRegistrar.register),您仍需要 4.0.4 之前版本的 Google 帐户,这需要该权限。

Source(由 Google 开发人员发布在 android-gcm Google Group 上):

一些背景:

Froyo 和 Gingerbread 注册在 GoogleServicesFramework,使用谷歌账号进行注册。 这导致帐户所在的人出现很多身份验证错误 状态不太好。

从 ICS 开始,GCM 不依赖或使用 Google 帐户 - 您 可以在添加帐户之前使用它,也可以在没有任何帐户的情况下使用它。

“播放服务”更新正在所有平台上实施新方案 设备 - 但似乎少数设备存在问题 这个,我们正在调查 - 但数字远低于那些 使用旧方案。

【讨论】:

    【解决方案3】:

    正如这里的其他人所说,低于 4.0.4 的 Android 设备需要 GET_ACCOUNT

    如果你和我一样,已经安装了一个自动添加这个权限的库,但你不需要它,你可以通过添加tools:node="remove"属性的权限来告诉AndroidManifest删除权限。

    在您的AndroidManifest.xml 文件中,确保它在您的manifest 标记中定义了xmlns:tools 属性,然后使用remove 设置添加权限:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              ...>
    
      ...
    
      <uses-permission android:name="android.permission.GET_ACCOUNTS" tools:node="remove" />
    
      ...
    
    </manifest>
    

    警告说这实际上对我没有用,但我知道它对其他人有用。如果您能看到我可能做错了什么或有更多相关信息,请发表评论!

    *编辑:打开了一个错误报告以使此功能正常工作: https://bugzilla.xamarin.com/show_bug.cgi?id=48153

    【讨论】:

    • 似乎是旧帖子,但它也不适用于我。所以我在阅读 android 文档后所做的就是在用户权限 android:maxSdkVersion="SOME NUMBER OF API THAT YOU DO NOT SUPPORT" 以及 tools:node="remove" 中添加了这个附加属性。它奏效了。
    • @Devesh 非常感谢您提供的额外信息。我还编辑了我的帖子并添加了此功能的错误报告。
    【解决方案4】:

    当你使用时

    编译'com.google.android.gms:play-services:7.5.0' 添加 build.gradle 文件意味着自动添加 GET_ACCOUNT 权限。

    • 例如,如果开发人员必须在项目中仅使用 admob 意味着仅在 build.gradle 文件中指定此权限 编译 'com.google.android.gms:play-services-ads:7.5.0' 如果有任何其他澄清,请参阅此链接https://developers.google.com/android/guides/setup

    【讨论】:

      【解决方案5】:

      我认为事实并非如此。我使用新的 Gmail 帐户在刚恢复出厂设置的 Gingerbread 设备上对其进行了测试,如果没有该权限,我可以正常接收 GCM 消息。所以文档是错误的。

      【讨论】:

        【解决方案6】:

        GET_ACCOUNT 用于验证用户是否在手机中同步了谷歌账户,并为每个用户(每个谷歌账户)生成键值。如果设备运行的版本低于 Android 4.0.4,则这是必需的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多