Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GCM服务在两个应用程序之间通信_Java_Google Cloud Messaging - Fatal编程技术网

Java 使用GCM服务在两个应用程序之间通信

Java 使用GCM服务在两个应用程序之间通信,java,google-cloud-messaging,Java,Google Cloud Messaging,我正在尝试创建两个通过GCM服务进行通信的应用程序。 假设我正在尝试将字符串从应用程序A发送到B,然后从B发送到A 我对GCM服务很陌生,有点困惑。每次看到myApiCode,我都会在原始代码中用api代码替换它。下面是A代码: public class MainActivity extends Activity { private final String myApiKey = "903137756997"; @Override protected void onCr

我正在尝试创建两个通过GCM服务进行通信的应用程序。 假设我正在尝试将字符串从应用程序A发送到B,然后从B发送到A

我对GCM服务很陌生,有点困惑。每次看到myApiCode,我都会在原始代码中用api代码替换它。下面是A代码:

public class MainActivity extends Activity 
{
    private final String myApiKey = "903137756997";
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        final String regId = GCMRegistrar.getRegistrationId(this);
        if (regId.equals("")) {
          GCMRegistrar.register(this, "myApiCode");
        } else {
          Log.v("INFORMATION", "Already registered");
        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}
这是GCMinentService:

public class GCMIntentService extends GCMBaseIntentService
{
    private final String myApiKey = "903137756997";

    public GCMIntentService()
    {
        super("123");
    }
            ...
    @Override
    protected void onMessage(Context arg0, Intent arg1) 
    {
        Log.d("GCM", "RECIEVED A MESSAGE");
        System.out.println("123123123123");
    }
            ...

}
我附加的代码将是应用程序A,现在我将附加应用程序B的代码:

以下代码是从主活动调用的服务:

public void onCreate()
{
    super.onCreate();

    Sender sender = new Sender(myApiKey);
    Message message = new Message.Builder().build();
    Result result = null;
    try {
        result = sender.send(message, "123", 5);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    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
         }
        }
}

我必须提到的是,这两个应用都在运行,没有例外,但看起来什么都没有发生。。我猜我对这些键做了一些错误的操作,因为我仍然不明白应用程序B如何找到应用程序A。

您必须覆盖gcminentservice中的onRegistered方法。当GCM服务器返回您调用gcmregistar.register所提示的注册ID时,将调用此命令

此方法的实现应该将字符串参数上载到您控制的服务器,然后服务器可以发送以您上载的ID为目标的消息


此外,您不应以这种方式在应用程序之间直接推送消息,因为这将要求您在应用程序包中发送您的专用API密钥以发送消息。

Hi,请检查以下内容:1。在GCM注册之后,下一次执行这一行:Log.v(“信息”,“已注册”);2.您在这里使用的是您的项目ID:super(“123”);对吗?123不是我的项目id,我应该在其中使用我的项目id吗?我将super中的字符串更改为我的项目id,并在onMessage方法中设置了断点,但它从未被触发。。有一个密钥,我可以通过这条线发送:sender.send(message,“123”,5);但在另一个应用程序中,我从来没有使用过“123”键,我想我应该使用,但我不知道在哪里。。也许这就是为什么什么都没发生这里你需要使用收件人设备的注册id。选中“如何才能知道某个设备的“收件人设备的注册id”中的“发送”方法?“您也不应该以这种方式在应用程序之间直接推送消息”,然后选择哪种方式?因为这就是我要寻找的。创建一个简单的服务器,接收来自应用程序的消息,并将它们发送到其他应用程序。通过这种方式,您的常开服务器可以处理手机注册ID的更新,并且您可以在服务器上保持API密钥的私密性。听起来不错,但要接受消息,它必须实现GCM,对吗?因此它需要是一个安卓应用程序->celephone设备,对我来说听起来不像是一个服务器。那么,有没有其他方法来接受这些消息呢?如果没有一个始终在线的服务器,你就无法通过GCM创建一个可靠的网络。你需要有它来获得新的注册ID,因为它们会随着时间的推移而改变并过期。呸!真臭!我希望使用直接设备谷歌设备通信(小消息),而不必维护服务器:-(大时间悲伤的脸)