没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient

Posted

技术标签:

【中文标题】没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient【英文标题】:Google Cloud Endpoints + GoogleApiClient in Android without GET_ACCOUNTS permission 【发布时间】:2016-07-15 04:12:22 【问题描述】:

有没有什么方法可以在 android 应用程序中使用 GoogleApiClient 验证 Google Endpoints 而无需强制获得 GET_ACCOUNTS 权限?

具有新运行时权限的 Android 23+ 将要求用户提供不需要的 READ_CONTACTS 权限。奇怪的是,所有带有 Google Endpoints 的 Android 应用现在都需要 READ_CONTACTS 权限。

我能找到的最接近的 *** 问题是 this,但它声称它可能只能在非常有限的时间内工作。这个 Google post 提供了一些使用令牌的指导,但不适用于端点。

【问题讨论】:

如果您查看 Google 文档,唯一的方法是使用 ACCOUNTS 权限。在支持对需要身份验证的端点的请求时,您的 Android 客户端需要获取用户凭据并将其传递给服务对象。检查此page 了解更多信息。此外,在您的游戏可以对 Google Play 游戏服务进行任何调用之前,它必须首先通过使用 GoogleApiClient 对象并使用 Google Play 游戏服务对用户进行身份验证来建立与 Google Play 服务器的异步连接。 @aez - 你能参考它说你需要 GET_ACCOUNTS 的地方吗? READ_CONTACTS 仅在您正在读取联系人或获取当前用户的联系信息时才需要。 @KENdi - 是的,需要 GET_ACCOUNTS 权限是问题所在。 Android Marshmallow 及更高版本 (23+) 将 GET_ACCOUNTS 与 READ_CONTACTS(@Clayton 参见 this)权限分组,然后在运行时需要用户对 READ_CONTACTS 的权限。这对我来说意味着任何使用 Google Endpoints 的 Marshmallow 或更高版本的 Android 应用都需要在运行时获得 READ_CONTACTS 权限。 当您说“Google Endpoints”时,您是什么意思?例如,您可以在没有此权限的情况下调用游戏服务 API(无需其他权限)。 我认为正确的名称是“Google Cloud Endpoints”,描述为here。如果您使用经过身份验证的 Google Cloud Endpoints,则必须使用 GET_ACCOUNTS。所以,是的,我可以使用游戏服务 API,但如果我使用经过身份验证的 Google Cloud Endpoints 后端,我就会遇到权限问题。 【参考方案1】:

我终于找到了解决方案。我更新了答案on the question you mentioned。

为避免 1 小时令牌限制,请使用 GoogleSignInApi.silentSignIn() 在每次之前获得一个新令牌 打电话给你的端点。例如,如果您不在 UI 中 线程:

GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail()
                .requestIdToken(CLIENT_ID)
                .build();
GoogleSignInClient client = GoogleSignIn.getClient(context, options);
GoogleSignInAccount user = Tasks.await(getGoogleSignInClient(context).silentSignIn());

// Use the new user token as before 
GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport())
        .setJsonFactory(JacksonFactory.getDefaultInstance())
        .build();
credential.setAccessToken(user.getIdToken());

【讨论】:

以上是关于没有 GET_ACCOUNTS 权限的 Android 中的 Google Cloud Endpoints + GoogleApiClient的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.SecurityException:调用者 uid XXXXX 缺少任何 android.permission.GET_ACCOUNTS

权限不起作用

如何在 Android 6 中请求用户权限

Android APP启动页面动态加载全部权限

很好地获取Android用户的电子邮件地址

Android:同一用户在所有设备上的唯一 ID