3

它没有从 GCM 服务器获取注册 ID,应用程序没有给出任何错误,这是我的 logcat。

    07-13 16:43:39.920: I/** pushAndroidActivity **(5310): inside oncreate() 
07-13 16:43:39.920: I/** pushAndroidActivity **(5310): started registration 
07-13 16:43:39.920: D/GCMRegistrar(5310): resetting backoff for com.example.registration_id
07-13 16:43:39.920: V/GCMRegistrar(5310): Registering app com.example.registration_id of senders 803641917196
07-13 16:43:42.735: V/GCMBroadcastReceiver(5310): onReceive: com.google.android.c2dm.intent.REGISTRATION
07-13 16:43:42.735: V/GCMBroadcastReceiver(5310): GCM IntentService class: com.example.registration_id.GCMIntentService
07-13 16:43:42.735: V/GCMBaseIntentService(5310): Acquiring wakelock

这是主要的活动。我使用现有的 gcm.jar 文件来使用 GCMRegistrar 类方法。

package com.example.registration_id;

import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.app.Activity;

import com.google.android.gcm.GCMRegistrar;

public class MainActivity extends Activity {


    private String TAG = "** pushAndroidActivity **";
    EditText edittext;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.i(TAG, "inside oncreate() ");




        //check if registered,if not get registration id from GCM server
        if(GCMRegistrar.getRegistrationId(this).equals(""))
        {
            Log.i(TAG, "started registration ");
            GCMRegistrar.register(this, "803641917206");

        }
        else
        {
        final String regId = GCMRegistrar.getRegistrationId(this);
        Log.i(TAG, "registration id =====  "+regId);

        edittext=(EditText)findViewById(R.id.msg);
        edittext.setText(regId);
        }
    }




}

这是服务等级-

package com.example.registration_id;

import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.google.android.gcm.GCMBaseIntentService;

public class GCMIntentService extends GCMBaseIntentService {

    private static final String TAG = "===GCMIntentService===";



    //default constructor
    protected GCMIntentService(String senderId) {
        super(senderId);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onError(Context arg0, String arg1) {
        // TODO Auto-generated method stub
        Log.i(TAG, "error ");
    }

    @Override
    protected void onMessage(Context arg0, Intent arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onRegistered(Context arg0, String registrationId) {
        // TODO Auto-generated method stub
        Log.i(TAG, "Device registered: regId = " + registrationId);

    }

    @Override
    protected void onUnregistered(Context arg0, String arg1) {
        // TODO Auto-generated method stub

    }

}
4

3 回答 3

4
onReceive: com.google.android.c2dm.intent.REGISTRATION

onReceiver 正在被调用,这意味着您正在收到一条消息。

  protected GCMIntentService(String senderId) {
      super(senderId);                }  

这是你的问题。您必须为您的 GCMBaseIntentService 子类声明一个公共的、无参数的构造函数。否则,您的 GCMIntentService 类将无法被后台服务正确构建和使用。

为什么?

protected GCMIntentService(String senderID){
super(senderId);}

因为这个受保护的构造函数对处理所有传入意图的服务类不可见,因为它位于不同的包中。

将 senderId 硬编码到 GCMIntentService 类中的静态常量中,因为这不会再从谷歌改变。

于 2012-07-13T12:11:22.127 回答
1

请注意:GCM IntentService 类:com.example.registration_id.GCMIntentService

GCMIntentService 类放在哪里(在哪个包中)?

检查清单文件以确保为 GCMIntentService 设置正确的包。

于 2013-03-18T02:56:13.670 回答
-1

也检查此解决方案将所有 GCM 相关类保留在主包中,您调用注册的地方。

Android 编程:GCMIntentService 卡在 WakeLock

于 2013-06-10T08:19:29.073 回答