+2

[201510][Bach Ngoc Hoai] Android push notify using Google Cloud Message (GCM)

**Sử dụng GCM để push notification từ server (my domain) về ứng dụng android **

  1. Cấu trúc hoạt động
  2. Đăng ký Google Cloud Message từ Google API Console
  3. Tạo môi trường từ Android Studio
  4. Tạo GCM Project - code sample
  5. Push notify với webservice bằng code php

**Cấu trúc hoạt động ** Untitled-1.png

** Đă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 Screen Shot 2015-10-26 at 14.08.23.png 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) Screen Shot 2015-10-26 at 14.20.13.png 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 Screen Shot 2015-10-26 at 14.53.12.png

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_KEYSERVER 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

Viblo
Let's register a Viblo Account to get more interesting posts.