我遇到GCM的问题,它在Nexus 7上运行得很好,但是当我在任何使用Gingerbread版本onRegistered方法的设备上运行它时,从未调用过。
请参阅下面的代码实现:
GMCIntentService
public class GCMIntentService extends GCMBaseIntentService { private static final String TAG = "GCMIntentService"; private RestHelper restRegisterGCM; private String userRegisterGCMUrl = "User/SetGcm"; public GCMIntentService() { super(AppSettings.SENDER_ID); } /** * Method called on device registered **/ @Override protected void onRegistered(Context context, String registrationId) { Log.i(TAG, "Device registered: regId = " + registrationId); // Util.displayMessage(context, "Your device registred with GCM"); if (!GCMRegistrar.isRegisteredOnServer(this)) { restRegisterGCM = new RestHelper(userRegisterGCMUrl, RequestMethod.POST, context); restRegisterGCM.setHeader("UserName", AppSettings.getInstance().getUsername(context)); restRegisterGCM.setHeader("Password", AppSettings.getInstance().getPassword(context)); restRegisterGCM.setParameter("regId", registrationId); restRegisterGCM.execute(); } } /** * Method called on device un registred * */ @Override protected void onUnregistered(Context context, String registrationId) { Log.i(TAG, "Device unregistered"); } /** * 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("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"); } /** * Method called on Error * */ @Override public void onError(Context context, String errorId) { Log.i(TAG, "Received error: " + errorId); Toast.makeText(context, getString(R.string.gcm_error, errorId), Toast.LENGTH_SHORT).show(); } @Override protected boolean onRecoverableError(Context context, String errorId) { // log message Log.i(TAG, "Received recoverable error: " + errorId); Toast.makeText(context, getString(R.string.gcm_recoverable_error, errorId), Toast.LENGTH_SHORT).show(); return super.onRecoverableError(context, errorId); }GMC注册方法
private void registerGCM() {
// Make sure the device has the proper dependencies. GCMRegistrar.checkDevice(this); Boolean accountExists = false; AccountManager am = AccountManager.get(getApplicationContext()); Account[] accounts = am.getAccounts(); for (Account account : accounts) { if (account.type.equals("com.google")) { accountExists = true; break; } } if (accountExists) { // Get GCM registration id String regId = GCMRegistrar.getRegistrationId(this); // Check if regid already presents if (regId.equals("")) { // Registration is not present, register now with GCM GCMRegistrar.register(this, AppSettings.SENDER_ID); } else { // Device is already registered on GCM if (!GCMRegistrar.isRegisteredOnServer(this)) { restRegisterGCM = new RestHelper(userRegisterGCMUrl, RequestMethod.POST, EvadoFilipActivity.this); restRegisterGCM.setHeader("UserName", AppSettings.getInstance().getUsername(EvadoFilipActivity.this)); restRegisterGCM.setHeader("Password", AppSettings.getInstance().getPassword(EvadoFilipActivity.this)); restRegisterGCM.setParameter("regId", regId); restRegisterGCM.setPostExecuteMethod(2); restRegisterGCM.execute(); } } } else Toast.makeText(this, R.string.gcm_google_account_missing, Toast.LENGTH_SHORT).show(); }更新:
我已经重命名了包,忘记在课堂上更改它:
public class GCMBroadcastReceiver extends com.google.android.gcm.GCMBroadcastReceiver{ @Override protected String getGCMIntentServiceClassName(Context context) {
return "com.mypackage.services.GCMIntentService"; } }I am having problem with GCM, it works just fine on Nexus 7 but when I run it on any device with Gingerbread version onRegistered method is never called.
See my code implementation belowe:
GMCIntentService
public class GCMIntentService extends GCMBaseIntentService { private static final String TAG = "GCMIntentService"; private RestHelper restRegisterGCM; private String userRegisterGCMUrl = "User/SetGcm"; public GCMIntentService() { super(AppSettings.SENDER_ID); } /** * Method called on device registered **/ @Override protected void onRegistered(Context context, String registrationId) { Log.i(TAG, "Device registered: regId = " + registrationId); // Util.displayMessage(context, "Your device registred with GCM"); if (!GCMRegistrar.isRegisteredOnServer(this)) { restRegisterGCM = new RestHelper(userRegisterGCMUrl, RequestMethod.POST, context); restRegisterGCM.setHeader("UserName", AppSettings.getInstance().getUsername(context)); restRegisterGCM.setHeader("Password", AppSettings.getInstance().getPassword(context)); restRegisterGCM.setParameter("regId", registrationId); restRegisterGCM.execute(); } } /** * Method called on device un registred * */ @Override protected void onUnregistered(Context context, String registrationId) { Log.i(TAG, "Device unregistered"); } /** * 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("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"); } /** * Method called on Error * */ @Override public void onError(Context context, String errorId) { Log.i(TAG, "Received error: " + errorId); Toast.makeText(context, getString(R.string.gcm_error, errorId), Toast.LENGTH_SHORT).show(); } @Override protected boolean onRecoverableError(Context context, String errorId) { // log message Log.i(TAG, "Received recoverable error: " + errorId); Toast.makeText(context, getString(R.string.gcm_recoverable_error, errorId), Toast.LENGTH_SHORT).show(); return super.onRecoverableError(context, errorId); }GMC registration method
private void registerGCM() {
// Make sure the device has the proper dependencies. GCMRegistrar.checkDevice(this); Boolean accountExists = false; AccountManager am = AccountManager.get(getApplicationContext()); Account[] accounts = am.getAccounts(); for (Account account : accounts) { if (account.type.equals("com.google")) { accountExists = true; break; } } if (accountExists) { // Get GCM registration id String regId = GCMRegistrar.getRegistrationId(this); // Check if regid already presents if (regId.equals("")) { // Registration is not present, register now with GCM GCMRegistrar.register(this, AppSettings.SENDER_ID); } else { // Device is already registered on GCM if (!GCMRegistrar.isRegisteredOnServer(this)) { restRegisterGCM = new RestHelper(userRegisterGCMUrl, RequestMethod.POST, EvadoFilipActivity.this); restRegisterGCM.setHeader("UserName", AppSettings.getInstance().getUsername(EvadoFilipActivity.this)); restRegisterGCM.setHeader("Password", AppSettings.getInstance().getPassword(EvadoFilipActivity.this)); restRegisterGCM.setParameter("regId", regId); restRegisterGCM.setPostExecuteMethod(2); restRegisterGCM.execute(); } } } else Toast.makeText(this, R.string.gcm_google_account_missing, Toast.LENGTH_SHORT).show(); }UPDATE:
I have renamed packages and forget to change it in my class:
public class GCMBroadcastReceiver extends com.google.android.gcm.GCMBroadcastReceiver{ @Override protected String getGCMIntentServiceClassName(Context context) {
return "com.mypackage.services.GCMIntentService"; } }最满意答案
确保您在要测试的设备上设置了用户帐户。 GCM要求必须在注册GCM的设备上设置Google帐户,(我认为此要求适用于Android版本<4.0)
Ensure that you have set up a user account on the device that you are testing on. GCM requires that a google account must be setup on the device that is registering for GCM, (also I think that this requirements is for android versions < 4.0)
更多推荐
context,String,public,GCM,@Override,电脑培训,计算机培训,IT培训"/> <meta name
发布评论