본문 바로가기

Android/NetWork

안드로이드/Android C2DM 사용해 보자! ( 예제 포함 )


 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.2  
   API LEVEL : 8 
   이클립스 버젼 : Indigo
   테스트단말 : 삼성갤럭시 S2



안드로이드/Android C2DM 사용해 보자! ( 예제 포함 )



안녕하세요. [안드로이드/Android C2DM 이란?] 이란 포스팅 이후로 오래간만에 인사드립니다. 오늘은 실제 C2DM을 사용하는 방법에 대해서 알아 볼텐데요.!! 이전에 C2DM 구조에 대해 이해하신 분이라면, 바로 사용 하실 수 있고, 안보신 분들은 C2DM 사용법이 녹녹치 않을 텐데요.!! 이론을 먼저 보시고 예제를 따라 하시는 걸 추천해 드립니다.^^


자 아래는 저번에 설명했던 C2DM 흐름 입니다. 음 참..볼때 마다 새롭죠?ㅎㅎ


기본적인 흐름은 이렇습니다. 여기서는 각 단계별로 해야할 작업들을 설명해 하겠습니다.


1. C2DM 등록

아래의 URL로 접속해서 C2DM 서비스를 등록해 줍니다.

https://developers.google.com/android/c2dm/signup?hl=ko-KR


이미지 출처 : http://warmz.tistory.com/570



2. 등록 인증

C2DM 서비스 등록이 완료 되면, 등록 확인 메일이 오게 됩니다.


이미지 출처 : http://warmz.tistory.com/570




3. 서버 등록

C2DM에 DB를 등록 하는 과정 입니다. C2DM 서비스를 사용할 DB를 등록해 줍니다. 실제 개발에서는 DB 담당자분께서 처리해 주시는 부분 입니다.


4. 서버 인증

C2DM에 DB를 등록 확인을 받는 단계 입니다. 이단계에서는 1. C2DM 등록 단계에서 등록한 sender 구글계정을 사용하여 인증을 받게 됩니다. 인증을 받게 되면, 인증키(AuthKey)를 획득하게 되고, 인증키(AuthKey)는 푸쉬 메시지를 C2DM 서버에 보낼 때 사용 하게 됩니다. 역시 서버 담당자분께서 처리해 주시는 부분 입니다. 참고> sender 계정을 실제 마켓에 연동이 안되어 있어도 구글 가입계정이면 사용 가능 합니다.


5. Device 등록

C2DM에 Device를 등록 하는 단계 입니다. C2DM 서비스를 받기 위해서는 sender 메일과 함께 Device를 C2DM 서버에 등록 하는 과정이 필요 합니다. 이 과정에서 실제 코딩이 시작 됩니다.


// C2DM 등록
public void registerC2DM(Context context){
	String loadPreference = PreferUtil.getPreferences(this, PreferUtil.PREF, "");
	
	Log.d(TAG, "loadPreference = " + loadPreference);
	
	if((CommonUtil.isOnline(this) != Constants.ERROR_CODE) && loadPreference.equals("")) {
		Log.d(TAG, "start registartion c2dm");
		Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
		registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
		registrationIntent.putExtra("sender", "sender이메일".trim());
		startService(registrationIntent);
	}
}

여기서 해야 할 작업은, 1. C2DM 등록 과정에서 사용했던 "sender 이메일" 넣어 주는 작업 입니다. "send 이메일" 은 구글계정을 새로 만드셔서 등록 하시면 됩니다.  

registrationIntent.putExtra("sender", "sender이메일".trim());

만약 youinna@gmail.com 이라는 "sender 이메일"을 만들었다면,

registrationIntent.putExtra("sender", "youinna@gmail.com".trim());

라고 등록해 주시면 됩니다.



6. 등록 인증

"sender 이메일" 을 사용해서 해당 DEVICE가 C2DM 등록 한 경우 , C2DM 서버로 부터 응답을 받게 되는데요. 성공, 실패에 따라, Resigstraion_ID(등록 아이디) 또는 error 코드를 BroadCastReceiver를 통해 받게 됩니다.

 

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		Log.e(TAG, "onReceive");
		
		if(intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
			handleRegistration(context,intent);
		}else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
			handleMessage(context,intent);
		}
	}


DEVICE를 C2DM 등록을 요청한 경우, 바로 아래와 같은 Recevier를 받을 수 있습니다. 

 if(intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
       handleRegistration(context,intent);
 }


DEVICE가 C2DM 등록에 성공한 경우, 서버에서 Registration_ID(등록 아이디)를 보내주고, 실패 하거나 정의되지 않은 에러일 경우, 해당 내용을 보내주게 됩니다. 

private void handleRegistration(Context context, Intent intent) {
		Log.e(TAG, "handleRegistration");
		String registration = intent.getStringExtra("registration_id");
		
		if(intent.getStringExtra("error") != null) {
			//Registration failed, should try again later.
		}else if(intent.getStringExtra("unregistered") != null) {
			Log.e(TAG, "unregistered");
		}else if(registration != null) {
			Log.e(TAG, registration);
			sendRegIdToServer(context,registration, getPhonNumber(context));
		}
	}



7. 등록 아이디 저장

C2DM 서버에 DEVICE를 정상적으로 등록 한 경우에, Registarion_ID(등록 아이디)를 얻을 수 있다고 말했는데요, 정상적으로 Registarion_ID(등록 아이디) 를 얻오 온 경우에는, 사용자 DB에 저장을 해줘야 합니다. 그래야 나중에 DB에서 메시지(PUSH) 요청을 할 경우에, DEVICE들을 구별 할 수 있고 또한 메시지를 PUSH 시켜줄 목록을 만들게 되기 때문입니다.


결국은 DB에 등록된 각각의 Registarion_ID(등록 아이디)가 DEVICE라고 생각 하시면 됩니다. 자 그럼 DB에 등록 아이디를 저장하는 방법을 알아 보겠습니다.


public void sendRegIdToServer(Context context,String regId,String name) {        
		try {            
			String sURLEncoded = URLEncoder.encode(name, "EUC-KR");
			StringBuffer postDataBuilder = new StringBuffer();            
			postDataBuilder.append("registId=" + regId); // Registraion_ID            
			postDataBuilder.append("&name=" + sURLEncoded); // Phone number
			byte[] postData = postDataBuilder.toString().getBytes("UTF8");                         
			URL url = new URL(HOST);            
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();                         
			conn.setDoOutput(true);            
			conn.setUseCaches(false);            
			conn.setRequestMethod("POST");            
			conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");            
			conn.setRequestProperty("Content-Length",Integer.toString(postData.length));            
			OutputStream out = conn.getOutputStream();         
			out.write(postData);            
			out.close();            
			
			System.out.println(conn.getResponseCode());
			
			if(conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
				Toast.makeText(context, 
						"Registration Id 등록 성공", Toast.LENGTH_SHORT).show();
			}else {
				Toast.makeText(context, 
						"Registration Id 등록 실패", Toast.LENGTH_SHORT).show();
			}
			
		} catch (Exception e) {    
			Toast.makeText(context, 
					"Registration Id 등록 실패", Toast.LENGTH_SHORT).show();
			e.printStackTrace();        
		}    
	}


이런 식으로 Registration_ID(등록 아이디) 뿐만 아니라, DB에서 요구하는 정보들을 넣어서 등록해 줄 수 있습니다.



8. 푸쉬(PUSH) 요청

DB 에서 C2DM 서버로 푸쉬요청을 해주는 단계 입니다. 일반적으로 안드로이드 프로그래밍을 하신 다면, DB 담당장분이  알아서 해주는 부분 입니다. DB 담장자는 4. 서버 인증 단계에서 받았던, AuthKey(인증키) 와 , 7. 등록 아이디 저장 과정에서 DEVICE가 등록해준 Registraion_ID(등록 아이디) 를 기반으로 보낼 메시지(Messgae) 를 C2DM 서버에 전달해 줍니다.



9. 푸쉬(PUSH)

DB에서 전달 받은 AuthKey(인증키), Registraion_ID(등록 아이디)를 가지고 C2DM 서버에 등록 되있는 DEVICE 들에게 보낼 메시지(Messgae) 를 전송해 줍니다. 해당 내용은 BroadCastReceiver를 통해 각각의 DEVICE 들에게 전달 되며, 각각의 DEVICE에는 해당 패키지명으로 Intent Filter가 설정되어 있기 때문에, 여러개의 C2DM 서비스를 이용 하더라도 해당 서비스별로 메시지를 받을 수 있게 됩니다.^^


@Override
	public void onReceive(Context context, Intent intent) {
		Log.e(TAG, "onReceive");
		
		if(intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
			handleRegistration(context,intent);
		}else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
			handleMessage(context,intent);
		}
	}



푸쉬(PUSH) 메시지가 정상적으로 보내지게 되면, 아래의 BoradCastReceiver로 메시지가 들어오게 되고, Notification이나 팝업창으로 해당 사실을 알려주거나, 처리 하시면 됩니다.

 }else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
      handleMessage(context,intent);
 } 


자 이렇게 해서 C2DM에 관해 전반적인 설명을 마쳤는데요.! 어떠신가요? 실제 활용하실 수 있겠나요? 아무튼 여기 까지 이해 하셨으면 잘 하시리라 믿습니다. 아래에 예제 파일을 첨부해 드릴텐데요. 1. 예제는 위에 설명한 내용에 기반이 되는 소스이고, 2. 예제는 직접 C2DM 서버와 통신하고 메시지를 보내는 방법의 예제를 첨부 하겠습니다.



1. 예제




2. 예제

TestC2DM.zip





감사합니다.






출처 : 그림설명 : http://aldehyde7.tistory.com/155

출처 : 코드 사용 적용한 곳 : http://warmz.tistory.com/570

출처 : 설명 좋은 곳 : http://blog.naver.com/PostView.nhn?blogId=haengro&logNo=40134086859

출처 : C2dm 링크 : http://88oy.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-C2DM-ServerJSP-Device%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%ED%8F%B0-%EA%B5%AC%ED%98%84

출처 : 안드로이드 사이드 : http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=14705#c14706

출처 : 파이썬으로 서버만들기 : http://blog.leehack.com/2011/12/android-c2dm-client.html

출처 : 쎄미의 블로그 third party 서버 연동 :  http://susemi99.tistory.com/683

출처 http://croute.me/331

출처 http://inyun.egloos.com/m/524176