총 게시물 1,102건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[TIP&TECH]

C2DM을 이용한 간단한 푸쉬 예제

글쓴이 : 리칼 날짜 : 2010-11-19 (금) 14:55 조회 : 114898
글주소 : http://www.androidside.com/B56/19101
 
  애플컴퓨터 전문업체 애니셀
맥킨토니유지보수 전문업체, 맥킨토시 할인판매, 맥프로그램 세팅, 중고맥 보상판매
www.anysell.net
  옥션 APPLE
더 편리해진 옥션여행! 해외&국내 숙소 할인받고 예약하기! APPLE.
atour.auction.co.kr
  역시 NO.1 롯데면세점
6차 릴레이경품 LIVE #뉴욕에서 로맨틱 크리스마스, 뉴욕 왕복 항공권+호텔
kor.lottedfs.com
신청하기


안녕하세요^^ 리칼입니다.

저도 안드로이드를 하면서 제가 이런글을 올리게 될지 몰랐네요 ㅎㅎ

솔직히 자기의 소스를 공유하면서 강좌 하시는분들을 보면서 정말 대단하다고 생각하였습니다.

자기 시간내기도 힘든데 저렇게 강좌하시는분들이 있기에 안드로이드의 미래가 밝다고 생각합니다.

그래서 조금이나마 저도 보템이 되려고 이렇게 c2dm에 관한 예제를 올리게 되었습니다^^

자! 그럼 시작할께요. 미숙하지만 잘봐주셨으면 감사하겠습니다~

일단 c2dm이 Cloud to Device Messaging 의 약자로 알고 있습니다. 안드로이드 2.2 프로요부터 생겨난 

이 API는 개발자들이 서버와 모바일 어플리케이션간에 데이타를 쉽게 싱크할 수 있도록, 서버쪽 에서에서 

안드로이드 폰 상의 어플리케이션으로 데이타를 손쉽게 전달할 수 있도록 도와줍니다.

쉽게 생각하시면 아이폰의 푸쉬 기능이라고 보시면 됩니다. 현재 c2dm이 나오기전까진 polling기법을 

토하여 실시간 메시징을 했다고 알고있는데 이번 이 api가 추가되면서 일반 서드파티 개발자도 손쉽게 

프로그래밍을 개발할수 있으리라 봅니다. 자! 서론이 길었네요 바로 본론으로!

먼저 푸쉬를 사용하기 위해선 구글에 신청을 하여야 합니다. 이게좀 귀찮죠. 신청을 해도 바로 사용할수 

있는게 아니라 승인 메일이 와야합니다. 전 일주정도 걸린듯 하네요..미리미리 신청하세요~~

http://code.google.com/intl/ko-KR/android/c2dm/signup.html 이쪽에서 신청하시면 됩니다.

그러면 메일이 invite어쩌고 올겁니다. 그러면 그담부터 사용해도 된다는거죠 

제가 만들어 보려는 예제는 메시지를 보내서 실시간으로 다른 폰으로 가게 하는겁니다. 하지만 

그럴려면 폰이 2대가 있어야 하는데 대부분 1대밖에 없다는 가정하에 제가 제 자신폰으로 보내게 하도록 

구성하였습니다.

간단히 기본 구성원리를 설명해드리겠습니다.

c2dm을 사용하기 위해선 크게 5가지가 필요합니다. 

개발자ID(구글계정), 애플리케이션ID(패키지이름정도), 등록ID(특정장치를식별하는 ID),
구글사용자계정(보통핸드폰로그인구글계정),인증토큰값이 필요합니다.

처음에 어플을 실행하여 개발자ID와 어플ID를 c2dm서버에 전송하여 등록ID를 발급 받습니다.
그러면 그 ID가 자기 식별고유ID가 됩니다. 이걸로 상대방 핸드폰을 식별하게 되는거죠.

그담에 메시지를 쓰고 전송을 누르면 먼저 c2dm에 인증을 요청해야 합니다. 아무나 보내면 

보안에 문제가 있겠죠? 이때 개발자ID가 필요합니다. 개발자가 c2dm을 신청하였기 때문에 

쓸수가 있는거죠~ 그리고 나서 인증을 되면 등록ID,인증토큰값,보낼 메시지등등을 푸쉬에 담아

상대방 핸드폰으로 보내게 됩니다... 여기서 중요한건 저는 지금 제 자신에게 푸쉬를 보내게 

만들었습니다. 그러므로 다중 메시지보내기 어플을 만들게 된다면 상대방의 등록ID를 알아야겠죠?

그럴라면 서드파티서버가 필요합니다. 그 서버를 구현하여 디비를 만들고 상대방의 ID를 등록

시켜서 푸쉬를 보내야 할것입니다. 이건 사용자가 직접 구현해야 하는 사항입니다.

대충이렇습니다. 


////////////////////////////////////////////////////////////////////////////////////


자 이제 c2dm 예제를 시작하겠습니다. 먼저 프로젝트 생성후 대충 저처럼 UI구성하세요.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:gravity="center_vertical"
    >
<TextView  
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="메세지 보내기"
    />
    <EditText
    android:id="@+id/msg_text"
    android:layout_width="180dip" 
    android:layout_height="wrap_content"/> 
    <Button
    android:id="@+id/msg_send"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="보내기"/> 
</LinearLayout>




그리고 메인 activity 에서 아까 말한것 같이 등록ID를 발급 받아야 합니다. 
이렇게 작성하시면 됩니다. 

C2dm.java

public class C2dmTest extends Activity {
    
static String registration_id = null;
static String c2dm_msg = "";
    @Override
    public void onReceive(Context context, Intent intent) {
     if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
    
     handleRegistration(context, intent);
    
     } else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
    
     c2dm_msg = intent.getExtras().getString("msg");
    
     System.out.println("c2dm_msg======>"+c2dm_msg);
     Toast toast = Toast.makeText(context, "메시지 도착!\n"+c2dm_msg, Toast.LENGTH_SHORT );
  toast.setGravity( Gravity.TOP | Gravity.CENTER, 0, 150 );
  toast.show();
    
     }
    }
    
    private void handleRegistration(Context context, Intent intent) {
    
     registration_id = intent.getStringExtra("registration_id");
    
     System.out.println("registration_id====>"+registration_id);
    
     if (intent.getStringExtra("error") != null) {
    
     Log.v("C2DM_REGISTRATION",">>>>>" + "Registration failed, should try again later." + "<<<<<");
    
     } else if (intent.getStringExtra("unregistered") != null) {

     Log.v("C2DM_REGISTRATION",">>>>>" + "unregistration done, new messages from the authorized sender will be rejected" + "<<<<<");
    
     } else if (registration_id != null) {
    
     System.out.println("registration_id complete!!");
     }
    }
    
    
}

바로 이 클래스가 BroadcastReceiver를 상속받아서 통보를 하는 역할을 하게 되죠.

BroadcastReceiver 의 역할은 제 설명보다는 직접 찾아보시는게 좋을듯해요 ㅠㅠ 제가 설명을 잘못해서~

무튼 간단하게 통보 역할을 하신다고 보면 되겠네요~

저위에 보면 BroadcastReceiver를 상속받아  onReceive를 오버라이드 한걸 보실수 있습니다.

C2dmTest activity에서 처음에 등록을 하게되면 이 onReceive를 통해 아이디를 받을수 있습니다.

적절한 if문을 통해 받을수가 있죠 

if (intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")) {
이부분이 바로 등록ID를 받는 부분입니다. 등록ID를 받게되면 handleRegistration함수에서 id를 제대로 받았는지 

검사하게 됩니다. 이제 등록ID를 받으면 준비가 된겁니다. 그리고 이제 메시지를 쓰셔서 보내기를 

클릭하시면sender(C2dm_BroadcastReceiver.registration_id,getAuthToken(),msg_text.getText().toString());이 메소드를 

통해 인증을 하고 등록값과 메시지를 상대방에게 보내지게 됩니다. 

그러면 메시지를 수신하게 되면 또 BroadcastReceiver를 사용하게 됩니다. 아까 메니페스트에서 등록한 

리시브가 그역할을 하게 됩니다. 

이번엔 else if (intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
이부분이 받게 되겠죠? 여기서 메시지를 이제 받아야겠죠? 아까 위에서 센드해서 보낼때

postDataBuilder.append("&data.msg="+URLEncoder.encode(msg, "UTF-8")); 이부분을 볼수 있습니다. 

메시지 말고 다른 변수도 태워 보내실거면 저밑에 data.xxx로 추가하셔서 보내시면 됩니다. 

postDataBuilder.append("&data.phone="+URLEncoder.encode(phone, "UTF-8")); 이렇게 보내시면 됩니다.

그렇게 보낸걸 받을때는 c2dm_msg = intent.getExtras().getString("msg");이렇게만 받으시면 됩니다. 

data.xxx 에서 xxx만 꺼내시면 됩니다. 이렇게 하시면 푸쉬를 받게 되실 겁니다. 

그리고 아직 c2dm이 정식으로 나온게 아니라 그런지 푸쉬가 잘안올때가 있습니다.

안오게 된다고 걱정마시고 계속 하시다 보면 언젠가 옵니다 ㅋㅋ

저부분에서 응용하시면 될듯하네요 노티를 사용하시거나 진동및 사운드 등등은

여러분의 몫!



휴 쓰다보니 정신없이 쓰게 됐네요 -_-;; 제대로 썻는지도 모르겠습니다..


무튼 저처럼 고생하시는 분없기를 기대하면서.. 저는 이만 












추천 버튼을 클릭하면 추천한 자와 추천받은 자 모두에게 포인트가 지급됩니다.

thirdrater 2012-06-08 (금) 16:10
잘 되네요.. 다 이해하고 응용하려면 공부 많이 해야할듯ㅎㅎ
댓글주소
Galuxy2X 2012-06-18 (월) 18:18
앱이 튕겨요 ㅠㅠ
댓글주소
강성민 2013-10-02 (수) 01:34
감사합니다-
댓글주소
코코스 2014-07-10 (목) 00:25
감사합니다.~
댓글주소
미차르 2014-11-13 (목) 15:36
감사합니다~! 잘쓸께요
댓글주소
사랑튀 2015-03-03 (화) 01:21

감사합니다

댓글주소
그아이 2015-03-03 (화) 08:52
재밌네요.
댓글주소
루나군 2015-03-28 (토) 22:34
http://dufguf.iptime.org/push/test.html
이곳에서 만드신 Push를 테스트 해보실 수 있습니다.
댓글주소
이카루스031 2015-06-01 (월) 01:16
잘 보고 갑니다~
댓글주소
처음  1  2  3  4  5  6  7  8  9  10
이전글  다음글  목록 글쓰기

총 게시물 1,102건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1102 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 4 에찌 05-08 0 983
1101 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 747
1100 TIP&TECH  TabLayout ClickEvent 에찌 04-21 0 723
1099 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 1 1220
1098 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 0 842
1097 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 657
1096 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 865
1095 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 2 980
1094 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 1 1744
1093 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 1378
1092 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 1376
1091 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 1531
1090 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 김병희라고요 11-23 0 1654
1089 자료  박근혜를 탄핵할 수 있는 어플을 만들었어요. 3 씨드래곤아트 11-23 0 1971
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 1476
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 1852
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 김병희라고요 11-01 0 1456
1085 강좌  왕앱따 100. 안드로이드 왕초보의 앱개발 따라… 김병희라고요 10-29 0 1789
1084 강좌  DoubleDrawer(5) - 좌우 모두 NavigationView 사용/[Andro… 김병희라고요 10-27 0 1324
1083 강좌  DoubleDrawer(4) - 소스 오류(아이콘 토글 문제) 수… 김병희라고요 10-27 0 1169
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  다음  맨끝
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기