Как реализовать GCM Hello World для Android с помощью Android Studio

Я уже несколько дней искал, как реализовать Google Cloud Messaging для Android, но у меня есть серьезные сомнения по этому поводу.

Я имею в виду, что, по-видимому, Google размещает некоторую информацию в Интернете, как здесь и здесь , но я смущен всей логикой. Одна страница говорит о стороне клиента, а другая – о стороне сервера. Отлично, но как мне связать все это вместе? Как реализовать протокол HTTP и / или XMPP для связи с серверами (серверами) GCM?

Я хотел бы реализовать базовый HelloWorld для GCM, который будет работать со следующими шагами:

1. App send a message (say "HelloWorld") to GCM; 2. Receive that message from GCM and add it to a TextView. 

Каковы шаги, необходимые для достижения этого базового приложения?

Спасибо,

Если вы прочитали две ссылки в своем вопросе и поняли основные понятия GCM, вы можете обратиться к следующим образцовым кодам:

Конечно, давайте предположим, что вы закончили:

  • Создайте проект и его ключ API сервера в Google Developers Console
  • Установите разрешения в ваших файлах AndroidManifest, таких как <uses-permission android:name="android.permission.INTERNET" />

Серверная сторона:

 public class MainActivity extends AppCompatActivity { private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTextView = (TextView) findViewById(R.id.textView); new GCMRequest().execute(); } ... private class GCMRequest extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { final String API_KEY = "..."; // An API key saved on the app server that gives the app server authorized access to Google services final String CLIENT_REG_ID = "..."; //An ID issued by the GCM connection servers to the client app that allows it to receive messages final String postData = "{ \"registration_ids\": [ \"" + CLIENT_REG_ID + "\" ], " + "\"delay_while_idle\": true, " + "\"data\": {\"tickerText\":\"My Ticket\", " + "\"contentTitle\":\"My Title\", " + "\"message\": \"Test GCM message from GCMServer-Android\"}}"; try { URL url = new URL("https://android.googleapis.com/gcm/send"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoInput(true); urlConnection.setDoOutput(true); urlConnection.setRequestMethod("POST"); urlConnection.setRequestProperty("Content-Type", "application/json"); urlConnection.setRequestProperty("Authorization", "key=" + API_KEY); OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); writer.write(postData); writer.flush(); writer.close(); outputStream.close(); int responseCode = urlConnection.getResponseCode(); InputStream inputStream; if (responseCode < HttpURLConnection.HTTP_BAD_REQUEST) { inputStream = urlConnection.getInputStream(); } else { inputStream = urlConnection.getErrorStream(); } BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String temp, response = ""; while ((temp = bufferedReader.readLine()) != null) { response += temp; } return response; } catch (IOException e) { e.printStackTrace(); return e.toString(); } } @Override protected void onPostExecute(String message) { super.onPostExecute(message); if (mTextView != null) { try { JSONObject jsonObject = new JSONObject(message); mTextView.setText(jsonObject.toString(5)); } catch (JSONException e) { e.printStackTrace(); mTextView.setText(e.toString()); } } } } } 

Сторона клиента:

MainActivity.java:

 public class MainActivity extends AppCompatActivity { private final Context mContext = this; private final String SENDER_ID = "..."; // Project Number at https://console.developers.google.com/project/... private final String SHARD_PREF = "com.example.gcmclient_preferences"; private final String GCM_TOKEN = "gcmtoken"; public static TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE); String token = appPrefs.getString(GCM_TOKEN, ""); if (token.isEmpty()) { try { getGCMToken(); } catch (Exception e) { e.printStackTrace(); } } mTextView = (TextView) findViewById(R.id.textView); } ... private void getGCMToken() { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { InstanceID instanceID = InstanceID.getInstance(mContext); String token = instanceID.getToken(SENDER_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); if (token != null && !token.isEmpty()) { SharedPreferences appPrefs = mContext.getSharedPreferences(SHARD_PREF, Context.MODE_PRIVATE); SharedPreferences.Editor prefsEditor = appPrefs.edit(); prefsEditor.putString(GCM_TOKEN, token); prefsEditor.apply(); } Log.i("GCM", token); } catch (IOException e) { e.printStackTrace(); } return null; } }.execute(); } } 

GcmService.java:

 public class GcmService extends GcmListenerService { @Override public void onMessageReceived(String from, Bundle data) { JSONObject jsonObject = new JSONObject(); Set<String> keys = data.keySet(); for (String key : keys) { try { jsonObject.put(key, data.get(key)); } catch (JSONException e) { e.printStackTrace(); } } try { sendNotification("Received: " + jsonObject.toString(5)); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onDeletedMessages() { sendNotification("Deleted messages on server"); } @Override public void onMessageSent(String msgId) { sendNotification("Upstream message sent. Id=" + msgId); } @Override public void onSendError(String msgId, String error) { sendNotification("Upstream message send error. Id=" + msgId + ", error" + error); } private void sendNotification(final String msg) { Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { if (MainActivity.mTextView != null) { MainActivity.mTextView.setText(msg); } } }); } } 

AndroidManifest.xml:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.gcmandroid" > <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="com.google.android.c2dm.permission.RECEIVE" /> <permission android:name="com.example.gcm.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> <application android:allowBackup="true" android:fullBackupContent="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="com.example.gcm" /> </intent-filter> </receiver> <service android:name=".GcmService" android:exported="false"> <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> 
Intereting Posts
Ошибка AAPT бесконечного построения градиента В регистрации с использованием библиотеки asmack и открытого огня в качестве сервера Могу ли я обернуть библиотеку c ++ в родное расширение Adobe Air для мобильных устройств IOS / Android Исключая определенные модули от proguard Android Gradle Buildscript Фрагментный стандартный переход не оживляющий Android getLatitude () возвращает геодезическую или геоцентрическую широту? Всегда используйте v4 Fragments вместо встроенного android.app.Fragment? Как открыть PDF в Android Как передать значение с одного действия на другое в Android? Может ли кто-нибудь предоставить мне пример Two_line_list_item в Android? Установка текста на несколько раздутых EditTexts заставляет все заполнять одним и тем же текстом после вращения Идентификатор ресурса в проекте библиотеки Android Мое устройство не получает других уведомлений (FCM) Android: разница между инструментом traceview и systrace Phonegap / HTML5 и проблема изменения размера экрана Android при повороте с пейзажа на портрет