[Android GCM] 2. GCM 안드로이드 앱!
이곳에서는 dependency추가와 권한 설정,
간단 코드 작성을 보시게 될 것입니다.
1. 라이브러리 설정
먼저 2가지의 build.gradle 파일에 한줄씩 추가해주어야 합니다.
top-level의 build.gradle에
classpath 'com.google.gms:google-services:1.3.0-beta1'
를 추가합니다.
app-level의 build.gradle에
apply plugin: 'com.google.gms.google-services'
를 추가합니다.
다음으로 라이브러리를 추가해야합니다.
최상위인 app을 선택하고 'F4'를 눌러줍니다.
그러면 project structure창이 뜨고
Dependencies탭을 선택 해줍니다.
우측 상단의 초록색 +버튼을 누른후
Library dependency를 선택합니다.
라이브러리 선택창이 올라오고
play-service라고 검색을 한 후
'com.google.android.gms:play-services:7.5.0'을 선택,
OK버튼을 누릅니다.
그러면 자동으로 gradle이 진행됩니다.
만약 google play service 가 보이지 않는다면
SDK manager를 통해 설치 해줍니다.
툴바에서 SDK Manager를 실행 하면
Android SDK 설정으로 이동합니다.
여기서 'SDK Tools' 탭을 누르고
'Google Play service'를 찾아 체크 후
'Apply'버튼을 누르면 설치가 진행 됩니다.
설치 완료 후 'OK'버튼으로 설정창을 닫아줍니다.
Google Play Service 라이브러리 설정 후
gradle 진행시
아래와 같은 에러를 만날 수 있습니다.
"Execution failed for task ':app:compileDebugAidl'."
위 오류는 아래와 같이 'Project Structure'창에서
컴파일 버전과 빌드 버전을 수정하여 해결 할 수 있습니다.
2. Manifest 설정
GCM을 이용하기 위해 몇가지 권한 설정과
메시지 수신 및 수신된 메시지 처리를 위한 서비스가 필요합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wowan.gcm.newtester" > <uses-permission android:name="android.permission.INTERNET" /> <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:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <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> <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.RECEIVE" /> <category android:name="com.example.gcm" /> </intent-filter> </receiver> <service android:name=".gcm.MyGcmListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> <service android:name=".gcm.MyInstanceIDListenerService" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.iid.InstanceID"/> </intent-filter> </service> </application> </manifest> | cs |
먼저 권한들 입니다.
INTERNET
당연히 GCM서버로 메시지를 받으려면 INTERNET연결이 필요하겠죠.
WAKE_LOCK
메시지 수신 후 디바이스를 깨워줘야 하기때분에 주는 권한입니다.
c2dm.permission.RECEIVE
GCM 메시지 수신을 하기 위한 권한 입니다.
C2D_MESSAGE
다른 애플리케이션의 GCM 메시지와의 문제를 없애기 위해 사용합니다.
메시지를 수신할 Receiver와 그것을 처리할 Service들입니다.
receiver는 수신된 GCM메시지를 어떤 서비스로 넘길 것인지
컨트롤(?) 해주는 역할을 합니다.
변경된 GCM에서는 notification 메시지를 수신 하게 되면
자동으로 notify를 실행해주어 푸시 알림을 받게 됩니다.
MyGcmListenerService 는 수신된 메시지를 Bundle로 받아 처리 할 수 있습니다.
이 서비스 안에서는 전달된 메시지나 데이터를 처리하는 작업을 해주어야 합니다.
MyInstanceIDListenerService 는 Registration Token값이 변경되었을 경우 불려지며
이 서비스 안에서는 앱서버로 변경된 토큰 값을 보내주는 작업을 해주어야 합니다.
( 이 포스트에서는 서버로 registration Token을 저장하지 않습니다. )
3. GCM 서비스 코드 작성
위의 Manifest에서 설정된 2개의 서비스 코드를 작성해야합니다.
이전 글에서 만들어 두었던 gcm패키지에 생성해 줍니다.
MyGcmListenerService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | package com.wowan.gcm.newtester.gcm; import android.os.Bundle; import android.util.Log; import com.google.android.gms.gcm.GcmListenerService; /** * Created by wowan on 2015-07-10 */ public class MyGcmListenerService extends GcmListenerService { static final String TAG = "MyGcmListenerService"; @Override public void onMessageReceived(String from, Bundle data) { String title = data.getString("title"); String text = data.getString("text"); Log.d(TAG, "From: " + from); Log.d(TAG, "Title: " + title); Log.d(TAG, "Text: " + text); //from is sender id //data is datas } } | cs |
MyInstanceIDListenerService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package com.wowan.gcm.newtester.gcm; import com.google.android.gms.iid.InstanceIDListenerService; /** * Created by wowan on 2015-07-10 */ public class MyInstanceIDListenerService extends InstanceIDListenerService { @Override public void onTokenRefresh() { //send new registration token to app server } } | cs |
4. MainActivity 코드 작성
메인에서는 간단하게 버튼과 텍스트 뷰를 이용해 작성했습니다.
텍스트뷰는 메시지를 보여주는 기능을 하는데
보여주는 메시지는.. 없습니다.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | package com.wowan.gcm.newtester; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; import java.io.IOException; public class MainActivity extends AppCompatActivity { static final String TAG = "MainActivity"; String rid; String senderId = "your sender id"; Button btnregist,btnunregist; TextView tvmsgview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnActionListener btnListener = new btnActionListener(); btnregist = (Button)findViewById(R.id.btn_regist); btnregist.setOnClickListener(btnListener); btnunregist = (Button)findViewById(R.id.btn_unregist); btnunregist.setOnClickListener(btnListener); tvmsgview = (TextView)findViewById(R.id.tv_msgview); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } class btnActionListener implements View.OnClickListener{ @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_regist: regist(); break; case R.id.btn_unregist: unregist(); break; } } void regist(){ new AsyncTask<Void,Void,String>() { @Override protected String doInBackground(Void... params) { String msg = ""; Log.d(TAG, msg); try { InstanceID instanceID = InstanceID.getInstance(getApplicationContext()); rid = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); //instanceID.deleteToken(rid,GoogleCloudMessaging.INSTANCE_ID_SCOPE); msg = "Device registered, registration ID=" + rid; //발급받은 토큰을 server로 저장하는 함수 (미구현) //RegistToServer(); //발급 받은 토큰을 Sharedpreference로 저장 (미구현) //storeRegistrationId(context, regId); Log.d(TAG, msg); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } }.execute(null, null, null); } void unregist(){ new AsyncTask<Void,Void,String>() { @Override protected String doInBackground(Void... params) { String msg = ""; Log.d(TAG, msg); try { InstanceID instanceID = InstanceID.getInstance(getApplicationContext()); instanceID.deleteInstanceID(); msg = "Device unRegistered"; //server에 토큰 삭제 요청 (미구현) //unRegistToServer(); //Sharedpreference로 저장된 토큰 제거 (미구현) //deleteRegistrationId(context, regId); Log.d(TAG, msg); } catch (IOException ex) { msg = "Error :" + ex.getMessage(); } return msg; } }.execute(null, null, null); } } } | cs |
이제 실행!
아래와 같은 실행 화면이 뙇!
regist를 누르면
regstration Token이 log창에 찍힙니다.
unregst를 누르면 GCM Connection Server에 저장된 토큰을
지웁니다.
그것을 잘 저장해 두세요
서버쪽에서 사용하게 됩니다.
앱 끝!
-----------------------------------------------
[Android GCM] 3. C언어로 GCM 메시지를 보내자!
참고 내용
http, xmpp의 내용 구성을 위한 레퍼런스
https://developers.google.com/cloud-messaging/server-ref
제가 읽어본 안드로이드 관련 부분 링크입니다.
도입부
https://developers.google.com/cloud-messaging/android/start
App Server설명
https://developers.google.com/cloud-messaging/server
App Server에서의 http
https://developers.google.com/cloud-messaging/http
Client App에서의 등록에 관한 기본설명
https://developers.google.com/cloud-messaging/registration
안드로이드 Client App에서 해주어야 할 일
https://developers.google.com/cloud-messaging/android/client
'Android' 카테고리의 다른 글
[Android GCM] 0. GCM (0) | 2015.07.11 |
---|---|
[Android GCM] 3. C언어로 GCM 메시지를 보내자! (0) | 2015.07.10 |
[Android GCM] 1. 준비 (0) | 2015.07.10 |
[Android] Intent 예제 (0) | 2015.05.19 |
[Android] layout Inflater 예제 (0) | 2015.05.19 |
댓글