Android 上的本地设备组的 Google Cloud Messaging (GCM) 给出 HTTP 错误代码 401

2024-07-01

我正在尝试让 Google Cloud Messaging (GCM) 在 Android 上与本地设备组一起使用,如上所述https://developers.google.com/cloud-messaging/android/client-device-group https://developers.google.com/cloud-messaging/android/client-device-group .

我已在 Web 控制台中启用了以下服务(https://console.developers.google.com https://console.developers.google.com ):

  • 适用于 Android 的 Google 云消息传递
  • 谷歌云发布/订阅
  • 谷歌+ API

我还创建了以下凭据:

  • API 密钥(具有指定的包名称和 SHA-1 证书密钥)
  • OAuth 2.0 客户端 ID(Web 应用程序)

我的 Android 代码如下所示(错误处理等已被删除):

String account = ACCOUNT_NAME; // E.g. "[email protected] /cdn-cgi/l/email-protection"
String scope = "audience:server:client_id:" + WEB_APPLICATION_CLIENT_ID;
String token = GoogleAuthUtil.getToken(context, account, scope);

// Token is successfully found here :-)

URL url = new URL("https://android.googleapis.com/gcm/notification");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestProperty("project_id", NUMERICAL_PROJECT_ID);
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
connection.connect();

JSONObject requestBody = new JSONObject();
requestBody.put("operation", "add");
requestBody.put("notification_key_name", "foobar");
requestBody.put("registration_ids", 
  new JSONArray(Arrays.asList(new String[]{"42", "44"})));
requestBody.put("id_token", token);

OutputStream os = connection.getOutputStream();
os.write(requestBody.toString().getBytes("UTF-8"));
os.close();

// connection.getResponseCode() is now 401

提交的 JSON 到https://android.googleapis.com/gcm/notification https://android.googleapis.com/gcm/notification看起来像这样:

{
  "operation": "add",
  "notification_key_name": "foobar",
  "registration_ids": ["42","44"],
  "id_token": "[veeeeeery long string]"
}

响应内容为:

<HTML>
<HEAD>
<TITLE>Unauthorized</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Unauthorized</H1>
<H2>Error 401</H2>
</BODY>
</HTML>

我究竟做错了什么?


找到了窍门:您正在使用谷歌帐户来获取 id_token,您需要使用确切的电子邮件作为 notification_key_name。所以如果你正在使用[电子邮件受保护] /cdn-cgi/l/email-protection,您需要使用该地址作为 notification_key_name。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 上的本地设备组的 Google Cloud Messaging (GCM) 给出 HTTP 错误代码 401 的相关文章

  • 如何从一个活动组中的活动导航到android中的另一个活动

    我有两个标签 在这两个选项卡中我有不同的活动组 如何从一个活动组中的一个活动导航到android中的另一个活动 请帮我举出合适的例子 就我而言 我确实喜欢这样 当我单击父组最后一个活动中的完成 提交按钮时 我提交了值 将值存储到服务器 数据
  • Android + PhoneGap拦截URL(相当于iOS的shouldStartLoadWithRequest)

    我的 PhoneGap 包装的 本地托管的 Sencha Touch 应用程序会进行一些虚假的 URL 回调来与本机包装器进行通信 IE app callback do function a 在iOS中我实现了以下内容 BOOL webVi
  • 如果相关服务被终止,如何更新小部件?

    我有一个录音应用程序 目前正在为其开发一个小部件 录音是由在前台状态的服务中运行的音频引擎执行的 每当音频引擎状态更改为暂停 播放 录制时 就会发送广播 并由更新小部件的接收器进行处理 这样 单击小部件中的录制按钮就会开始录制 这会导致发送
  • android下拉刷新列表视图出错

    我正在使用功能下拉来刷新library https github com chrisbanes Android PullToRefresh克里斯班斯的 但是当我尝试在我的 xml 文件中导入这个小部件时 它向我显示以下错误 请帮助我如何解决
  • Android:如何使用“uses-library”?

    我的Android应用程序可以分为客户端UI层和API层 我想将它们部署为单独的 应用程序 以便可以重用 API 层 在 Eclipse 中 我将它们编写为 2 个独立的 Android 项目 在客户端 UI 项目中 我在其构建路径中声明
  • 在 Eclipse 中打开 Android XML 布局的快捷方式

    例如 如果我有类似的东西 setContentView R layout activity main 有没有快捷方式可以打开activity main xml 如果没有 有没有办法创建一个 Its there Just hold Ctrl
  • 如果没有连接 USB 电缆,ADB over TCP/IP 无法工作

    我可以使用 USB 电缆通过 ADB 连接到我的智能手机 我还可以通过 tcp ip 连接到同一智能手机 adb connect 192 168 1 110 同时 USB 电缆仍处于连接状态 但是 一旦我断开电缆 我就会松开 tcp ip
  • Android:在服务器端验证应用程序的完整性

    我正在编写一个通过 HTTPS 与服务器应用程序进行通信的 Android 应用程序 在服务器端 我必须绝对确定 Android 应用程序的完整性 这意味着服务器应用程序需要确保它与我开发的 Android 应用程序通信 而不是与重写的应用
  • PerformException:执行“单击”时出错

    当我运行 android espresso 测试时出现错误 com google android apps common testing ui espresso PerformException 在视图 id 为 上执行 单击 时出错 我的
  • java.io.IOException:服务发现失败

    我正在开发一个 Android 应用程序 在两部配对的智能手机之间使用蓝牙连接 蓝牙逻辑基于著名的BluetoothChat SDK示例 管理服务器线程的 服务 类accept 一个客户端线程connect 和一个用于在套接字上读 写的线程
  • 如何检查设备是否可以通过有效的 WiFi 连接访问互联网?

    我指的是设备已连接到接入点但由于某种原因被阻止使用此 AP 访问互联网的情况 检查wifi是否启用 WifiManager wfManager WifiManager getSystemService Context WIFI SERVIC
  • Android Fragment 后台事务

    我正在开发一个带有片段的应用程序 它有一个 JavaScript 接口 在主 Activity 中调用 并具有片段替换逻辑 当应用程序位于前台时 一切正常 但当应用程序位于后台时 片段事务替换不起作用 当我返回应用程序时 我仍然看到旧片段
  • 什么是运行时绑定?

    根据 Android 开发者指南 Intent 是一个提供运行时绑定独立组件之间 例如两个活动 什么是 运行时绑定 继承创建类型兼容性 它允许超类引用 引用子类的对象 反过来则不然 超类引用 指的是 子类的对象 只能用于 访问继承的和重写的
  • 从 android 将用户注册到 QuickBlox 用户

    我正在尝试在我的 Android 应用程序中使用 QuickBlox 我阅读了指南并导入了示例 一切正常 我更改了一些用户可以使用 EditText 作为用户名和另一个密码登录的内容 并且效果很好 但现在我想添加一个注册按钮 使用户能够注册
  • UserRecoverableAuthException:NeedPermission

    我尝试按照教程进行操作 https developers google com android guides http auth https developers google com android guides http auth Co
  • 语音识别 API,Google Voice 会这么做吗?

    我有一个 Android 应用程序的想法 我希望能够说出命令并让应用程序监听这些命令并执行一些操作 例如 我希望我的应用程序闲置并听我的声音 当它听到我说 开始 时 应用程序将开始执行某些操作 直到我说 停止 这个想法是把手机放下 而不必实
  • 如何使用带有对话框的数字选择器

    我想使用数字选择器来获取用户的折扣百分比 一旦用户输入销售价格 我希望出现一个对话框 询问折扣百分比 我找不到将数字选择器集成到对话框中的方法 我做了一个 NumberPicker 的小演示 这可能并不完美 但您可以使用和修改它 使用自定义
  • Cache.properties(系统找不到指定的文件)

    我刚刚开始使用 Android Studio 1 3 sdk 24 直到今天它都运行良好 我收到有关 cache properties 的错误消息 并删除了该缓存文件 但现在收到此错误消息 Error C Users user1 gradl
  • 处理 Android 自定义内容提供程序中的(跨进程)异常

    我的 Android 应用程序中有一个自定义内容提供程序 运行得相当不错 我希望其他应用程序也可以访问我的内容提供商 我想要一些干净的方法来传达异常和错误 但据我所知 Android 内容提供程序框架没有提供任何跨进程传播异常的方法 我应该
  • 在这种情况下是否违反了 Google Play 开发者政策? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想通过 Android 应用程序赚一些钱 但我面临一个大问题 Google 在 Google Play 上不支持我所在的国家 地区 适用

随机推荐