Как получить RegistrationID с помощью GCM в Android

Я пытаюсь сделать push-уведомление в Android с помощью GCM. Я прочитал документы Google для GCM и их демонстрационного приложения. Я создал клиентскую программу, упомянутую здесь http://android.amolgupta.in/. Но я не получаю регистрационный идентификатор. Также я не получаю некоторые пункты, такие как:

  1. мне нужно серверную программу тоже с этим
  2. в демонстрационном приложении Google они упоминают, что мне нужно изменить ключ API в «samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key», необходимо ли делать это каждый раз, когда я создаю новый проект

Может ли кто-нибудь предоставить мне правильный проект, кроме Google, чтобы я прояснил свои концепции.

Любая помощь будет оценена.


person Neha    schedule 17.07.2012    source источник


Ответы (3)


Здесь я описал несколько шагов для получения RegID и уведомлений с нуля

  1. Создать/Зарегистрировать приложение в Google Cloud
  2. Настройка Cloud SDK с помощью разработки
  3. Настроить проект для GCM
  4. Получить регистрационный идентификатор устройства
  5. Отправить push-уведомления
  6. Получать push-уведомления

Вы можете найти полное руководство здесь:

Приступая к работе с push-уведомлениями Android: новейшая версия Google Cloud Messaging (GCM) — пошаговое руководство

введите здесь описание изображения

Фрагмент кода для получения идентификатора регистрации (токен устройства для push-уведомлений).

Настроить проект для GCM


Обновите файл AndroidManifest

Чтобы включить GCM в нашем проекте, нам нужно добавить несколько разрешений в наш файл манифеста. Перейдите к AndroidManifest.xml и добавьте этот код: Добавить разрешения

<uses-permission android:name="android.permission.INTERNET”/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

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

<uses-permission android:name=“.permission.RECEIVE" />
<uses-permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE" />
<permission android:name=“<your_package_name_here>.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

Добавьте объявление GCM Broadcast Receiver в тег вашего приложения:

<application
        <receiver
            android:name=".GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" ]]>
            <intent-filter]]>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="" />
            </intent-filter]]>

        </receiver]]>
     
<application/>

Добавить объявление службы GCM

<application
     <service android:name=".GcmIntentService" />
<application/>

Получить идентификатор регистрации (токен устройства для push-уведомлений)

Теперь перейдите к своей активности запуска/заставки

Добавьте константы и переменные класса

private final static int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
public static final String EXTRA_MESSAGE = "message";
public static final String PROPERTY_REG_ID = "registration_id";
private static final String PROPERTY_APP_VERSION = "appVersion";
private final static String TAG = "LaunchActivity";
protected String SENDER_ID = "Your_sender_id";
private GoogleCloudMessaging gcm =null;
private String regid = null;
private Context context= null;

Обновите методы OnCreate и OnResume.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_launch);
    context = getApplicationContext();
    if (checkPlayServices()) {
        gcm = GoogleCloudMessaging.getInstance(this);
        regid = getRegistrationId(context);

        if (regid.isEmpty()) {
            registerInBackground();
        } else {
            Log.d(TAG, "No valid Google Play Services APK found.");
        }
    }
}

@Override
protected void onResume() {
    super.onResume();
    checkPlayServices();
}


// # Implement GCM Required methods(Add below methods in LaunchActivity)

private boolean checkPlayServices() {
    int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
    if (resultCode != ConnectionResult.SUCCESS) {
        if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
            GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                PLAY_SERVICES_RESOLUTION_REQUEST).show();
        } else {
            Log.d(TAG, "This device is not supported - Google Play Services.");
            finish();
        }
        return false;
    }
    return true;
}

private String getRegistrationId(Context context) {
    final SharedPreferences prefs = getGCMPreferences(context);
    String registrationId = prefs.getString(PROPERTY_REG_ID, "");
    if (registrationId.isEmpty()) {
        Log.d(TAG, "Registration ID not found.");
        return "";
    }
    int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
    int currentVersion = getAppVersion(context);
    if (registeredVersion != currentVersion) {
        Log.d(TAG, "App version changed.");
        return "";
    }
    return registrationId;
}

private SharedPreferences getGCMPreferences(Context context) {
    return getSharedPreferences(LaunchActivity.class.getSimpleName(),
        Context.MODE_PRIVATE);
}

private static int getAppVersion(Context context) {
    try {
        PackageInfo packageInfo = context.getPackageManager()
            .getPackageInfo(context.getPackageName(), 0);
        return packageInfo.versionCode;
    } catch (NameNotFoundException e) {
        throw new RuntimeException("Could not get package name: " + e);
    }
}


private void registerInBackground() {
    new AsyncTask() {
        @Override
        protected Object doInBackground(Object...params) {
            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(context);
                }
                regid = gcm.register(SENDER_ID);
                Log.d(TAG, "########################################");
                Log.d(TAG, "Current Device's Registration ID is: " + msg);
            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return null;
        }
        protected void onPostExecute(Object result) {
            //to do here
        };
    }.execute(null, null, null);
}

Примечание: сохраните REGISTRATION_KEY, это важно для отправки сообщения PN в GCM. Также имейте в виду: этот ключ будет уникальным для всех устройств, и GCM будет отправлять Push-уведомления только REGISTRATION_KEY.

person swiftBoy    schedule 29.11.2013
comment
как только вы сгенерируете REGISTRATION_KEY (предположительно на своем телефоне), как вы получите его на свой сервер? - person mcmillab; 12.04.2016

В ответ на ваш первый вопрос: да, вам нужно запустить серверное приложение для отправки сообщений, а также клиентское приложение для их получения.

В ответ на ваш второй вопрос: да, каждому приложению нужен свой ключ API. Этот ключ предназначен для вашего серверного приложения, а не для клиента.

person Sparky    schedule 17.07.2012
comment
Хорошо, теперь я немного смущен тем, как мне создать свое приложение для push-уведомлений, я имею в виду, что мне нужно делать на стороне клиента и на стороне сервера? - person Neha; 17.07.2012
comment
Вашему серверу нужен ключ API, чтобы инфраструктура GCM могла принимать от него сообщения. Вашему клиенту нужен RegistrationID из клиентской библиотеки GCM, чтобы ваше серверное приложение знало, кому отправлять сообщение. Вам необходимо отправить этот RegistrationID на сервер. Учебники должны провести вас через это. - person Sparky; 17.07.2012
comment
Не конкретно, но точно. Что бы ни работало. Возможно, вы захотите начать с исходного кода полного образца приложения и обращаться к нему по мере прохождения учебного курса. - person Sparky; 17.07.2012
comment
Хорошо @Спарки. Я попробовал клиентский код и загрузил его выше. не могли бы вы проверить, что на самом деле он не показывает мне какой-либо регистрационный идентификатор. где я ошибся именно? - person Neha; 17.07.2012
comment
@Sparky: я не получаю REGISTRAION OK return для GCM onRegistration, хотя у меня новый регистрационный идентификатор, угадайте, что мне не хватает - person Abdul Wahab; 25.10.2012

Используйте этот код, чтобы получить идентификатор регистрации с помощью GCM

String regId = "", msg = "";

public void getRegisterationID() {

    new AsyncTask() {
        @Override
        protected Object doInBackground(Object...params) {

            String msg = "";
            try {
                if (gcm == null) {
                    gcm = GoogleCloudMessaging.getInstance(Login.this);
                }
                regId = gcm.register(YOUR_SENDER_ID);
                Log.d("in async task", regId);

                // try
                msg = "Device registered, registration ID=" + regId;

            } catch (IOException ex) {
                msg = "Error :" + ex.getMessage();
            }
            return msg;
        }
    }.execute(null, null, null);
 }

и не забудьте прописать разрешения в манифесте...
Надеюсь, это поможет!

person Gagan    schedule 25.02.2015
comment
Всегда ли вы сохраняете // TODO автоматически сгенерированный метод после того, как вы реализовали метод? - person Roel; 02.05.2016
comment
нет, это был просто пример кода, я пишу его на скорую руку... ;) - person Gagan; 29.06.2016