2012-10-22 92 views
0

我有一个重要的交付,我希望你能帮助我。GCM:注册设备[GCMRegistrar.register(this,SENDER_ID)]

我必须使用GCM。 我正在使用官方指南中的文件http://developer.android.com/guide/google/gcm/demo.html

我做了“使用App Engine for Java设置服务器”,它工作正常。

我的问题是Android应用程序。确切地说,我不收回GCM的ID,所以任何时候我的应用程序尝试注册。

非常感谢....

public class DemoActivity extends Activity { 

    TextView mDisplay; 
    AsyncTask<Void, Void, Void> mRegisterTask; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     checkNotNull(SERVER_URL, "SERVER_URL"); 
     checkNotNull(SENDER_ID, "SENDER_ID"); 

     // Make sure the device has the proper dependencies. 
     GCMRegistrar.checkDevice(this); 
     // Make sure the manifest was properly set - comment out this line 
     // while developing the app, then uncomment it when it's ready. 
     GCMRegistrar.checkManifest(this); 
     setContentView(R.layout.main); 
     mDisplay = (TextView) findViewById(R.id.display); 
     registerReceiver(mHandleMessageReceiver, 
       new IntentFilter(DISPLAY_MESSAGE_ACTION)); 
     final String regId = GCMRegistrar.getRegistrationId(this); 
     if (regId.equals("")) { 

      // Automatically registers application on startup. 
      GCMRegistrar.register(this, SENDER_ID); 

     } else { 
      .... 
     } 

CommonUtilities

public final class CommonUtilities 
{ 
    static final String SERVER_URL = "http://127.0.0.1:8888/gcmdemo4/home"; 
    static final String SENDER_ID = "843761346XXX"; 
... 
} 

GCMIntentService

public class GCMIntentService extends GCMBaseIntentService { 

@SuppressWarnings("hiding") 
private static final String TAG = "GCMIntentService"; 

public GCMIntentService() { 
    super(SENDER_ID); 
} 

@Override 
public void onRegistered(Context context, String registrationId) { 
    Log.i(TAG, "Device registered: regId = " + registrationId); 
    displayMessage(context, getString(R.string.gcm_registered)); 
    ServerUtilities.register(context, registrationId); 
} 
..... 

MY清单

<?xml version="1.0" encoding="utf-8"?> 
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.registrazionegcm" 
    android:versionCode="1" 
android:versionName="1.0" > 
<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="16" /> 
<permission 
    android:name="com.example.registrazionegcm.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.registrazionegcm.permission.C2D_MESSAGE" /> 
<!-- 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" /> 
<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:name="DemoActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <receiver 
     android:name="com.google.android.gcm.GCMBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

      <category android:name="com.example.registrazionegcm" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GCMIntentService" /> 
</application> 

回答

1

你能提供你的 “registerReceiver” 的代码。

我有同样的问题,当我的SENDER_ID错了。 尝试检查一遍,太检查你的包:com.example.registrazionegcm.GCMIntentService 把一些断点的onError和onRegistered

对于我来说,此代码的工作:

@Override 
public void run() { 

    GCMRegistrar.checkDevice(mContext); 
    GCMRegistrar.checkManifest(mContext); 
    String deviceToken = GCMRegistrar.getRegistrationId(mContext); 
    if (deviceToken.equals("")) { 
     GCMRegistrar.register(mContext, "XXXXXXXXXXXXXXX"); 
     deviceToken = GCMRegistrar.getRegistrationId(mContext); 
     if(!deviceToken.equals("")){ 
      GCMRegistrar.setRegisteredOnServer(mContext, true); 
      // register deviceToken on CommNotes srv 
      RequestMaker req = new RequestMaker(Constant.REQ_REGISTER_GCM, mContext); 
      //if unsuccessful, try again 5 times 
      for(int i = 0; i<5; i++){ 
       Log.d("ComNotes", "registration id"+deviceToken); 
       if(req.doRequest(deviceToken) == ReturnCode.CODE_OK){ 
        break; 
       }    
      } 
     } 
     //TODO manage unsuccess: display error : "No PUSH available" 
    } else { 
     Log.v("CommunityNotes", "Already registered "+deviceToken); 
    } 
} 
+0

我SenderID是正确的,因为我从 https://code.google.com/apis/console/#project:843761346XXX 你有问题GCMRegistrar.checkDevice(mContext)? ,因为我没有使用库gcm.jar,因为我的应用程序在这里崩溃,所以我使用正确包中库中的源代码,因为我评论了此方法中的一些行。 –

+0

是的,我使用gcm.jar和checkDevice没有问题。什么是你的应用程序的Android版本? – Stephane

+0

安卓的minSdkVersion =“8” 机器人:targetSdkVersion =“16” 模拟器4.1 如果你想我可以送你我的资源库和应用程序)。我绝望了:) –