web-dev-qa-db-fra.com

Exception lors de l'ouverture de la notification Parse Push

J'ai configuré Parse Push Android SDK 1.7. et je peux recevoir des push sans aucun problème. Cependant, lors de l'ouverture de la notification Push, mon application se bloque à l'exception suivante:

Android.content.ActivityNotFoundException: aucune activité trouvée pour gérer l'intention {act = Android.intent.action.VIEW dat = flg = 0x1000c000 (avec des extras)}

J'ai également essayé de sous-classer ParsePushBroadcastReceiver avec getActivity() renvoyant toujours la classe d'activité principale, même résultat. Ci-dessous la trace complète de la pile:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.ers.test, PID: 13513
Java.lang.RuntimeException: Unable to start receiver com.ers.test.MyPushBroadcastReceiver: Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Android.intent.action.VIEW dat= flg=0x1000c000 (has extras) }
        at Android.app.ActivityThread.handleReceiver(ActivityThread.Java:2452)
        at Android.app.ActivityThread.access$1700(ActivityThread.Java:144)
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1281)
        at Android.os.Handler.dispatchMessage(Handler.Java:102)
        at Android.os.Looper.loop(Looper.Java:136)
        at Android.app.ActivityThread.main(ActivityThread.Java:5146)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:515)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:796)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:612)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: Android.content.ActivityNotFoundException: No Activity found to handle Intent { act=Android.intent.action.VIEW dat= flg=0x1000c000 (has extras) }
        at Android.app.Instrumentation.checkStartActivityResult(Instrumentation.Java:1632)
        at Android.app.Instrumentation.execStartActivitiesAsUser(Instrumentation.Java:1481)
        at Android.app.ContextImpl.startActivitiesAsUser(ContextImpl.Java:1136)
        at Android.content.ContextWrapper.startActivitiesAsUser(ContextWrapper.Java:344)
        at Android.content.ContextWrapper.startActivitiesAsUser(ContextWrapper.Java:344)
        at Android.app.TaskStackBuilder.startActivities(TaskStackBuilder.Java:221)
        at Android.app.TaskStackBuilder.startActivities(TaskStackBuilder.Java:232)
        at Android.app.TaskStackBuilder.startActivities(TaskStackBuilder.Java:208)
        at com.parse.TaskStackBuilderHelper.startActivities(TaskStackBuilderHelper.Java:19)
        at com.parse.ParsePushBroadcastReceiver.onPushOpen(ParsePushBroadcastReceiver.Java:202)
        at com.parse.ParsePushBroadcastReceiver.onReceive(ParsePushBroadcastReceiver.Java:108)
        at Android.app.ActivityThread.handleReceiver(ActivityThread.Java:2445)
        at Android.app.ActivityThread.access$1700(ActivityThread.Java:144)
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1281)
        at Android.os.Handler.dispatchMessage(Handler.Java:102)
        at Android.os.Looper.loop(Looper.Java:136)
        at Android.app.ActivityThread.main(ActivityThread.Java:5146)
        at Java.lang.reflect.Method.invokeNative(Native Method)
        at Java.lang.reflect.Method.invoke(Method.Java:515)
        at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:796)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:612)
        at dalvik.system.NativeStart.main(Native Method)
38
Song Qian

Après avoir passé quelques heures. Trouvé une solution: implémentez votre récepteur et étend la classe ParsePushBroadcastReceiver.

Receiver.Java

public class Receiver extends ParsePushBroadcastReceiver {

    @Override
    public void onPushOpen(Context context, Intent intent) {
        Log.e("Push", "Clicked");
        Intent i = new Intent(context, HomeActivity.class);
        i.putExtras(intent.getExtras());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

Utilisez-le dans le manifeste (au lieu d'utiliser ParsePushBroadcastReceiver)

Code pour le manifeste du projet:

<receiver
            Android:name="your.package.name.Receiver"
            Android:exported="false" >
            <intent-filter>
                <action Android:name="com.parse.Push.intent.RECEIVE" />
                <action Android:name="com.parse.Push.intent.DELETE" />
                <action Android:name="com.parse.Push.intent.OPEN" />
            </intent-filter>
        </receiver>

Codage heureux !!

102
Ahmad Raza

La cause de cette exception est lorsque ParsePushBroadcastReceiver veut ouvrir l'URI vide dans votre message Push dans ce code:

String uriString = null;
    try
    {
      JSONObject pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));
      uriString = pushData.optString("uri");
    }
    catch (JSONException e)
    {
      Parse.logE("com.parse.ParsePushReceiver", "Unexpected JSONException when receiving Push data: ", e);
    }
    if (uriString != null) {
          activityIntent = new Intent("Android.intent.action.VIEW", Uri.parse(uriString));
        } else {
          activityIntent = new Intent(context, cls);
        }

Si vous poussez simplement un message, le uriString sera vide et non nul, donc context.startActivity(activityIntent); ouvrira un uri vide et une exception se produira.

Pour résoudre ce problème, vous pouvez sous-classer ParsePushBroadcastReceiver (grâce à @Ahmad Raza) et remplacer onPushopen comme ceci:

public class Receiver extends ParsePushBroadcastReceiver {

    @Override
    protected void onPushOpen(Context context, Intent intent) {

        ParseAnalytics.trackAppOpenedInBackground(intent);

        String uriString = null;
        try {
            JSONObject pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));
            uriString = pushData.optString("uri");
        } catch (JSONException e) {
            Log.v("com.parse.ParsePushReceiver", "Unexpected JSONException when receiving Push data: ", e);
        }
        Class<? extends Activity> cls = getActivity(context, intent);
        Intent activityIntent;
        if (uriString != null && !uriString.isEmpty()) {
            activityIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(uriString));
        } else {
            activityIntent = new Intent(context, MainActivity.class);
        }
        activityIntent.putExtras(intent.getExtras());
        if (Build.VERSION.SDK_INT >= 16) {
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
            stackBuilder.addParentStack(cls);
            stackBuilder.addNextIntent(activityIntent);
            stackBuilder.startActivities();
        } else {
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            activityIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            context.startActivity(activityIntent);
        }
    }
} 

et mettez à jour le manifeste comme ceci:

<receiver
            Android:name="your.package.name.Receiver"
            Android:exported="false" >
            <intent-filter>
                <action Android:name="com.parse.Push.intent.RECEIVE" />
                <action Android:name="com.parse.Push.intent.DELETE" />
                <action Android:name="com.parse.Push.intent.OPEN" />
            </intent-filter>
        </receiver>

J'espère qu'ils résoudront le problème dans leur prochaine mise à jour.

32
Saeed.re