Android GCMRegistar.getRegistrationId在第一次启动应用程序时返回空字符串

Android GCMRegistar.getRegistrationId在第一次启动应用程序时返回空字符串,android,google-cloud-messaging,Android,Google Cloud Messaging,我指的是 似乎在第一次应用程序启动时,注册ID是在oncreate()方法启动后设置的。如何将注册ID从gcmregistar.java发送回活动 我在main活动的onCreate()中调用此函数: 它在第一次启动时返回一个空字符串。在日志中,我看到注册ID稍后在gcmregistar.java中设置 static String setRegistrationId(Context context, String regId) { Log.v(TAG, "REGISTRATION ID

我指的是

似乎在第一次应用程序启动时,注册ID是在oncreate()方法启动后设置的。如何将注册ID从gcmregistar.java发送回活动

我在main活动的onCreate()中调用此函数:

它在第一次启动时返回一个空字符串。在日志中,我看到注册ID稍后在gcmregistar.java中设置

static String setRegistrationId(Context context, String regId) {
    Log.v(TAG, "REGISTRATION ID IN SET: "+regId);
    final SharedPreferences prefs = getGCMPreferences(context);
    String oldRegistrationId = prefs.getString(PROPERTY_REG_ID, "");
    int appVersion = getAppVersion(context);
    Log.v(TAG, "Saving regId on app version " + appVersion);
    Editor editor = prefs.edit();
    editor.putString(PROPERTY_REG_ID, regId);
    editor.putInt(PROPERTY_APP_VERSION, appVersion);
    editor.commit();
    return oldRegistrationId;
}
上述方法在GCMBaseIntentService中调用


如果我再次运行该应用程序,我可以获得注册。在Mainactivity中,如何实现回调函数之类的功能,以便访问注册表。主活动中的ID?

gcmregistar。如果未向GCM注册,则getRegistrationId(此)将返回空字符串。注册后,它将返回实际的注册ID。因此,他们在演示中使用if()条件检查此设备是否已注册

创建一个接口,使用带有字符串参数的抽象方法创建一个称为“GCMInterface”的接口,让您的活动实现此接口,即使用regId执行任何操作。将活动的引用传递给GCMinentService。调用GCMinentService的onREgistered方法时,调用activity.method并将regId作为参数传递

public interface GCMInterface {
    public void mOnRegistered(String id);
}

...

public class MyActivity implements GCMInterface {

    // implementation of GCMInterface interaface
    public void mOnRegistered(String id) {
        // do whatever you want to do with id
    }
}
...
public class GCMIntentService extends GCMBaseIntentService {


    GCMInterface interface;   // initialize it with your activity's context
    public GCMIntentService() {
    }

    @Override
    protected void onRegistered(Context context, String regId) {
        // call mOnRegistered method with your activity's context like
        interface = (GCMInterface)context;
        if(interface != null) {
            interface.mOnRegistered(regId);
        }

    }

}

希望你明白我的意思。

你好,阿比,是的,我是这么想的。当我尝试调用gcmregistar.getRegistrationId时(这个);在GCMRegistar.register之后(这是发送方ID);它仍然返回一个空字符串,因此我假设整个过程是异步的。问题是如何在某个回调函数中将regID从GCMRegistar带到我的活动中。不…,请确保在注册到GCM服务器后它将返回regID。首先检查您是否可以使用GCM注册我做了,在上面的代码中,setRegistrationId在日志中显示regId,我只需要在我的主要活动中使用它。@dan:我也面临着同样的问题,您是否得到了解决方案,如果是的话,请不要特别说明,最后,我使用了一个phonegap插件:嗨,Khawar,有一个问题就是如何将活动的引用传递给GCMinentService?activitycontext不知道注册的方法。无论如何,谢谢你。当你调用gcmregistar.register(上下文,PROJECT_ID)时,这里的上下文应该是你活动的上下文。您可以简单地在onRegistered(String regId)中调用context.mOnRegistered(regId)作为我的错误,它与我在gcmregistar.register(context,PROJECT_ID)中引用的上下文相同。我明白了,然后我在register类中获得了我的主要活动的上下文,但是如何从那里将其传递给IntentService?我非常感谢您的快速帮助,但是context.mOnRegistered(regId)在onRegistered(stringregid)中没有定义。很抱歉,我用了错误的方式。我已经更新了我的答案。我希望它现在能起作用。我也面临着完全相同的问题……这里运气好吗?
public interface GCMInterface {
    public void mOnRegistered(String id);
}

...

public class MyActivity implements GCMInterface {

    // implementation of GCMInterface interaface
    public void mOnRegistered(String id) {
        // do whatever you want to do with id
    }
}
...
public class GCMIntentService extends GCMBaseIntentService {


    GCMInterface interface;   // initialize it with your activity's context
    public GCMIntentService() {
    }

    @Override
    protected void onRegistered(Context context, String regId) {
        // call mOnRegistered method with your activity's context like
        interface = (GCMInterface)context;
        if(interface != null) {
            interface.mOnRegistered(regId);
        }

    }

}