2013-08-06 20 views
2

我一直在努力为我的应用程序获取设备ID。这里是我的代码GCMRegistrar.getRegistrationId(上下文)无法获取设备ID

此代码是从我的类

GCMRegistrar.checkDevice(this); 
GCMRegistrar.checkManifest(this); 
device_key = GCMRegistrar.getRegistrationId(this); 

此代码是从清单文件

<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.k2b.kluebook" /> 
     </intent-filter> 
    </receiver> 
    <service android:name=".GCMIntentService" /> 

我在主包写GCMIntentService类。

public class GCMIntentService extends GCMBaseIntentService { 

private static final String TAG = "GCMIntentService"; 

public GCMIntentService() { 
    super(SENDER_ID); 
} 

/** 
* Method called on device registered 
**/ 
@Override 
protected void onRegistered(Context context, String registrationId) { 
    Log.i(TAG, "Device registered: regId = " + registrationId); 
    displayMessage(context, "Your device registred with GCM"); 
    Log.d("NAME", "gcm"); 
    ServerUtilities.register(context, "gcm", "gcm", registrationId); 
} 

/** 
* Method called on device un registred 
* */ 
@Override 
protected void onUnregistered(Context context, String registrationId) { 
    Log.i(TAG, "Device unregistered"); 
    displayMessage(context, getString(R.string.gcm_unregistered)); 
    ServerUtilities.unregister(context, registrationId); 
} 

/** 
* Method called on Receiving a new message 
* */ 
@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.i(TAG, "Received message"); 
    String message = intent.getExtras().getString("mes"); 
    displayMessage(context, message); 
    // notifies user 
    generateNotification(context, message); 
} 

/** 
* Method called on receiving a deleted message 
* */ 
@Override 
protected void onDeletedMessages(Context context, int total) { 
    Log.i(TAG, "Received deleted messages notification"); 
    String message = getString(R.string.gcm_deleted, total); 
    String key = "failed"; 
    displayMessage(context, message); 
    // notifies user 
    generateNotification(context, message); 
} 

/** 
* Method called on Error 
* */ 
@Override 
public void onError(Context context, String errorId) { 
    Log.i(TAG, "Received error: " + errorId); 
    displayMessage(context, getString(R.string.gcm_error, errorId)); 
} 

@Override 
protected boolean onRecoverableError(Context context, String errorId) { 
    // log message 
    Log.i(TAG, "Received recoverable error: " + errorId); 
    displayMessage(context, 
      getString(R.string.gcm_recoverable_error, errorId)); 
    return super.onRecoverableError(context, errorId); 
} 

/** 
* Issues a notification to inform the user that server has sent a message. 
*/ 
private static void generateNotification(Context context, String message) { 
    int icon = R.drawable.ic_launcher; 
    long when = System.currentTimeMillis(); 
    NotificationManager notificationManager = (NotificationManager) context 
      .getSystemService(Context.NOTIFICATION_SERVICE); 
    Notification notification = new Notification(icon, message, when); 
    String title = context.getString(R.string.app_name); 
    Intent notificationIntent = new Intent(context, 
      FragmentOpenActivity.class); 
    notificationIntent.putExtra(key, key); 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
      | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    PendingIntent intent = PendingIntent.getActivity(context, 0, 
      notificationIntent, 0); 
    notification.setLatestEventInfo(context, title, message, intent); 
    notification.flags |= Notification.FLAG_AUTO_CANCEL; 
    notification.defaults |= Notification.DEFAULT_SOUND; 
    notification.defaults |= Notification.DEFAULT_VIBRATE; 
    notificationManager.notify(0, notification); 

} 

}

这么多的搜索是通过我做的一切,但我不能找到这个解决方案,我想很多开发商都具有相同的问题,但我不能找到我的这个错误。请帮我找到解决办法

+0

LogCat中有任何错误吗?您是否尝试使用多个不同的设备? –

+0

我在模拟器,bluestack和android 4.1中也尝试过。 –

+0

你有什么在你的logCat? –

回答

1

好吧,让我把我在这里做的:

  1. 首先,你必须创建项目在谷歌和得到SENDER_ID。
  2. 然后,我有这样的方法来registerGCM并调用它的OnCreate:

private void registerGCM() { 
     // Make sure the device has the proper dependencies. 
     GCMRegistrar.checkDevice(getApplicationContext()); 

     // Make sure the manifest was properly set - comment out this line 
     // while developing the app, then uncomment it when it's ready. 
     GCMRegistrar.checkManifest(getApplicationContext()); 
     GCMRegistrar.register(getApplicationContext(), GCMIntentService.SENDER_ID); 
     if (GCMRegistrar.isRegistered(getApplicationContext())) { 
      String registrationCGMId = GCMRegistrar.getRegistrationId(getApplicationContext()); 
     }else{ 
      GCMRegistrar.register(getApplicationContext(), GCMIntentService.SENDER_ID); 
     } 
    } 

如果错误仍然存​​在,检查谷歌Play应用程序(如果它正常工作),互联网连接或手机时钟时间。

+0

我试过调试模式,这很有趣。第一次它跳过if条件并执行else语句,然后如果我回来然后转到另一个活动,它会执行if条件并在注册后显示设备ID –

+0

我只能在设备ID之前获得设备ID得到它 –

+1

当然,因为注册是在后台完成的。所以如果你想强迫设备ID在同一个活动中,你将不得不检查你是否已经有设备ID。在我的应用程序中,我有一个需要设备ID的表单,所以我必须验证字段,看看我是否已经有设备ID ..如果我没有,我再次调用该方法来重新注册,直到有ID 。 –