안드로이드 개발 질문/답변
(글 수 45,052)
C2DM을 사용하여 개발 중입니다.
예제 소스가 있어서 지금 한번 돌려보고 있는데요...ㅠㅠ
androidManifest.xml 파일
<receiver android:name=".C2dm_BroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="test.android.test"/>
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="test.android.test"/>
</intent-filter>
</receiver>
</application>
<permission android:name="test.android.test.permission.C2D_MESSAGE"
android:protectionLevel="signature"/>
<uses-permission android:name="test.android.test.permission.C2D_MESSAGE"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<uses-permission android:name="android.permission.INTERNET"/>
정의 했구요.
public class C2dm_BroadcastReceiver extends BroadcastReceiver{
/** Called when the activity is first created. */
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!!");
}
브로드캐스트 리시버도 위와 같이 했구요..
물론 소스에서
Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // 어플리케이션ID
registrationIntent.putExtra("sender", "xxxxxxxx@gmail.com"); //개발자ID
startService(registrationIntent); //서비스 시작(등록ID발급받기
이렇게 까지 했습니다..
그런데..왜 !!!!!!!
intent.getAction().equals("com.google.android.c2dm.intent.REGISTRATION")
요기에서 받아야하는
registration_id 값이 안 넘어 올까요....정말 미칠지경입니다..ㅠㅠㅠ
현재 com.google.android.c2dm.intent.REGISTRATION 이 action도 안넘어 오는 상황입니다.ㅠㅠ
manifest 파일에 receiver 등록 하고 소스에서 등록 ID 요청도 했는데 말이죠
왜 Action이 안 넘어 올까요???
registrationIntent.putExtra("sender", "xxxxxxxx@gmail.com"); //개발자ID
여기에 사용한 ID는 구글 계정 ID 입니다.
고수님들의 의견 정말정말 기다리겠습니다..ㅠㅠㅠㅠ
그럼, 오늘도 즐거운 하루 좋은 하루 되세요...




저도 같은 문제로 이것저것 하면서 로그를 계속 확인해본결과
조건문에서 해당되는 퍼미션을 찾지 못하기 때문에 handleRegistration(context, intent) 를 실행시키지 않았다고 생각되었습니다.
AndroidManifest.xml에 <uses-permission android:name="com.google.android.c2dm.permission.REGISTRATION"/> 을 추가하니깐 registration_id 값을 넘겨받는것을 확인하였습니다. 한번 해보세요. 저도 짧은 지식으로 얘기드리는거라..