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();
}
所以,我遇到了一个问题,每次我选择一个图像时,应用程序都会强制关闭,当然选择的图像无法发送到另一个 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();
}