ขัดข้องหลังจาก startActivityForResult ใน API 27

หลังจากอัปเดตเป็น API 27 และ Support Library 27.0.2 จู่ๆ ฉันก็ได้รับ Stack Tracs เหล่านี้จำนวนมากใน Crashlytics:

Fatal Exception: java.lang.IllegalArgumentException
    at android.os.Parcel.readException(Parcel.java:1544)
    at android.os.Parcel.readException(Parcel.java:1493)
    at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:5108)
    at android.app.Activity.isTopOfTask(Activity.java:5688)
    at android.app.Activity.startActivityForResult(Activity.java:3973)
    at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(Source:54)
    at android.support.v4.app.FragmentActivity.startActivityForResult(Source:67)

ฉันเรียกสิ่งนี้ว่า:

ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
startActivityForResult( intent, REQ_ACTION, options.toBundle());

ฉันไม่สามารถอ่านซอร์สโค้ดได้เนื่องจากยังไม่ได้เผยแพร่ ฉันพยายามแทนที่และใช้โค้ด android-26 ด้วยซ้ำ แต่มันก็แตกต่างออกไป

มีคำเตือนสำหรับการเรียกข้างต้นโดยบอกว่า BaseFragmentActivityApi16.startActivityForResult สามารถโทรจากกลุ่มไลบรารีเดียวกันเท่านั้น ดังนั้นฉันจึงแก้ไขโดยใช้ ActivityCompat แต่ฉันไม่คิดว่ามันจะช่วยแก้ปัญหาข้อขัดข้องได้

นี่เป็นปัญหาของแพลตฟอร์มหรือฉันสามารถแก้ไขปัญหานี้ได้หรือไม่

แก้ไข

if (Build.VERSION.SDK_INT >= 21) {
    ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
    startActivityForResult(intent, REQ_ACTION, options.toBundle());
} else {
    ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, R.anim.slide_in_from_right, R.anim.fade_out);
    ActivityCompat.startActivityForResult(this, intent, REQ_ACTION, options.toBundle());
}

ถ้าฉันเปลี่ยนเป็นด้านบนตามลิงก์ในความคิดเห็นของฉัน Android Studio จะบ่นเหมือนด้านบน นี่อาจเกี่ยวข้องกับปัญหา


person Herrbert74    schedule 04.12.2017    source แหล่งที่มา
comment
คุณอาจพบstackoverflow.com/q/47257407/8298909 (ปิดเนื่องจากโดยพื้นฐานแล้วเป็นคำถามสนับสนุนด้านเทคนิค)   -  person Ben P.    schedule 04.12.2017
comment
@เบ็นพี. นั่นดูเป็นปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิง โดยบังเอิญเกี่ยวข้องกับ Parcelables เช่นกัน   -  person Herrbert74    schedule 07.12.2017
comment
ดูเหมือนปัญหาเกี่ยวกับแอนิเมชั่นและไลบรารีการสนับสนุนสำหรับฉันมากกว่า ตามโพสต์นี้ คุณไม่ควรใช้ ActivityOptionsCompat เหนือ API 21: stackoverflow.com/a/42455484/1067763 ฉันไม่ ไม่ได้ใช้ แต่ฉันยังมีข้อขัดข้องนี้อยู่ ฉันคิดว่ามันยังคงใช้เวอร์ชันที่ผิดอยู่ ฉันอัปเดตคำถามด้วยตัวเลือกภาพเคลื่อนไหว   -  person Herrbert74    schedule 07.12.2017
comment
startActivity(เจตนา, options.toBundle()); นี่คือสิ่งที่ฉันใช้ในแอปพลิเคชันของฉัน   -  person Muhammad Saad    schedule 07.12.2017
comment
@MuhammadSaad นี่อาจช่วยแก้ปัญหาได้ แต่ฉันไม่อยากโยนลูกออกไปพร้อมกับน้ำอาบ ฉันต้องการผลลัพธ์ คุณก็รู้   -  person Herrbert74    schedule 07.12.2017


คำตอบ (3)


คุณสามารถลองใช้รหัสนี้

startActivityForResult( intent, REQ_ACTION)
overridePendingTransition(R.anim.slide_in_from_right,  R.anim.fade_out);
person Muhammad Saad    schedule 07.12.2017
comment
นั่นก็น่าจะแก้ปัญหาได้ ฉันต้องรอสองสามวันหรือสัปดาห์จนกว่าจะมีการส่งแอปเวอร์ชันถัดไปของเรา และฉันจะยอมรับคำตอบ - person Herrbert74; 07.12.2017
comment
แน่นอน. ฉันจะรอ :) - person Muhammad Saad; 07.12.2017
comment
วิธีการนี้ช่วยแก้ไขปัญหา @ Herrbert74 หรือไม่ - person lini sax; 09.04.2019

โพสต์เก่าแต่ยังไม่ได้ตอบ ดังนั้นนี่คือสิ่งที่ฉันพบใน 21+

ตรวจสอบให้แน่ใจว่าคุณกำลังมองหา startActivityForResult ใต้วัตถุกิจกรรม ภายใต้ Context object คุณสามารถค้นหา startActvity ได้ แต่คุณจะไม่เห็นเมธอด startActivityForResult

หากบริบทของคุณเป็นคลาสบริบท แต่เป็นกิจกรรม ตรวจสอบให้แน่ใจว่าคุณได้ส่งไปที่กิจกรรมแล้ว

Context context = ...;
context.startActivityForResult(...); // this method will not exist
((Activity)context).startActivityForResult(...); // this method should be ok
person Zunair    schedule 19.08.2018
comment
สิ่งนี้จะลบคำเตือนออกจาก IDE แต่ไม่แน่ใจว่าจะช่วยแก้ปัญหาได้หรือไม่ ฉันจะรอสักวัน ขอบคุณ. ฉันใช้ 27.1.0 และข้อขัดข้องมาจาก 6.0.1 - person Aram; 12.12.2018

ใช้ ActivityOptionsCompat แทน ActivityOptions สำหรับด้านล่าง api 21

ActivityOptionsCompat เป็นคลาสตัวช่วยสำหรับการเข้าถึงฟีเจอร์ใน ActivityOptions ในรูปแบบที่เข้ากันได้แบบย้อนหลัง

if (Build.VERSION.SDK_INT >= 21) {
  ActivityOptions options = ActivityOptions.makeCustomAnimation(activity, 
  R.anim.slide_in_from_right, R.anim.fade_out);
  startActivityForResult(intent, REQ_ACTION, options.toBundle()); 
  } else {
   ActivityOptionsCompat options = ActivityOptionsCompat
  .makeCustomAnimation(activity,R.anim.slide_in_from_right,R.anim.fade_out);
   ActivityCompat.startActivity(this, intent, options.toBundle());
}

หวังว่านี่จะช่วยคุณได้

person Vishal Chauhan    schedule 07.12.2017