我試圖使用新Google雲端通訊API實現GCM對應GCMRegistrar.isRegistered()。在新的GCM
我想檢查設備是否在雲上註冊,之前使用GCMRegistrar.isRegistered()進行了檢查。
有沒有什麼辦法可以實現使用新的API這個檢查?
編輯:我知道我能救設好註冊編號在我的應用程序,但我想知道我的設備對雲的狀態 - 無論是註冊與否。
我試圖使用新Google雲端通訊API實現GCM對應GCMRegistrar.isRegistered()。在新的GCM
我想檢查設備是否在雲上註冊,之前使用GCMRegistrar.isRegistered()進行了檢查。
有沒有什麼辦法可以實現使用新的API這個檢查?
編輯:我知道我能救設好註冊編號在我的應用程序,但我想知道我的設備對雲的狀態 - 無論是註冊與否。
棄用的GCMRegistrar
只是存儲在本地RegistrationID設備上的助手客戶端類。 GCMRegistrar.isRegistered()
從未調用GCM服務器來查找設備是否已註冊(因爲沒有此類API)。它只是檢查如果先前接收到的RegistrationID被本地存儲在設備上的特定應用程式(和無效存儲RegistrationId一些occassions,如該應用版本更改時)。
事實上,你可以看到GCMRegistrar here的代碼:
/**
* 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;
}
/**
* Checks whether the application was successfully registered on GCM
* service.
*/
public static boolean isRegistered(Context context) {
return getRegistrationId(context).length() > 0;
}
因此,如果您存儲的註冊ID在你的應用程序,你會實現,當你使用GCMRegistrar
你有完全相同的功能。在客戶端應用程序中確定設備已註冊或未註冊GCM的唯一方法是致電GoogleCloudMessaging.register
或GoogleCloudMessaging.unregister
。
的關心U可以檢查註冊狀態以及更多類似這樣的
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);
// Toast.makeText(getApplicationContext(), "Your registration ID : " +
// registrationId, Toast.LENGTH_LONG).show();
displayMessage(context, "Your device registred with GCM"
+ registrationId);
//Log.d("NAME", LoginActivity.email);
ServerUtilities.register(context, LoginActivity.uid,
LoginActivity.phone, 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("price");
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);
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.
* This message wil be notified at status bar!!!
*/
@SuppressWarnings("deprecation")
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, MainActivity.class);
// set intent so it does not start a new activity
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;
// Play default notification sound
notification.defaults |= Notification.DEFAULT_SOUND;
// notification.sound = Uri.parse("android.resource://" +
// context.getPackageName() + "your_sound_file_name.mp3");
// Vibrate if vibrate is enabled
notification.defaults |= Notification.DEFAULT_VIBRATE;
notificationManager.notify(0, notification);
}
}
你需要這樣做
String SENDER_ID = "13312313";//product id will be different for you
GoogleCloudMessaging gcm;
Context context =getApplicationContext();
String regid;
String msg = "";
try {
if (gcm == null) {
gcm = GoogleCloudMessaging.getInstance(context);
}
regid = gcm.register(SENDER_ID);
storeRegistrationId(context, regid);
msg = regid;
} catch (IOException ex) {
msg=null;
}
保存到sharedpreferences
private void storeRegistrationId(Context context, String regId) {
final SharedPreferences prefs = getGCMPreferences(context);
Log.i(TAG, "Saving regId on app version " + appVersion);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(PROPERTY_REG_ID, regId);
editor.commit();
}
現在檢查exixtence
final SharedPreferences prefs = getGCMPreferences(context);
String registrationId = prefs.getString(PROPERTY_REG_ID, "");
if (TextUtils.isEmpty(registrationId)) {
Log.i(TAG, "Registration not found.");
return null;
}
private SharedPreferences getGCMPreferences(Context context) {
// This sample app persists the registration ID in shared preferences, but
// how you store the regID in your app is up to you.
return getSharedPreferences(this.getClass().getSimpleName(),
Context.MODE_PRIVATE);
}
嘿,這是一個非常簡單的答案..謝謝! – Amruta
不客氣! – Eran