본문 바로가기
Android

[Android GCM] 2. GCM 안드로이드 앱!

by GGoris 2015. 7. 10.
반응형

[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




먼저 권한들 입니다.


<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" />


INTERNET

당연히 GCM서버로 메시지를 받으려면 INTERNET연결이 필요하겠죠.


WAKE_LOCK

메시지 수신 후 디바이스를 깨워줘야 하기때분에 주는 권한입니다.


c2dm.permission.RECEIVE

GCM 메시지 수신을 하기 위한 권한 입니다.


C2D_MESSAGE

다른 애플리케이션의 GCM 메시지와의 문제를 없애기 위해 사용합니다.





메시지를 수신할 Receiver와 그것을 처리할 Service들입니다.


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


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(nullnullnull);
        }
 
        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(nullnullnull);
        }
    }
}
 
cs



이제 실행!


아래와 같은 실행 화면이 뙇!



regist를 누르면

regstration Token이 log창에 찍힙니다.


unregst를 누르면 GCM Connection Server에 저장된 토큰을

지웁니다.


그것을 잘 저장해 두세요

서버쪽에서 사용하게 됩니다.






앱 끝!



-----------------------------------------------



[Android GCM] 0. GCM


[Android GCM] 1. 준비


[Android GCM] 2. GCM 안드로이드 앱!


[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

댓글