将安卓设备作为服务器直接向GCM发送消息

5

有没有可能让我的安卓设备作为服务器来发送GCM消息给另一个设备?我知道使用Web服务等方式可以实现,但我想只使用安卓设备直接发送GCM消息。

谢谢。

1个回答

1

编写Android设备上的服务器端应用程序:

将SDK的gcm-server/dist目录中的gcm-server.jar文件复制到您的服务器类路径中。

创建一个Servlet(或其他服务器端机制),可供Android应用程序用于发送由GCM接收的注册ID。该应用程序还可能需要发送其他信息,例如用户的电子邮件地址或用户名,以便服务器可以将注册ID与拥有该设备的用户关联起来。同样,创建一个Servlet用于注销注册ID。当服务器需要向注册ID发送消息时,它可以使用GCM库中的com.google.android.gcm.server.Sender帮助类。

For example:
import com.google.android.gcm.server.*;

Sender sender = new Sender(myApiKey);
Message message = new Message.Builder().build();
MulticastResult result = sender.send(message, devices, 5);

上面的代码片段执行以下操作:
使用项目的API密钥创建一个Sender对象。 使用给定的注册ID创建一条消息(消息构建器还具有设置所有消息参数(如折叠键和有效负载数据)的方法)。 发送消息,最多重试5次(以防GCM服务器不可用),并将响应存储在结果中。 现在需要解析结果,并在以下情况下采取适当的措施:
如果消息已创建但结果返回了规范化的注册ID,则需要使用规范化的注册ID替换当前注册ID。 如果返回的错误是NotRegistered,则需要删除该注册ID,因为应用程序已从设备中卸载。 以下是处理这两种情况的代码片段:
if (result.getMessageId() != null) {
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) {
   // same device has more than on registration ID: update database
 }
} else {
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
   // application has been removed from device - unregister database
 }
}

所需权限为:

    <!-- App receives GCM messages. -->
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <!-- GCM connects to Google Services. -->
    <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- GCM requires a Google account. -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <!-- Keeps the processor from sleeping when a message is received. -->
    <uses-permission android:name="android.permission.WAKE_LOCK" />
<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> 

此外,您需要:com.google.android.c2dm.permission.SEND权限 有关更多信息,请进一步探索。请不要在您没有充分了解事情之前询问工具。推荐链接

谢谢Arpit Garg,我已经完成了这个任务。 但是我想直接从一个设备向另一个设备发送GCM消息,使用硬编码的Regid。我想消除Web服务器或Servlet的双向通信。 这可能吗? - Roodie
@Roodie 在提供的代码中,无需使用Web服务器或Servlet。只需通过使用硬编码的regid在应用程序中提供发送和接收控件,并在两个设备上启动应用程序即可。您可以按照需要进行通信。但请确保需要云,因此中介者只能是云。 - Arpit Garg
它对我没用。 发送方是否需要在清单中描述特定权限? 你试过了吗? - Roodie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接