c2dm사용시 registration_id 값을 못받아 옵니다... 왜 그럴까요???
앱 처음에 시작되는 액티비티에 아래처럼 설정했습니다.
//c2dm 서비스를 위해 개별기기의 registration ID를 저장
SharedPreferences shared_pref = PreferenceManager.getDefaultSharedPreferences(act);
String regID = shared_pref.getString("regID", null);
Log.i("ttt", "appSite regID : " + regID);
if("".equals(regID)) {
Intent intent = new Intent("com.google.android.c2dm.intent.REGISTER");
intent.putExtra("app", PendingIntent.getBroadcast(act, 0, new Intent(), 0));
intent.putExtra("sender", "xxx@gmail.com");
startService(intent);
}
메니페스트의 리시버 파일 설정은 아래처럼...
<!-- c2dm으로 부터 고유 ID를 수신할 리시버 클래스 -->
<receiver android:name="c2dmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
<!-- Receive the actual message -->
<intent-filter >
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="com.myapp.mymsg"/>
</intent-filter>
<!-- Receive the registration id -->
<intent-filter >
<action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
<category android:name="com.myapp.mymsg"/>
</intent-filter>
</receiver> 그리고 클래스 파일은,
public class c2dmBroadcastReceiver extends BroadcastReceiver {
static String registration_id = null;
static String c2dm_msg = null;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Log.i("ttt", "start c2dmBroadcastReceiver");
if(intent.getAction().equals("com.google.android.c2dm.inent.REGISTRATION")) {
getRegistrationID(context, intent);
} else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
c2dm_msg = intent.getExtras().getString("subject");
Log.i("ttt", "c2dm receve msg : " + c2dm_msg);
Toast.makeText(context, "메시지가 왔습니다!!!", Toast.LENGTH_SHORT).show();
}
}
private void getRegistrationID(Context context, Intent intent) {
registration_id = intent.getStringExtra("registration_id");
Log.i("ttt", "registration_id : " + registration_id);
if (intent.getStringExtra("error") != null) {
Log.i("ttt", "error : " + intent.getStringExtra("error"));
} else if (registration_id != null) {
SharedPreferences shared_pref = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = shared_pref.edit();
editor.putString("regID", registration_id);
editor.commit();
Log.i("ttt", "recever file regID : " + registration_id);
}
} 메시지를 보내는 곳에서 regID(registration_id값)을 출력해보면 null 이 나옵니다.
아무래도 리시버 동작이안되는것 같은데 왜 그럴까요???
startService(intent) 부분이 뭔가 안되서 그러는것 같아서 if 문을 제거하고도 해봤는데도 값이 안받아 집니다.
이것 때문에 이틀째 진도가 안나가고 있네요... 꼭 좀 도와주세요.
제가 문제를 잘못 이해 한듯하네요
당연히 보내는곳에서는 null이 오는게 맞습니다.
c2dm서버에서 다시 id값을 얻어와 리시버를 통해 폰으로 전달이 돼게 돼있는데요
else if(intent.getAction().equals("com.google.android.c2dm.intent.RECEIVE")) {
이 메소드 안에
registration_id = intent.getStringExtra("registration_id");이 구문을 넣고
로그한번 찍어보세요
<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"/
리시버가 호출이 안된다는거면 매니페스트 문제일 가능성이 많네요;
사소한것부터 ㅎㅎ;
패키지 등록이랑 다 하신거져?;
PendingIntent.getBroadcast(this, 0, new Intent(), 0));
고쳐 나가시는게;ㅋ
저랑 같은 문제로 고생 하시는거 같네요.......
저도 소스에 문제 없는데 null이 넘어 오더군요~
전 몇달 된 어플인데 잘 되다가 갑자기 null 이 들어 오는 오류로 인해 몇일째 해결책을 찾아 봤지만 찾지 못했습니다..
일단 저의 경우 테스트를 해보니
갤럭시S2, 베가 레이서는 id를 잘 받아옵니다
갤럭시 S, 갤럭시 넥서스.............. 원래 둘다 잘 받아 왔었습니다 확인 했었죠..
근데 언제 부터 인가 null 값을 주네요.. 혹시 같은 현상일지 모르니.. 다른 기기 테스트 해보시길 바랍니다.
저랑 같은 문제로 고생하시네요.
아마도 로그에 보시면 permission denial 메시지 있을겁니다. xx.xxx.xxxx.permission.C2D_MESSAGE 퍼미션이 없어서 브로드케스트 인텐트를 받을수 없다라는 형식의 메시지요.
그런데 메니페스트에 분명이 저거 사용하도록 해놨잔아요. 그런데 문제는 어떠한 이유에서인지 저 퍼미션이 삭제되는 상황이 발생합니다.
페키지 매니져에서 checkpermission 함수 써서 확인해보시면 없다고 나올꺼에요.
현재까지 제가 알고있는 해결방법은 공장초기화 또는 페키지명을 바꿔서 재설치 하시면 해결이 됩니다.
패키지를 삭제 후 재설치는 내부에서 언인스톨패키지 정보를 가지고 있어서 그런지 해결이 안되더군요.
혹시 누가 퍼미션이 삭제되는 이유 아시면 알려주세요.




매니페스트 등록하셨나요?