2013-05-02 122 views
3

嗨我正在尝试实施GCM推送通知。我得到一个空的GCM ID。 这里是我的代码:GCM注册ID为空

public void registerClient() { 

     try { 
     // Check that the device supports GCM (should be in a try/catch) 
     GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     regId = GCMRegistrar.getRegistrationId(this); 


     if (regId.equals("")) { 
      registrationStatus = "Registering..."; 
      GCMRegistrar.register(this, PROJECT_ID); 
      regId="sfsaas"; 
      regId = GCMRegistrar.getRegistrationId(this); 
      registrationStatus = "Registration Acquired"; 
      Log.i("******IN_IF_REGID*****", regId); 
      Log.i("INSIDE","if"); 
     } 
     else 
     { 
      Log.i("INSIDE","else"); 
      registrationStatus = "Already registered"; 
      Log.i("******REGID*****", regId); 
     } 

     } 
     catch (Exception e) { 
      e.printStackTrace(); 
      registrationStatus = e.getMessage(); 
     } 

} 

这里是我的清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.eventnotifier" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 

<permission 
    android:name="com.example.eventnotifier.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"  /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.READ_CONTACTS"/> 
    <uses-permission android:name="com.example.eventnotifier.permission.C2D_MESSAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

<!-- Camera permission --> 
    <uses-feature android:name="android.hardware.camera" /> 
<!-- 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" /> 

    <uses-permission android:name="android.permission.USE_CREDENTIALS" /> 

    <uses-permission android:name="android.permission.READ_OWNER_DATA" /> 

<!-- wake the processor if a GCM message is received --> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@android:color/black" > 

    <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.eventnotifier" /> 
     </intent-filter> 
    </receiver> 

    <service android:name=".GCMIntentService" /> 
     <activity 
      android:name="com.example.eventnotifier.HomeActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
     </activity> 

     <activity 
      android:name="com.example.eventnotifier.RegisterActivity" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
       <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
       </intent-filter> 
     </activity> 

    <activity 
     android:name="com.example.eventnotifier.DateActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.DescriptionActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.MyEventActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.CreateEventActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.LocationActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.AddGuestActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.ContactListActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.ContactTest" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.InvitedGuestsActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.MyInvitationsActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.UnregisteredGuestsActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 
    </activity> 

    <activity 
     android:name="com.example.eventnotifier.RecentGuestsActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait"> 

    </activity> 
</application> 
</manifest> 

此行是没有得到印-Log.i( “* * IN_IF_REGID * * *”,REGID );你们能帮我吗? 明天我必须提交这个项目。任何帮助将不胜感激! 谢谢

回答

2

它不这样工作。

GCMRegistrar.register向GCM服务器发起一个请求,要求它提供注册ID。这是一个异步请求。 GCMRegistrar.getRegistrationId返回注册ID的缓存值,因此如果您的设备未注册,则返回空值。

注册ID在GCMIntentService.onRegistered方法中返回。

以下是来自GCM Demo的GCMIntentService的代码。

这是GCMRegistrar.getRegistrationId代码:

/** 
* Gets the current registration id for application on GCM service. 
* <p> 
* If result is empty, the registration has failed. 
* 
* @return registration id, or empty string if the registration is not 
*   complete. 
*/ 
public static String getRegistrationId(Context context) { 
    final SharedPreferences prefs = getGCMPreferences(context); 
    String registrationId = prefs.getString(PROPERTY_REG_ID, ""); 
    // check if app was updated; if so, it must clear registration id to 
    // avoid a race condition if GCM sends a message 
    int oldVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE); 
    int newVersion = getAppVersion(context); 
    if (oldVersion != Integer.MIN_VALUE && oldVersion != newVersion) { 
     Log.v(TAG, "App version changed from " + oldVersion + " to " + 
       newVersion + "; resetting registration id"); 
     clearRegistrationId(context); 
     registrationId = ""; 
    } 
    return registrationId; 
} 

正如你所看到的,它返回的注册ID的本地存储的值。为了返回任何内容,必须调用GCMRegistrar.setRegistrationId(Context context, String regId),注册ID返回GCMIntentService。 ,这就是所谓的GCMBaseIntentService

private void handleRegistration(final Context context, Intent intent) { 
     GCMRegistrar.cancelAppPendingIntent(); 
     String registrationId = intent.getStringExtra(EXTRA_REGISTRATION_ID); 
     String error = intent.getStringExtra(EXTRA_ERROR); 
     String unregistered = intent.getStringExtra(EXTRA_UNREGISTERED); 
     Log.d(TAG, "handleRegistration: registrationId = " + registrationId + 
       ", error = " + error + ", unregistered = " + unregistered); 

     // registration succeeded 
     if (registrationId != null) { 
      GCMRegistrar.resetBackoff(context); 
      GCMRegistrar.setRegistrationId(context, registrationId); 
      onRegistered(context, registrationId); 
      return; 
     } 
    ... 
    } 
+0

所以我应该收集GCMIntentService.onRegistered方法中的regId? – Nemin 2013-05-02 19:11:12

+0

如果您调用'GCMRegistrar.register',则应该从'onRegistered'方法中收集REGID并将其传递到您的服务器。如果设备已经注册,您不必调用注册,那么您可以从GCMRegistrar获得REGID(尽管在这种情况下,您的服务器应该已经有了注册ID,所以我不明白为什么您的注册ID是“你需要得到它)。你可以调用'GCMRegistrar.isRegistered'来知道你是否已经注册,并根据它决定是否调用'register'。 – Eran 2013-05-02 19:20:50

+0

无论如何,我可以在服务中获得我的MainActivity中的regID吗?因为我将我的数据插入Mainactivity – Nemin 2013-05-02 19:30:25

0

第一次将是零,如果注册是正确的,那么下一次REGID是不会为空。

记住你GCMIntentService你SENDER_ID添加在构造

public GCMIntentService(){ 
    super(SENDER_ID); 
} 

那么你已经把它定义为PROJECT_ID,检查它是否是旁边的URL数量

https://开头code.google.com/apis/console/#project:{SENDER_ID}

你的谷歌API项目

+0

我正在获取我的GCMIntentService onRegistered()中的REGID。有没有一种方法可以将数据发送到我的活动? – Nemin 2013-05-02 19:18:12