Android Push GCM 프로젝트 앱 적용 하기(2)

by 조쉬 posted Mar 18, 2016
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

Android Push GCM 프로젝트 앱 적용 하기(2)  


첫번째 포스트를 통해서 Android 앱 에서 필요한 Key 두가지를 추출 하였습니다 .

이제 Android 앱을 구성 하고 Key 를 사용해 볼 차례 입니다 .


구글에서 GCM 관련 클라이언트 코드를 제공 하고 있습니다 .

https://code.google.com/p/gcm/


구글 코드를 내려 받기 위해서는 git 을 사용 해야 합니다 .


%C0̹%CC%C1%F6_004[1].png



중앙에 보면 git 주소가 있습니다 .


git clone https://code.google.com/p/gcm/

 


git 사용법에 대해서는 따로 말씀 드리지 않겠습니다 .

워낙 많이 사용하고있어서 제 블로그나 아니면 다른블로그 git 포스트를 학습하시면 좋을 것 같습니다 .

정 못하신분은 댓글을 달아 주시면 제가 파일을 보내 드리도록 하겠습니다.


%C0̹%CC%C1%F6_006.png




git을 통해서 코드를 내려 받습니다 .


코드를 내려 받으면 이와 같은 폴더가 생깁니다 .


%C0̹%CC%C1%F6_007.png




여기에 저희가 필요한 코드들이 있습니다.

코드 준비는 마쳤습니다 .


다음으로 GCM 을 사용하기 위해서 Google Play Service SDK 다운로드를 진행 합니다 .


인터넷에서 GCM 구현에 관련된 글들을 찾아보면 대부분 gcm.jar를 사용하는데 gcm.jar 역시 deprecate 되었습니다.

그래서 저또한 구버젼 말고 신버젼을 사용하기 위해서 이렇게 포스트를 작성 하고 있습니다.

 8.png

9.png


 

​위와 같이 Google Play Services 를 다운로드 합니다 . 


다운을 완료하면

 

10.png





E:\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\sdk\extras\google

\google_play_services\libproject\google-play-services_lib\libs


위경로에 jar 파일이 있습니다 . 저희가 앱을 구성할때 필요한 파일입니다 .


이제 모든 준비는 끝났습니다 .



프로젝트 생성


Android 프로젝트를 생성합니다 .

생성후에 libs 파일에 위 jar 파일을 넣습니다.


11.png





Google Play Service Version.xml 을 복사합니다 .


E:\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\sdk\extras\google

\google_play_services\libproject\google-play-services_lib\res\values


위경로로 접근을 하면 이와 같이 파일이 있습니다.


12.png




위 파일은 res/values 폴더에 넣습니다.


14.png






이제 코드준비도 되었으니 GCM 핵심코드를 구성 하면 되겠습니다 .


git 을통해서 받은 gcm 폴더에서 GcmBroadcastReceiver.java , GcmIntentService.java 를 복사해서

프로젝트로 이동합니다 .


15.png



16.png





GcmIntentService 파일을 수정 합니다 .


그러면 몇가지 에러가 발생 합니다 , 푸시가 도착하면 DemoActivity 를 열려해서 에러가 나타납니다 .

우리의 Activity 로 변경해주시면 될 것 같습니다 .


17.png





AndroidManifast.xml 파일 수정 진행


Android GCM 을 사용할수 있는 설정을 AndroidManifast.xml 에서 진행 합니다 .


18.png




Colored By Color Scripter

1
2
3
4
5
6
7
8
    "android.permission.INTERNET" />
    "android.permission.WRITE_EXTERNAL_STORAGE" />
    "android.permission.GET_ACCOUNTS" />
    "android.permission.WAKE_LOCK" />
 
    "com.iris.lolin.permission.C2D_MESSAGE" />
    "com.google.android.c2dm.permission.RECEIVE" />
    "com.iris.lolin.permission.C2D_MESSAGE" android:protectionLevel="signature" />


19.png




위와 같이 퍼미션을 설정합니다.

퍼미션 설정 간의 주의 점이 있습니다 .


위 빨간색 상자부분은 자신의 패키지 명이 들어가야 합니다.


20.png




Colored By Color Scripter

1
2
3
         
                android:name="com.google.android.gms.version"
                android:value="@integer/google_play_services_version" />



메타 데이터를 설정 합니다 .

위에서 저희가 준비한 Version.xml 을 읽어오게 됩니다.


21.png




Colored By Color Scripter

1
2
3
4
5
6
7
8
9
10
11
         
                android:name=".GcmBroadcastReceiver"
                android:permission="com.google.android.c2dm.permission.SEND" >
            
                
                "com.google.android.c2dm.intent.RECEIVE" />
                
                "com.google.android.c2dm.intent.REGISTRATION" />
                "com.iris.lolin" />
            
        

 

 

Receiver 를 등록 합니다 .

위 빨간상자안은 해당 프로젝트 패키지를 넣어 주셔야 합니다 .


마지막으로 Service 를 등록 합니다 .


22.png



 

여기까지 설정을 진행 하면 androidManifast.xml 설정이 완료 됩니다 .


이제 마지막으로 Activity 설정을 진행 하면 됩니다 .


23.png




DemoActivity 코드가 필요합니다 .


Colored By Color Scripter

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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
/*
 * Copyright 2013 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.google.android.gcm.demo.app;
 
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.gcm.GoogleCloudMessaging;
 
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
 
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
 
/**
 * Main UI for the demo app.
 */
public class DemoActivity extends Activity {
 
    public static final String EXTRA_MESSAGE = "message";
    public static final String PROPERTY_REG_ID = "registration_id";
    private static final String PROPERTY_APP_VERSION = "appVersion";
    private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
 
    /**
     * Substitute you own sender ID here. This is the project number you got
     * from the API Console, as described in "Getting Started."
     */
    String SENDER_ID = "Your-Sender-ID";
 
    /**
     * Tag used on log messages.
     */
    static final String TAG = "GCM Demo";
 
    TextView mDisplay;
    GoogleCloudMessaging gcm;
    AtomicInteger msgId = new AtomicInteger();
    Context context;
 
    String regid;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.main);
        mDisplay = (TextView) findViewById(R.id.display);
 
        context = getApplicationContext();
 
        // Check device for Play Services APK. If check succeeds, proceed with GCM registration.
        if (checkPlayServices()) {
            gcm = GoogleCloudMessaging.getInstance(this);
            regid = getRegistrationId(context);
 
            if (regid.isEmpty()) {
                registerInBackground();
            }
        } else {
            Log.i(TAG, "No valid Google Play Services APK found.");
        }
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        // Check device for Play Services APK.
        checkPlayServices();
    }
 
    /**
     * Check the device to make sure it has the Google Play Services APK. If
     * it doesn't, display a dialog that allows users to download the APK from
     * the Google Play Store or enable it in the device's system settings.
     */
    private boolean checkPlayServices() {
        int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        if (resultCode != ConnectionResult.SUCCESS) {
            if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
                GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                        PLAY_SERVICES_RESOLUTION_REQUEST).show();
            } else {
                Log.i(TAG, "This device is not supported.");
                finish();
            }
            return false;
        }
        return true;
    }
 
    /**
     * Stores the registration ID and the app versionCode in the application's
     * {@code SharedPreferences}.
     *
     * @param context application's context.
     * @param regId registration ID
     */
    private void storeRegistrationId(Context context, String regId) {
        final SharedPreferences prefs = getGcmPreferences(context);
        int appVersion = getAppVersion(context);
        Log.i(TAG, "Saving regId on app version " + appVersion);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(PROPERTY_REG_ID, regId);
        editor.putInt(PROPERTY_APP_VERSION, appVersion);
        editor.commit();
    }
 
    /**
     * Gets the current registration ID for application on GCM service, if there is one.
     * 

     * If result is empty, the app needs to register.
     *
     * @return registration ID, or empty string if there is no existing
     *         registration ID.
     */
    private String getRegistrationId(Context context) {
        final SharedPreferences prefs = getGcmPreferences(context);
        String registrationId = prefs.getString(PROPERTY_REG_ID, "");
        if (registrationId.isEmpty()) {
            Log.i(TAG, "Registration not found.");
            return "";
        }
        // Check if app was updated; if so, it must clear the registration ID
        // since the existing regID is not guaranteed to work with the new
        // app version.
        int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
        int currentVersion = getAppVersion(context);
        if (registeredVersion != currentVersion) {
            Log.i(TAG, "App version changed.");
            return "";
        }
        return registrationId;
    }
 
    /**
     * Registers the application with GCM servers asynchronously.
     * 

     * Stores the registration ID and the app versionCode in the application's
     * shared preferences.
     */
    private void registerInBackground() {
        new AsyncTaskString>() {
            @Override
            protected String doInBackground(Void... params) {
                String msg = "";
                try {
                    if (gcm == null) {
                        gcm = GoogleCloudMessaging.getInstance(context);
                    }
                    regid = gcm.register(SENDER_ID);
                    msg = "Device registered, registration ID=" + regid;
 
                    // You should send the registration ID to your server over HTTP, so it
                    // can use GCM/HTTP or CCS to send messages to your app.
                    sendRegistrationIdToBackend();
 
                    // For this demo: we don't need to send it because the device will send
                    // upstream messages to a server that echo back the message using the
                    // 'from' address in the message.
 
                    // Persist the regID - no need to register again.
                    storeRegistrationId(context, regid);
                } catch (IOException ex) {
                    msg = "Error :" + ex.getMessage();
                    // If there is an error, don't just keep trying to register.
                    // Require the user to click a button again, or perform
                    // exponential back-off.
                }
                return msg;
            }
 
            @Override
            protected void onPostExecute(String msg) {
                mDisplay.append(msg + "\n");
            }
        }.execute(nullnullnull);
    }
 
    // Send an upstream message.
    public void onClick(final View view) {
 
        if (view == findViewById(R.id.send)) {
            new AsyncTaskString>() {
                @Override
                protected String doInBackground(Void... params) {
                    String msg = "";
                    try {
                        Bundle data = new Bundle();
                        data.putString("my_message""Hello World");
                        data.putString("my_action""com.google.android.gcm.demo.app.ECHO_NOW");
                        String id = Integer.toString(msgId.incrementAndGet());
                        gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);
                        msg = "Sent message";
                    } catch (IOException ex) {
                        msg = "Error :" + ex.getMessage();
                    }
                    return msg;
                }
 
                @Override
                protected void onPostExecute(String msg) {
                    mDisplay.append(msg + "\n");
                }
            }.execute(nullnullnull);
        } else if (view == findViewById(R.id.clear)) {
            mDisplay.setText("");
        }
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
 
    /**
     * @return Application's version code from the {@code PackageManager}.
     */
    private static int getAppVersion(Context context) {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                    .getPackageInfo(context.getPackageName(), 0);
            return packageInfo.versionCode;
        } catch (NameNotFoundException e) {
            // should never happen
            throw new RuntimeException("Could not get package name: " + e);
        }
    }
 
    /**
     * @return Application's {@code SharedPreferences}.
     */
    private SharedPreferences getGcmPreferences(Context context) {
        // This sample app persists the registration ID in shared preferences, but
        // how you store the regID in your app is up to you.
        return getSharedPreferences(DemoActivity.class.getSimpleName(),
                Context.MODE_PRIVATE);
    }
    /**
     * Sends the registration ID to your server over HTTP, so it can use GCM/HTTP or CCS to send
     * messages to your app. Not needed for this demo since the device sends upstream messages
     * to a server that echoes back the message using the 'from' address in the message.
     */
    private void sendRegistrationIdToBackend() {
      // Your implementation here.
    }
}
 

 

 

​코드가 정말 잘 되어 있습니다 . 주석 부터 해서 코드 내용 설명은 다음 포스트에서 진행 하겠습니다 . 

위코드를 다 붙여 넣으시면 됩니다 .


여기서 Key 사용이 있어서 Key 사용에 대해서 말씀 드리고 마치도록 하겠습니다 .


6-1.png




이부분에 프로젝트 넘버를 넣어 주면 되겠습니다 . ex) 834179481724 

숫자로 되어있는 ID 입니다 .


Articles

1 2 3 4 5 6 7 8 9 10