android GCM Error…

안드로이드 개발시 이런 애러가 나올 경우가 있다.

원인을 찾지 못해서  gcm.jar이 deprecated가 되었다고 해서 모두 google cloud messaging  라이브러리를 사용했는데 해당 에러가 동일하게 발생했다.

06-12 14:44:43.553: E/BroadcastReceiver(27011): java.lang.RuntimeException: BroadcastReceiver trying to return result during a non-ordered broadcast
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.content.BroadcastReceiver.checkSynchronousHint(BroadcastReceiver.java:783)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.content.BroadcastReceiver.setResultCode(BroadcastReceiver.java:549)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at com.kamsung.anvang.gcm.GcmBroadcastReceiver.onReceive(GcmBroadcastReceiver.java:30)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.app.ActivityThread.handleReceiver(ActivityThread.java:2535)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.app.ActivityThread.access$1600(ActivityThread.java:165)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1402)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.os.Handler.dispatchMessage(Handler.java:99)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.os.Looper.loop(Looper.java:176)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at android.app.ActivityThread.main(ActivityThread.java:5455)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at java.lang.reflect.Method.invokeNative(Native Method)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at java.lang.reflect.Method.invoke(Method.java:525)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025)
06-12 14:44:43.553: E/BroadcastReceiver(27011): 	at dalvik.system.NativeStart.main(Native Method)

원인은 삼성 런처를 위한 코드를 넣었을  때 발생했다.

아래와 같은 코드를 사용했을 경우.

Intent badgeIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
badgeIntent.putExtra("badge_count", notiCnt);
badgeIntent.putExtra("badge_count_package_name", context.getPackageName());
badgeIntent.putExtra("badge_count_class_name", getLauncherClassName(context));
context.sendBroadcast(badgeIntent);

위의 코드로 뱃지를 업데이트 했을 경우 broadcast 한 인텐트를 지금 개발하는 앱에서 받아서 문제가 생긴다.

 

이럴때는 해당 인텐트를 예외처리 해서 처리할 수 있다.

아래 코드는 필자가 사용한 코드다.

참고 해서 인텐트를 확인해보자.

인텐트의 key 와 value 는 다를 수 있으니 한번 찍어서 확인해보자

내가 원하는 인텐트가 아닐 경우를 찾아내서 예외처리를 해준다면 에러가 나지 않을 것이다.

@Override
public void onReceive(Context context, Intent intent) {
    Bundle bundle = intent.getExtras();
    // registration_id가 있는 경우만 receive 한다.
    boolean foundexceptionKey = false;
    for (String key : bundle.keySet()) {
	Object value = bundle.get(key);
	if (key.equals("CMD") && value.toString().equals("RST_FULL")) foundexceptionKey = true;
    }
    if (foundexceptionKey) return; 
    // Explicitly specify that GcmIntentService will handle the intent.
    ComponentName comp = new ComponentName(context.getPackageName(),
    GcmIntentService.class.getName());
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, intent.setComponent(comp));
    setResultCode(Activity.RESULT_OK);
}