2012-10-22 94 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 如果你想我可以送你我的資源庫和應用程序)。我絕望了:) –