2014-10-02 17 views
38

Tôi thiết lập Parse push Android SDK 1.7.0 và có thể nhận các lần đẩy mà không gặp bất kỳ sự cố nào. Tuy nhiên, khi mở thông báo push treo ứng dụng của tôi với ngoại lệ sau:Ngoại lệ khi mở thông báo đẩy Parse

android.content.ActivityNotFoundException: Không Hoạt động phát hiện để xử lý Ý định {hành động = android.intent.action.VIEW dat = FLG = 0x1000c000 (có extras)}

tôi cũng đã cố gắng subclassing ParsePushBroadcastReceiver với getActivity() luôn trở về lớp hoạt động chính, cùng một kết quả. Dưới đây là toàn bộ stacktrace:

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) 
+0

Thêm '' vào hoạt động mong muốn không hữu ích. –

+0

bất kỳ giải pháp nào khác? –

Trả lời

101

Sau khi chi tiêu vài giờ. Tìm thấy giải pháp: Triển khai bộ thu của bạn và mở rộng lớp 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); 
    } 
} 

Sử dụng nó trong manifest, (Thay vì sử dụng ParsePushBroadcastReceiver)

Mã cho manifest của dự án:

<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> 

Chúc mừng Mã hóa !!

+0

Công trình này! Tuy nhiên, việc tạo ra ý định bản thân có nghĩa là tôi đang mất tất cả dữ liệu trong phần bổ sung (com.parse.Data và com.parse.Channel), sẽ phải sao chép các dữ liệu đó. Chờ đợi để xem nếu điều này được cải thiện trong phiên bản sdk tiếp theo. –

+1

Đã sử dụng 1,5 trước đó và mọi thứ hoạt động tốt. Cập nhật lên 1.7 và vấn đề dường như xảy ra – Zen

+1

Thnx mate! Hướng dẫn đẩy Parse mới cho hầu như không có gợi ý cách liên kết một Activity với trình xử lý. – nahwarang

31

Nguyên nhân của ngoại lệ này là khi ParsePushBroadcastReceiver muốn mở uri trống trong thông điệp đẩy bạn trong mã này:

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); 
     } 

Nếu bạn chỉ cần bấm tin nhắn, uriString sẽ trống không null, Vì vậy context.startActivity(activityIntent); sẽ mở một uri rỗng và ngoại lệ xảy ra.

Để giải quyết vấn đề này, bạn có thể phân lớp ParsePushBroadcastReceiver (nhờ @Ahmad Raza) và ghi đè onPushopen như thế này:

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); 
     } 
    } 
} 

và cập nhật Manifest như thế này:

<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> 

Tôi hy vọng họ giải quyết vấn vấn đề trong bản cập nhật tiếp theo của họ.

+0

Tôi có thể nói rằng tôi đã cố gắng làm cho Parse Push này hoạt động được hơn hai tuần. Cố gắng tất cả mọi thứ và gần như mất trí nhớ của tôi !!! Bạn thưa bạn @Virusman là một huyền thoại hoàn chỉnh! Tôi không hiểu tại sao nó lại hiệu quả với tôi nhưng nó đã làm được! Cảm ơn bạn!! – SmiffyKmc

Các vấn đề liên quan