Отменить регистрацию устройства из GCM с помощью регистрационного идентификатора в Android

У меня есть список зарегистрированных пользователей GCM и их соответствующих регистрационных идентификаторов в таблице базы данных, и я действительно хочу отменить регистрацию пользователя всякий раз, когда он/она удаляется из таблицы. Я нашел много примеров здесь, в Stackoverflow, но большинство из них основано на старом GCMRegistrar API, который теперь устарел. Я использую API GoogleCloudMessaging и регистрирую пользователя следующим способом:

private void registerUser(){
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        String regId = "";
        try {
            regId = gcm.register(getString(R.string.project_number));
            Log.i("registrationId", regId);
        } 
        catch (IOException e) {
            Log.i("Registration Error", e.getMessage());
        }
}

У меня есть приложение для администратора, которое действует как сервер сторонних приложений, поскольку оно подталкивает уведомления всем пользователям. Я хочу отменить регистрацию конкретного пользователя из этого приложения администратора следующим образом:

private void unRegister(String regId) {

        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(getBaseContext());
        try {
            gcm.unregister();
        } 
        catch (IOException e) {     
        System.out.println("Error Message: " + e.getMessage());
        }

   }

Но это смущает меня, что метод unregister() не принимает регистрационный идентификатор в качестве аргумента, что делает невозможным отменить регистрацию определенного устройства. Есть ли способ отменить регистрацию определенного устройства из GCM по идентификатору регистрации?

Ответы

Ответ 1

Этот метод выполняет трюк:

gcm.unregister();

Однако gcm.unregister() теперь устарел, поэтому вы должны использовать один из них:

InstanceID.deleteToken() или InstanceID.deleteInstanceID().

Эти методы принимают следующие параметры:

public void deleteToken (String authorizedEntity, String scope)

Будучи авторизованным сущностью, объект, который вы хотите удалить...

//СЛЕДУЮЩЕЕ ОБЪЯСНЕНИЕ ТОЛЬКО ДЛЯ "НЕРЕГИСТРАТОРА"

Итак, на основе вашего комментария:

Но это смущает меня, что метод unregister() не регистрируется Id как аргумент, что делает невозможным отменить регистрацию определенного устройство.

Это потому, что вы ожидаете, что он будет работать таким образом, чтобы этого не произошло. Похоже, вы хотите, чтобы HTTP-запрос передавал параметр урегистеру (например, http://www.gcmserver.com?unregisterid=xxxx"), и это не так, как это работает. как это работает на основе документации Google:

Как работает отмена регистрации

Приложение может быть автоматически незарегистрировано после того, как оно удалены с устройства. Однако этот процесс не происходит сразу же, поскольку Android не обеспечивает обратного вызова для удаления. Какие в этом случае происходит следующее:

Конечный пользователь удаляет приложение.

Сервер сторонних производителей отправляет сообщение на сервер GCM.

Сервер GCM отправляет сообщение на устройство.

Клиент GCM получает сообщение и запросы диспетчера пакетов есть ли широковещательные приемники, сконфигурированные для его приема, что возвращает false.

Клиент GCM информирует сервер GCM о том, что приложение было удалено.

Сервер GCM отмечает идентификатор регистрации для удаления.

Сервер сторонних производителей отправляет сообщение в GCM.

GCM возвращает сообщение NotRegistered об ошибке на сторонний сервер.

Третья сторона удаляет регистрационный идентификатор.

Таким образом, на самом деле метод gcm.unregister() фактически указывает на то, что это устройство для удаления (подумайте об этом как о том, чтобы заставить его выполнить первые шаги процесса без фактической деинсталляции приложения), позволяя серверу знать, что это больше не требуется получать уведомления, также не принимая "Id" в качестве параметра, это означает, что он ссылается на это конкретное устройство.

Привет!