Gooday Note Scrap Source Android login
 
작성일 : 12-08-21 09:33
[푸쉬 서비스|Push Service] Google C2DM - GCM
 글쓴이 : 기리
조회 : 9,881   추천 : 0   비추천 : 0  
   http://blog.naver.com/0677haha/60165740039 [1562]
   http://blog.naver.com/0677haha/60165829314 [1946]

android GCM test 프로젝트 만들기(1)

개발 환경 설정, API 프로젝트 등록, 및 서비스 활성화, Server Key 받기, SDK 설치


C2DM 에서 대체된 GCM 샘플 프로젝트를 만들어 봅시다!!

영어를 잘 못하지만 더 못하시는 분들을 위해 한번 한글로 번역해서 작성해 봅니다.


http://developer.android.com/guide/google/gcm/gs.html#libs

위의 사이트에서 나온 내용을 토대로 해보면서 작성한 내용이니 더 필요한 정보가 있을 경우 위의 사이트를 방문하세요~ㅋ



// 서비스 활성화 및 서버 키 받기


1. 먼저 구글 API 프로젝트를 생성합니다. 

https://code.google.com/apis/console/b/0/

한번도 생성하지 않았다면 Create Projects 라는 버튼이 달린 화면이 보여질 것입니다.

생성을 했었다면 DashBoard 페이지가 보여질 거라네요 ㅋ


2. Create Project를 하면  https://code.google.com/apis/console/#project:4815162342

이런 페이지가 보여진다네요.

여기서 보이는 project 뒤에 있는 숫자 4815162342 를 기억해야하는데 이 숫자가 당신의 프로젝트 고유 ID 입니다.

4815162342 는 샘플 숫자이니 본인의 웹 브라우저에 보이는 숫자를 기억하세요.ㅋ

이 숫자는 나중에 SENDER_ID로 사용됩니다.


3. 그다음으로 GCM 서비스를 활성화 시켜야 합니다.

화면 왼쪽에 보이는 메뉴중에 Services 메뉴를 선택하면 보이는 서비스 리스트중 가운데쯤에 보이는

Google Cloud Messaging for Android 를 ON으로 토글시키세요.

그러면 서비스 동의 페이지가 보이는데 퀵하게 동의에 체크하고 Accept 클릭!! 그러면

아래와 같이 Active에 1개가 표시되면서 활성화 되었다는 것을 알려주는 페이지가 보여지게 됩니다.




4. 그다음으로 API key를 얻어야 하는데 위의 그림에서 API Access를 클릭합니다.


가이드상에는 페이지가 저렇게 되어 있지만 저같은 경우에는 진입하는 순간 키가 발급되어져 있더군요.

그런데 자세히 보니까 Keys for browser 더군요. 

그래서 Create new Server Key를 누르면


가이드상에는 그냥 Create를 누르라고 하던군요. 그래서 그냥 Create를 눌러 서버용 키를 발급 받습니다.

뭐 나중에 수정이 가능하게 되어있으니 우선 하란대로 합니다.ㅋㅋ



이제 키가 발급되었습니다.


다음 작업을 하기 위해서는 helper libraries를 설치해야한다는군요.

From the SDK Manager, install Extras > Google Cloud Messaging for Android Library

This creates a gcm directory under YOUR_SDK_ROOT/extras/google/ containing these subdirectories: gcm-client,gcm-demo-appenginegcm-demo-clientgcm-demo-server, and gcm-server


자 설치를 시켜놓고 커피한잔.. 하려고 했는데... SDK Manager 리스트에 보이지 않네요..


왜 그럴까 하고 찾아보니 android SDK Tools 과 android SDK Platform-tools를 아래와 같은 revision으로 업데이트 하랍니다!! ㅋ



업데이트는 오래 걸리니 시켜놓고 커피 한잔.. 


업데이트 후 봤는데 또 안나와.................................


그래서 혹시나 하는 마음에 Install New SoftWare에서


androidADT - https://dl-ssl.google.com/android/eclipse/


를 검색해서 보이는 ADT를 업데이트 시켰다.. 그림에서 체크는 되어있지 않지만 밑에 보이는 NDK 플러그인도 같이..



그랬더니 드디어 보인다.................... 와 눈물나네..

스크롤 되어서 보이지는 않지만 이번에 업데이트된 젤리빈(API 16)도 같이 나오더라.. 원래부터 보였는지는 모르겠지만.


업데이트 하시면 됩니다.

우선 1부는 여기서 마치고.. 2부 Application 편은 다음 포스팅에서





android GCM test 프로젝트 만들기(2)

Application 편



기본 개발환경 설정을 다 하셨다면 이제 어플리케이션에서 코드를 작성해 봅시다. 후아.

1. GCMTest 프로젝트(for android)를 생성합니다. (이부분은 그냥 패스합니다. 다들 아실거라 생각하고)

   GCM은 API 8 이상 부터 동작합니다. C2DM이 그랬던 것처럼.. 

   그래서 프로젝트 생성시 API 레벨은 8 이상으로 작성하셔야 됩니다.


2. 생성한 프로젝트에 gcm.jar 파일 등록

YOUR_SDK_ROOT/extras/google/gcm/gcm-client/dist에 보면 gcm.jar 파일이 있습니다.

이 jar 파일을 복사해서 project에 libs 폴더를 만들고, 붙여넣기를 합니다.


아래 그림은 lib로 되어 있지만 libs로 하셔야 합니다. 

그렇지 않을 경우 실행시 noclassdeffounderror 가 발생합니다.



그런 다음 jar 파일에서 마우스 오른쪽 클릭해서 다음과 같이 Build Path에 add 시켜줍니다.




3. Android Manifest 파일 수정


다들 아시겠지만 퍼미션은 manifest 태그 안에 receiver는 application 태그 안에 써주셔야합니다. ㅋ


Manifest 파일에 아래와 같은 퍼미션을 줍니다. 

API 레벨 16 이상부터는 안써줘도 된답니다. 뭐 자동으로 해주는듯...

my_app_package는 1번에서 생성한 프로젝트의 패키지명을 써주면 됩니다.

<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />


이 퍼미션은 오로지 이 어플리케이션이 GCM 메세지를 받도록 설정하는 거라군요.

<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> 


실제로 GCM 메세지를 받을 수 있도록 퍼미션을 더해줍니다.

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />


그리고 BroadCastReceiver를 등록합니다.

<receiver android:name=".GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="my_app_package" />
  </intent-filter>
</receiver>

programmatically 하게 등록하지말고 그냥 Manifest에 등록하랍니다..

http://blog.naver.com/0677haha/60165530800 에 쓴 것처럼.. 런타임에 리시버 등록했다가 피볼 수도...


category 는 마찬가지로 API 16 부터는 써주지 않아도 된답니다. 

my_app_package는 본인의 어플리케이션 패키지 명으로 변경하시길..ㅋ


<uses-permission android:name="com.google.android.c2dm.permission.SEND" />

you are ensuring that only intents sent by the GCM system framework are sent to the receiver (a regular application cannot issue intents with that permission).

위의 퍼미션을 주게 되면 GCM System FrameWork에 의해서 보내진 Intents 들만 서버에 보내지는 것을 보장한다고 합니다.


아래쪽 작업을 다 하고 실행시켜보려할때 Security Exception이 발생하는데 

<uses-permission android:name="android.permission.WAKE_LOCK" />

위의 퍼미션을 추가해주시면 됩니다. 가이드에는 왜 없는지.... 모르겠네요.



4. 다음으로 서비스 등록

<service android:name=".GCMIntentService" />

이 서비스는 다음에 설명할 내용인 GCMBroadCastReceiver에 의해서 호출됩니다.



5. 자 이제 실제로 등록할 수 있는 Java 파일을 작성해봅니다. 

   여기서부터는 서버쪽 작업이 다 완료되어잇다는 가정하에 클라이언트 기준으로 작업을 하였습니다. 서버쪽은 다음 기회에..


아래의 내용은 http://developer.android.com/guide/google/gcm/gcm.html Architectural overView를 보고 작성했습니다.


1번에서 생성한 프로젝트의 MainActivity에서

등록을 시작해봅니다.


MainActivity.java


//등록하기

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");

// sets the app name in the intent

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));

registrationIntent.putExtra("sender", PROJECT_ID);

startService(registrationIntent);


기존 C2DM 에서는 PROJECT_ID 에 등록한 사람 메일 주소를 썼었는데

GCM에서는 http://blog.naver.com/0677haha/60165740039 의 2번에서 설명한 Project ID를 사용합니다.


C2DM에서 GCM으로 마이그레이션 하는방법도 이 PROJECT_ID를 메일주소에서 숫자형식의 projectId로 만 바꾸면 된다네요.


여기서 펜딩 인텐트로 서비스를 시작 시키면 누가 받느냐..

매니페스트에 등록한 GCMBroadcastReceiver 가 받습니다.


public class GCMBroadCastReceiver extends BroadcastReceiver {


@Override

public void onReceive(Context context, Intent intent) {

Log.e("MyBroadCastReceiver", "onReceive");


// These intents are sent by GCM to indicate that a device was registered (or unregistered), or to deliver messages, respectively. Handling these intents might require I/O operations (such as network calls to the 3rd party server), and such operations should not be done in the receiver's onReceive() method. You may be tempted to spawn a new thread directly, but there are no guarantees that the process will run long enough for the thread to finish the work. Thus the recommended way to handle the intents is to delegate them to a service, such as an IntentService.


GCMIntentService.runIntentInService(context, intent);

        setResult(Activity.RESULT_OK, null, null);

}

}


뭐라고 그러는지 영어로 한참 설명이 되어 있습니다. 제 나름대로 해석한 바로는 프로세스가 작업을 하는 Thread가 끝날대까지 살아있으리라고는 보장할 수 없기 때문에 IntentService와 같은것을 사용해서 처리하는 것을 추천한다고 합니다.


자 그래서 저기서 실행시켜주는 서비스가 무었이냐면 매니페스트에 등록한 GCMIntentService 입니다.


서비스 코드 내용은 등록완료 되었거나 메세지 수신시 처리하는 코드들이며.. 코드 내용이 많은 관계로 

http://developer.android.com/guide/google/gcm/gcm.html 페이지에서 MyIntentService를 찾아서 보시기 바랍니다.


중요한 것은 MyIntentService를 그대로 적용하였을때, 실행해보면 에러가 발생하는데.


can't instantiate class my_app_package.GCMIntentService; no empty constructor.

         

이 내용은 빈 생성자가 없다는 내용입니다. 이때 아래와 같이 빈 생성자를 하나 생성해주고

super를 호출해 주면 해결이 됩니다.


public GCMIntentService() {

super("GCMIntentService");

}



자 이렇게 하고 실행을 해보면.......

GCMIntentService가 registrationId가 포함된 Intent를 받아서 등록된 Id를 볼 수 있게 됩니다.




기리 12-10-03 00:56
 
* 안드로이드 GCM 이용과 Third party(jsp) 가이드 - 1부
http://www.cusmaker.com/101
* 안드로이드 GCM 이용과 Third party(jsp) 가이드 - 2부
http://www.cusmaker.com/104
* 안드로이드 GCM 이용과 Third party(jsp) 가이드 - 3부
http://www.cusmaker.com/106
기리 12-10-03 13:56