[201510][Bach Ngoc Hoai] Android push notify using Google Cloud Message (GCM)
This post hasn't been updated for 3 years
**Sử dụng GCM để push notification từ server (my domain) về ứng dụng android **
- Cấu trúc hoạt động
- Đăng ký Google Cloud Message từ Google API Console
- Tạo môi trường từ Android Studio
- Tạo GCM Project - code sample
- Push notify với webservice bằng code php
**Cấu trúc hoạt động **
** Đăng ký Google Cloud Message từ Google API Console**
a. Mở Google API Console page https://developer.google.com/console
b. Tạo project GCM Sample Tại màn hình home các bạn thấy id của project
ID: gcm-sample (#6237....) đây chính là client id hay SENDER_ID để đăng ký ứng dụng trên android
c. Sau khi tạo xong project, để Google Cloud Message ở chế độ enable
APIs & auth >> APIs >> Cloud Messaging for Android
d. Đăng ký webservice - hay chính xác hơn là xác nhận domain của webservice vào Google Cloud Message Project (GCM Project) Tạo service key từ
APIs & auth >> Credentials >> Add Credentials >> API Key >> Service Key
Tại đây tất cả để mặc định và chọn Create >> có được SERVER KEY
e. Add domain vào GCM Project -> cho phép domain có quyền request GCM push notify cho SEND_ID
APIs & auth >> Credentials >> Domain verification >> Add domain và làm theo hướng dẫn khá cụ thể ở đó
Tạo môi trường từ Android Studio
a. Mở AVD manager và cài đặt Google APIs (version tuỳ thích )
b. Ngoài ra có thể sử dụng lib gcm.jar thay thế cho dùng Google APIs để build project
Tạo GCM Project - code sample
a. Cấu trúc project
b. AndroidManifest.xml INTERNET – Required Sử dụng internet để nhận message .
ACCESS_NETWORK_STATE – Kiểm tra trạng thái kết nối (có thể bỏ qua sử dụng exception)
GET_ACCOUNTS – Required lấy thông tin account
WAKE_LOCK – Bỏ qua chế độ sleep của máy
VIBRATE – Để chế độ rung khi nhận được message
<!-- GCM requires Android SDK version 2.2 (API level 8) or above. -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sample.gcm"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<!-- Main activity. -->
<application
android:name="com.sample.gcm.Controller"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<!-- Register Activity -->
<activity
android:name="com.sample.gcm.RegisterActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Main Activity -->
<activity
android:name="com.sample.gcm.MainActivity"
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name" >
</activity>
<receiver
android:name="com.google.android.gcm.GCMBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!-- Receives the actual messages. -->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<!-- Receives the registration id. -->
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.sample.gcm" />
</intent-filter>
</receiver>
<service android:name="com.sample.gcm.GCMIntentService" />
</application>
<!-- GCM connects to Internet Services. -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
android:name="com.sample.gcm.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.sample.gcm.permission.C2D_MESSAGE" />
<!-- This app has permission to register and receive data message. -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- Network State Permissions to detect Internet status -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- Permission to vibrate -->
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
c. Some JAVA FILE
_Config.java _
YOUR_SERVER_URL : Link webservice từ domain của bạn.
GOOGLE_SENDER_ID : SENDER_ID tạo từ bên trên.
MainActivity.java
'GCMRegistrar.checkDevice(this);'
Kiểm tra đăng ký GCM của device
'GCMRegistrar.checkManifest(this);'
Kiểm tra permission, service, receiver trong mainifest
'registerReceiver(mHandleMessageReceiver, new IntentFilter(Config.DISPLAY_MESSAGE_ACTION));'
Đăng ký receiver để nhận tin nhắn trả về từ GCM
'GCMRegistrar.register(this, Config.GOOGLE_SENDER_ID);'
Đăng ký device mới
GCMIntentService.java
'protected void onRegistered(Context context, String CLIENT_ID ) '
Function khi GCM đăng ký device thành công và trả về CLIENT_ID
'protected void onMessage(Context context, Intent intent)'
Ngoài ra các function, class khác chủ yếu chỉ bổ trợ cho đăng ký
**Push notify với webservice bằng code php **
a. Tạo database lưu trữ CLIENT_ID: gcm
b. Tạo bảng lưu trữ thông tin client gửi lên như tên, CLIENT_ID, mail
'CREATE TABLE IF NOT EXISTS gcm_users
(
id
int(11) NOT NULL AUTO_INCREMENT,
gcm_regid
text,
name
varchar(50) NOT NULL,
email
varchar(255) NOT NULL,
created_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
'
c. PHP File
config.php
<?php ' // Database config variables define("DB_HOST", "localhost"); define("DB_USER", "xxxxxxxxx"); define("DB_PASSWORD", "xxxxxxx"); define("DB_DATABASE", "gcm"); // Google Cloud Messaging API Key // Place your Google API Key define("GOOGLE_API_KEY", "AIzaSyA81yS1VSj1WZXY_T"); ?>'GOOGLE_API_KEY là SERVER KEY đăng ký ở trên
và một số function khác hỗ trợ cho việc gửi message đến GCM API.
Các bạn có thể tải Full Demo tại đây https://www.dropbox.com/s/egv15wq6acjg936/GCM Sample.zip?dl=0
All Rights Reserved