Android GCM错误。当客户端已注册时,服务器返回未注册。

12
我按照http://developer.android.com/google/gcm/gs.html提供的演示进行了尝试,并成功地使试用应用程序GCMTrial正常工作。
但是,我尝试在现有应用程序上遵循相同的步骤,但并未成功。因此,我创建了一个全新的项目。即使如此,遵循完全相同的步骤,我仍然无法成功发送GCM消息。所以我尝试将GCMTrial重命名为所需的名称,但这也不起作用。
我通过主要活动注册GCM并获得以下日志:
12-19 21:30:13.102: V/GCMRegistrar(15889): Registering receiver
12-19 21:30:13.112: D/GCMBaseIntentService(15889): handleRegistration: registrationId =         XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX, error = null, unregistered = null
12-19 21:30:13.112: D/GCMRegistrar(15889): resetting backoff for com.XXX.XXX
12-19 21:30:13.117: V/GCMRegistrar(15889): Saving regId on app version 1

但是当我尝试发送GCM消息时,它返回以下错误

[ errorCode=NotRegistered ]

客户端代码:

public class MainActivity extends Activity {
TextView tve;
String TAG = "GCMTrial";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    final String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
        GCMRegistrar.register(this, "XXXXXX");
        Log.v(TAG, "Reg");
    } else {
        Log.v(TAG, "Already registered");
    }
}

GCMIntentService : 
public class GCMIntentService extends GCMBaseIntentService {
@Override
protected void onError(Context arg0, String arg1) {
    // TODO Auto-generated method stub
}
@Override
protected void onMessage(Context arg0, Intent arg1) {
    // TODO Auto-generated method stub
    Log.d("GCM", "RECIEVED A MESSAGE");
    // Get the data from intent and send to notificaion bar
}
@Override
protected void onRegistered(Context arg0, String arg1) {
    // TODO Auto-generated method stub
}
@Override
protected void onUnregistered(Context arg0, String arg1) {
    // TODO Auto-generated method stub
}

Manifest: 清单文件:

Server Code: 服务器代码:

System.out.println("Sending GCM");
    String key = "XXX"; //Server API key taken from the site
    clientID = "XXXXXXXXX"; // copied from the logs
    Sender sender = new Sender(key);
    Message message = new Message.Builder().build();
    Result result = sender.send(message, clientID, 1);
    System.out.println(result.toString());

这让我感到很疯狂...在Android手机上显示已注册,甚至调用了GCMIntentService类的onRegistered方法...但当我尝试发送消息时,它会标记为“NotRegistered Error”...

我不知道我做错了什么...请帮帮我吧...


我完全不知道发生了什么事情。 但是,我重新安装了Android的GCM扩展程序,再次创建了一个全新的应用程序,这一次它成功了!! :) 我使用了 MulticastResult result = sender.send(message, devices, 5); 而不是 Result result = sender.send(message, clientID, 1); 不知道那是否是问题所在,但现在它可以工作了...! - user1657709
我认为你重新安装后能够正常运行的原因是因为你已经申请了一个新的注册ID。 - neferpitou
3个回答

11

现在,在使用adb安装时存在一个当前的bug。

GCMRegistrar不知道设备已在GCM服务器上取消注册,因此无法注册。

你可以尝试强制进行注册:

if (regId.equals("")) {
        GCMRegistrar.register(this, "XXXXXX");
        Log.v(TAG, "Reg");
    } else {
        //I SAY BULLSHIT !
        GCMRegistrar.register(this, "XXXXXX");
        Log.v(TAG, "Reg");
    }

或者在客户端上卸载该应用程序,然后通过 Adb 运行新的安装。

请记住,在生产中这种情况发生的可能性很小。


0

你忘记在你的 GCMIntentService 中添加构造函数了

请将以下内容添加到你的 GCMIntentService

public GCMIntentService(){
        super(SENDER_ID);
    }

SENDER_ID 是用于注册您的应用程序的 XXXXXXX。


我试过了...服务器一直返回一个"NotRegistered"错误...还有其他建议吗? - user1657709
在我的情况下,我将谷歌提供给我的发送者ID添加到了从服务器发送的请求中。但是我使用ASP.Net发送请求。 - Husam A. Al-ahmadi
它不是SENDER_ID,它是THREAD的名称,不必须是SEND_ID,可以是任何字符串。 - neferpitou

0
你可以尝试将上下文“this”替换为“getApplicationContext()”以使用应用程序上下文。这是我的示例代码:
private void registerGCM() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) {
        //prevent crash caused by no google account or not support for gcm
        try {
            GCMRegistrar.checkDevice(this);
        } catch (Exception e) {
            Log.i("test", "!!!cgm " + e.toString());
            return;
        }
    }

    final String regId = GCMRegistrar.getRegistrationId(this);
    if (TextUtils.isEmpty(regId)) {
        String gcmSenderId = PreferencesUtil.getStringPreference(PreferencesUtil.SETTING_GCM_SENDER_ID,
                "", getApplicationContext());
        GCMRegistrar.register(getApplicationContext(), gcmSenderId);
    }
    mGCMRegisted = true;
}

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