Select 图片并将结果发送到 android 工作室中的另一个 activity 保持强制关闭

Select image and sent the result to another activity in android studio keep force closing

所以,我遇到了一个问题,每次我选择一个图像时,应用程序都会强制关闭,当然选择的图像无法发送到另一个 activity,但是对于相机 activity 它正在做美好的。 这是我的代码

ChooseActivity.kt

 private fun takePhoto() {
    val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    startActivityForResult(cameraIntent, CAMERA_REQUEST)
  }

  private fun chooseLibrary() {
    val libraryIntent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    startActivityForResult(libraryIntent, LIBRARY_REQUEST)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (resultCode != Activity.RESULT_OK) return

    when (requestCode) {
      CAMERA_REQUEST -> {
        val thumbnail: Bitmap = data!!.getParcelableExtra("data")
        val intent = Intent(this@ChooseActivity, StillImageActivity::class.java)
        intent.putExtra("bitmap", thumbnail)
        startActivity(intent)
        finish()
      }
      LIBRARY_REQUEST -> {
        val uri: Uri = data!!.getData()!!
        val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
        val intent = Intent(this@ChooseActivity, StillImageActivity::class.java)
        intent.putExtra("bitmap", bitmap)
        startActivity(intent)
        finish()
      }
    }
  }

  companion object {
    private const val CAMERA_REQUEST = 10
    private const val LIBRARY_REQUEST = 20
  }
}

最初,我将 CAMERA_REQUEST 中的代码用于 LIBRARY_REQUEST 除了变量,但它不起作用,所以我决定寻找任何修复,但仍然没有运气

我使用此代码在另一个 activity

中接收结果

StillImageActivity.kt

fun getImage() {
    val extras = intent.extras
    if (extras != null) {
      val bitmap = extras["bitmap"] as Bitmap
      if (bitmap != null) {
        imagePreview?.setImageBitmap(bitmap)

        classifyImage(bitmap)
      }
    }
  }

我把它作为一个函数,因为我想在这里调用它以便对图像进行分类。这是一个图像分类应用程序

// Setup image classifier.
    try {
      classifier = ImageClassifier(this)
    } catch (e: FirebaseMLException) {
      textView?.text = getString(R.string.fail_to_initialize_img_classifier)
    }

    // Classify the sent image
    getImage()
  }

这个问题有什么可能的解决办法吗?我希望从图库中选择的图像是使用此功能接收的,因此它会像相机一样立即分类activity,或者如果有更好的解决方案,它将有很大帮助。

这是 logcat 错误

2020-08-05 17:24:42.425 27490-27490/com.google.firebase.codelab.mlkit.automl E/JavaBinder: !!! FAILED BINDER TRANSACTION !!!  (parcel size = 1639092)
2020-08-05 17:24:42.429 27490-27490/com.google.firebase.codelab.mlkit.automl D/AndroidRuntime: Shutting down VM
2020-08-05 17:24:42.435 27490-27490/com.google.firebase.codelab.mlkit.automl E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.google.firebase.codelab.mlkit.automl, PID: 27490
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=20, result=-1, data=Intent { dat=content://com.google.android.apps.photos.contentprovider/-1/1/content://media/external/images/media/3724/ORIGINAL/NONE/image/jpeg/1941833173 flg=0x1 clip={text/uri-list U:content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F3724/ORIGINAL/NONE/image%2Fjpeg/1941833173} }} to activity {com.google.firebase.codelab.mlkit.automl/com.google.firebase.codelab.mlkit.automl.ChooseActivity}: java.lang.RuntimeException: Failure from system
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4845)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.RuntimeException: Failure from system
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1718)
        at android.app.Activity.startActivityForResult(Activity.java:5210)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
        at android.app.Activity.startActivityForResult(Activity.java:5168)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
        at android.app.Activity.startActivity(Activity.java:5539)
        at android.app.Activity.startActivity(Activity.java:5507)
        at com.google.firebase.codelab.mlkit.automl.ChooseActivity.onActivityResult(ChooseActivity.kt:60)
        at android.app.Activity.dispatchActivityResult(Activity.java:8131)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4838)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886) 
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: android.os.TransactionTooLargeException: data parcel size 1639092 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(BinderProxy.java:511)
        at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:3847)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1712)
        at android.app.Activity.startActivityForResult(Activity.java:5210) 
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767) 
        at android.app.Activity.startActivityForResult(Activity.java:5168) 
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754) 
        at android.app.Activity.startActivity(Activity.java:5539) 
        at android.app.Activity.startActivity(Activity.java:5507) 
        at com.google.firebase.codelab.mlkit.automl.ChooseActivity.onActivityResult(ChooseActivity.kt:60) 
        at android.app.Activity.dispatchActivityResult(Activity.java:8131) 
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4838) 
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4886) 
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
2020-08-05 17:24:42.460 27490-27490/com.google.firebase.codelab.mlkit.automl I/Process: Sending signal. PID: 27490 SIG: 9

您收到的错误是 android.os.TransactionTooLargeException

当您传递过多数据时,可能会发生这种情况。

您可以使用静态字段或单例在活动之间共享数据,请参阅:http://developer.android.com/guide/faq/framework.html#3 - Another way, which goes out of the scope of this question but can easily be found by searching here on SO is by passing the data using SharedPreferences, e.g.:

有一个工具可以用来找出发生这种情况的地方,它叫做: https://github.com/guardian/toolargetool

在出现这个错误的activity处,你应该添加outState.clear();

例如

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //Clear the Activity's bundle
    outState.clear();
}