[현재 접속자 현황]
안드로이드 관련 팁 게시판입니다.
글수 27
# 안드로이드 2.2 C2DM(Cloud to Device Message) 개요
0. 데모
1) 크롬투폰
크롬브라우저 -> 구글클라우서버로 전송 -> 안드로이드폰
(크롬투폰 익스텐션) (크롬투폰앱)
2) 점프노트
구글앱엔진 애플리케이션-> 구글클라우서버로 전송 -> 안드로이드폰
안드로이드폰-> 구글클라우서버로 전송 -> 구글앱엔진 애플리케이션
1. 목적: 구글클라우드서버 --> 안드로이드폰 (메시지푸쉬)
2. 아키텍처
애플리케이션서버(서버) -> 클라우드서버 -> 안드로이드폰(클라이언트)
:애플리케이션 서버에서 안드로이드 클라이언트에게로 간단한 업데이트를 푸쉬할 때 사용
3. 제약 사항
- 아직 C2DM 서비스 신청자에 한해서만 사용(개발) 가능
http://code.google.com/intl/ko/android/c2dm/signup.html
- 안드로이드 2.2 이상, GMail계정이 있어야함
- 보낼수 있는 메시지는 1024바이트
- 최대 전송 갯수는 구글이 제한할 수도 있음
4. 작동 원리
1) 구글클라우드서버 --> 안드로이드폰 (GMail서비스)
: 클라우드서버는 앱ID와 등록ID를 통해 안드로이드폰을 인식함
2) 앱ID와 등록ID
: 안드로이드폰에서 GMail계정과 앱정보를 클라우드서버로 인텐트를 전송하면 브로드캐스트 리시버에서 앱ID와 등록ID를 획득
유저간 앱ID, 등록ID를 서로 알면 구글클라우드서버로 서로 메시지 전송 가능
3) 구글클라우드서버 메시지 수신
: 브로드캐스트리시버에서 이벤트로 수신 --> 토스트, 알림...
5. 실습 1 (C2DM 메시지 전송 예제)
1) C2DM 개발자 등록
http://code.google.com/intl/ko/android/c2dm/signup.html
2) AVD에서 SDK 설치
Google APIs by Google Inc., Android API 8 (revision 2)
3) 안드로이드 2.2 프로젝트생성 (Google API)
4) C2DM관련 권한 설정
<permission android:name="패키지명.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="패키지명.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
5) okgosu에게 메시지 보내기: 버튼을 클릭하면 구글클라우드서버로 전송
try {
// okgosu 계정에 대한 값
String authToken = "DQAAAKYAAAAMKyW...어쩌구...저쩌구";
String reg_id = "APA91bGsWK3Jhm...어쩌구...저쩌구";
sendC2DM(reg_id, authToken, ed_msg.getText().toString());
} catch (Exception e) {
e.printStackTrace();
}
6) 클라우드서버로 메시지 전송하는 메소드 구현
public void sendC2DM(String registration_id, String authToken, String msg) throws Exception {
StringBuffer postDataBuilder = new StringBuffer();
postDataBuilder.append("registration_id=" + registration_id);
postDataBuilder.append("&collapse_key=1&delay_while_idle=1");
postDataBuilder.append("&data.msg=" + URLEncoder.encode(msg, "UTF-8"));
byte[] postData = sb.toString().getBytes("UTF8");
URL url = new URL("https://android.apis.google.com/c2dm/send");
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));
conn.setRequestProperty("Authorization", "GoogleLogin auth=" + authToken);
OutputStream out = conn.getOutputStream();
out.write(postData);
out.close();
conn.getInputStream();
}
6. 실습2 (등록ID, 토큰 획득 화면)
1) 레이아웃 my_reg_token.xml
에디드텍스트 3개 (ed_email, ed_pw, ed_result)
버튼 1개 추가 (btn_reg)
2) 액티비티 생성 MyRegToken extends Activity
3) getRegisterID 메소드 추가
private void getRegisterID(String receiverMail) {
Intent registrationIntent = new Intent ("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0));
registrationIntent.putExtra("sender", receiverMail);
startService(registrationIntent);
}
4) getAuthToken 메소드 추가
public String getAuthToken(String mail, String pw) throws Exception {
String authtoken = "";
StringBuffer sb = new StringBuffer();
sb.append("accountType=HOSTED_OR_GOOGLE&service=ac2dm&source=test-1.0");
sb.append("&Email="+mail); // 개발자 구글 id
sb.append("&Passwd="+pw); // 개발자 구글 비빌번호
byte[] postData = postDataBuilder.toString().getBytes("UTF8");
URL url = new URL("https://www.google.com/accounts/ClientLogin");
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();
BufferedReader br = new BufferedReader(new InputStreamReader (conn.getInputStream()));
String sidLine = br.readLine();
String lsidLine = br.readLine();
String authLine = br.readLine();
authtoken = authLine.substring(5, authLine.length());
return authtoken;
}
5) onCreate 구현
btn_reg를 클릭하면 다음 처럼 getRegisterID, getAuthToken 함수 호출
setContentView(R.layout.my_reg_token);
final EditText ed_email = (EditText)findViewById(R.id.ed_email);
final EditText ed_pw = (EditText)findViewById(R.id.ed_pw);
final EditText ed_result = (EditText)findViewById(R.id.ed_result);
Button btn_reg = (Button)findViewById(R.id.btn_reg);
btn_reg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
getRegisterID(ed_email.getText().toString());
try {
String token = getAuthToken(ed_email.getText().toString(), ed_pw.getText().toString());
ed_result.setText("token: " + token);
} catch(Exception e) {
e.printStackTrace();
}
}
});
7. 실습3 (클라우드 메시지 이벤트 수신)
1) 브로드캐스트 리시버 생성
public class C2DMReceiver extends BroadcastReceiver
2) 멤버변수 추가
static String registration_id = null;
static String c2dm_msg = null;
3) onReceive 메소드 오버라이딩
if (intent.getAction().equals
("com.google.android.c2dm.intent.REGISTRATION")) {
// 클라우드 ID 등록
handleRegistration(context, intent);
} else if (intent.getAction().equals
("com.google.android.c2dm.intent.RECEIVE")) {
// 클라우드 메시지 수신 (토스트 또는 노티피케이션 띄우기)
c2dm_msg = intent.getExtras().getString("msg");
Toast.makeText(context, "메시지 도착!\n" + c2dm_msg, 2000).show();
}
4) 클라우드 등록이벤트 처리
private void handleRegistration(Context context, Intent intent) {
if (intent.getStringExtra("error") != null) {
Log.d("okgosu", "@@@ Registration failed @@@");
} else if (intent.getStringExtra("unregistered") != null) {
Log.d("okgosu", "@@@ unregistration done @@@");
} else if (intent.getStringExtra("registration_id") != null) {
registration_id = intent.getStringExtra("registration_id");
Log.d("okgosu", "@@@ registration_id: " + registration_id);
}
}
5) 매니페스트에 브로드캐스트 리시버 등록
<receiver android:name="C2DMReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="패키지명" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="패키지명" />
</intent-filter>
</receiver>
* 에뮬레이터는 메일 계정을 설정해줘야함!






okgosu
최근 답변 댓글