Android Push GCM 프로젝트 앱 적용 하기(2)
첫번째 포스트를 통해서 Android 앱 에서 필요한 Key 두가지를 추출 하였습니다 .
이제 Android 앱을 구성 하고 Key 를 사용해 볼 차례 입니다 .
구글에서 GCM 관련 클라이언트 코드를 제공 하고 있습니다 .
https://code.google.com/p/gcm/
구글 코드를 내려 받기 위해서는 git 을 사용 해야 합니다 .
중앙에 보면 git 주소가 있습니다 .
git clone https://code.google.com/p/gcm/
git 사용법에 대해서는 따로 말씀 드리지 않겠습니다 .
워낙 많이 사용하고있어서 제 블로그나 아니면 다른블로그 git 포스트를 학습하시면 좋을 것 같습니다 .
정 못하신분은 댓글을 달아 주시면 제가 파일을 보내 드리도록 하겠습니다.
git을 통해서 코드를 내려 받습니다 .
코드를 내려 받으면 이와 같은 폴더가 생깁니다 .
여기에 저희가 필요한 코드들이 있습니다.
코드 준비는 마쳤습니다 .
다음으로 GCM 을 사용하기 위해서 Google Play Service SDK 다운로드를 진행 합니다 .
인터넷에서 GCM 구현에 관련된 글들을 찾아보면 대부분 gcm.jar를 사용하는데 gcm.jar 역시 deprecate 되었습니다.
그래서 저또한 구버젼 말고 신버젼을 사용하기 위해서 이렇게 포스트를 작성 하고 있습니다.
위와 같이 Google Play Services 를 다운로드 합니다 .
다운을 완료하면
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 파일을 넣습니다.
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
위경로로 접근을 하면 이와 같이 파일이 있습니다.
위 파일은 res/values 폴더에 넣습니다.
이제 코드준비도 되었으니 GCM 핵심코드를 구성 하면 되겠습니다 .
git 을통해서 받은 gcm 폴더에서 GcmBroadcastReceiver.java , GcmIntentService.java 를 복사해서
프로젝트로 이동합니다 .
GcmIntentService 파일을 수정 합니다 .
그러면 몇가지 에러가 발생 합니다 , 푸시가 도착하면 DemoActivity 를 열려해서 에러가 나타납니다 .
우리의 Activity 로 변경해주시면 될 것 같습니다 .
AndroidManifast.xml 파일 수정 진행
Android GCM 을 사용할수 있는 설정을 AndroidManifast.xml 에서 진행 합니다 .
1 2 3 4 5 6 7 8 |
위와 같이 퍼미션을 설정합니다.
퍼미션 설정 간의 주의 점이 있습니다 .
위 빨간색 상자부분은 자신의 패키지 명이 들어가야 합니다.
1 2 3 | android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> |
메타 데이터를 설정 합니다 .
위에서 저희가 준비한 Version.xml 을 읽어오게 됩니다.
1 2 3 4 5 6 7 8 9 10 11 | android:name=".GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > |
Receiver 를 등록 합니다 .
위 빨간상자안은 해당 프로젝트 패키지를 넣어 주셔야 합니다 .
마지막으로 Service 를 등록 합니다 .
여기까지 설정을 진행 하면 androidManifast.xml 설정이 완료 됩니다 .
이제 마지막으로 Activity 설정을 진행 하면 됩니다 .
DemoActivity 코드가 필요합니다 .
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 AsyncTask @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(null, null, null); } // Send an upstream message. public void onClick(final View view) { if (view == findViewById(R.id.send)) { new AsyncTask @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(null, null, null); } 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 사용에 대해서 말씀 드리고 마치도록 하겠습니다 .
이부분에 프로젝트 넘버를 넣어 주면 되겠습니다 . ex) 834179481724
숫자로 되어있는 ID 입니다 .
[출처] Android Push GCM 프로젝트 앱 적용 하기(2) |작성자 기눙이