Выберите изображение и отправьте результат другому действию в студии android, продолжайте принудительно закрывать - PullRequest
0 голосов
/ 05 августа 2020

Итак, у меня проблема, когда каждый раз, когда я выбираю изображение, приложение принудительно закрывается, и, конечно, выбранное изображение не может быть отправлено в другое действие, но для активности камеры все работает нормально. Это мой код

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, кроме переменной, но он не работает , поэтому я решил поискать какое-либо исправление, и все равно не повезло

, и я использую этот код для получения результата в другом действии

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

любое возможное решение этой проблемы? Я хотел, чтобы выбранное изображение из галереи было получено с помощью этой функции, поэтому оно будет немедленно классифицировано, как и активность камеры, или, если есть какое-либо лучшее решение, это очень поможет.

Это ошибка 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

1 Ответ

0 голосов
/ 05 августа 2020

Вы получаете сообщение об ошибке: android.os.TransactionTooLargeException

Это может произойти, если вы передаете слишком много данных.

Вы можете использовать поля stati c или отдельные поля для обмена данными между действиями , см.: http://developer.android.com/guide/faq/framework.html#3 - Другой способ, который выходит за рамки этого вопроса, но который легко найти, выполнив поиск здесь, в SO, - это передача данных с использованием SharedPreferences, например: отправка данные от активности к фрагменту

Существует инструмент, который вы можете использовать, чтобы узнать, где это происходит, называется: https://github.com/guardian/toolargetool

В действии, где это происходит ошибка, вы должны добавить outState.clear();

например,

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //Clear the Activity's bundle
    outState.clear();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...