捕获图像后在片段之间导航时出现异常 (CameraX)
Getting exception while navigating between fragments after image capture (CameraX)
我正在使用 Camerax 拍摄图像。但我想在相机捕获成功后导航到另一个片段。
我正在使用这个代码。
imageCapture.takePicture(
outputOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = output.savedUri ?: Uri.fromFile(photoFile)
Log.d(TAG, "Photo capture succeeded: $savedUri")
val capturedFileArray = ArrayList<GalleryItems>()
capturedFileArray.add(
GalleryItems("image",photoFile.absolutePath,false)
)
val bundle = Bundle()
bundle.putParcelableArrayList("selected_images", capturedFileArray)
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
)
}
})
图片拍摄保存成功。但在导航部分出现错误
E/AndroidRuntime: FATAL EXCEPTION: pool-2-thread-1
Process: com.example.travelinsta, PID: 27221
android.util.AndroidRuntimeException: Animators may only be run on Looper threads
at android.animation.ValueAnimator.start(ValueAnimator.java:1035)
at android.animation.ValueAnimator.start(ValueAnimator.java:1089)
at android.animation.ObjectAnimator.start(ObjectAnimator.java:852)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.setActionBarUpIndicator(AbstractAppBarOnDestinationChangedListener.java:132)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:110)
at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:504)
at androidx.navigation.NavController.navigate(NavController.java:1142)
at androidx.navigation.NavController.navigate(NavController.java:944)
at androidx.navigation.NavController.navigate(NavController.java:877)
at androidx.navigation.NavController.navigate(NavController.java:863)
at com.example.travelinsta.ui.camera.CameraFragment$updateCameraUi$$special$$inlined$let$lambda.onImageSaved(CameraFragment.kt:230)
at androidx.camera.core.ImageCapture.onImageSaved(ImageCapture.java:843)
at androidx.camera.core.ImageSaver.lambda$postSuccess$ImageSaver(ImageSaver.java:299)
at androidx.camera.core.-$$Lambda$ImageSavervxg6qyjKwPRXgWrIwgYVInWKE.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
请帮忙。提前致谢。
在 UI Thread
中调用 findNavController().navigate
例如使用下面
new Handler(Looper.getMainLooper()).post(new Runnable(){
public void run(){
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
);
}
});
或者如果您在 Activity
中,您可以只使用 runOnUiThread(new Runnable(){...});
编辑:抱歉 Java 代码,我刚刚意识到您使用的是 Kotlin
Handler(Looper.getMainLooper()).post {
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
)
}
我正在使用 Camerax 拍摄图像。但我想在相机捕获成功后导航到另一个片段。
我正在使用这个代码。
imageCapture.takePicture(
outputOptions, cameraExecutor, object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = output.savedUri ?: Uri.fromFile(photoFile)
Log.d(TAG, "Photo capture succeeded: $savedUri")
val capturedFileArray = ArrayList<GalleryItems>()
capturedFileArray.add(
GalleryItems("image",photoFile.absolutePath,false)
)
val bundle = Bundle()
bundle.putParcelableArrayList("selected_images", capturedFileArray)
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
)
}
})
图片拍摄保存成功。但在导航部分出现错误
E/AndroidRuntime: FATAL EXCEPTION: pool-2-thread-1
Process: com.example.travelinsta, PID: 27221
android.util.AndroidRuntimeException: Animators may only be run on Looper threads
at android.animation.ValueAnimator.start(ValueAnimator.java:1035)
at android.animation.ValueAnimator.start(ValueAnimator.java:1089)
at android.animation.ObjectAnimator.start(ObjectAnimator.java:852)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.setActionBarUpIndicator(AbstractAppBarOnDestinationChangedListener.java:132)
at androidx.navigation.ui.AbstractAppBarOnDestinationChangedListener.onDestinationChanged(AbstractAppBarOnDestinationChangedListener.java:110)
at androidx.navigation.NavController.dispatchOnDestinationChanged(NavController.java:504)
at androidx.navigation.NavController.navigate(NavController.java:1142)
at androidx.navigation.NavController.navigate(NavController.java:944)
at androidx.navigation.NavController.navigate(NavController.java:877)
at androidx.navigation.NavController.navigate(NavController.java:863)
at com.example.travelinsta.ui.camera.CameraFragment$updateCameraUi$$special$$inlined$let$lambda.onImageSaved(CameraFragment.kt:230)
at androidx.camera.core.ImageCapture.onImageSaved(ImageCapture.java:843)
at androidx.camera.core.ImageSaver.lambda$postSuccess$ImageSaver(ImageSaver.java:299)
at androidx.camera.core.-$$Lambda$ImageSavervxg6qyjKwPRXgWrIwgYVInWKE.run(Unknown Source:4)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
请帮忙。提前致谢。
在 UI Thread
中调用 findNavController().navigate
例如使用下面
new Handler(Looper.getMainLooper()).post(new Runnable(){
public void run(){
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
);
}
});
或者如果您在 Activity
中,您可以只使用 runOnUiThread(new Runnable(){...});
编辑:抱歉 Java 代码,我刚刚意识到您使用的是 Kotlin
Handler(Looper.getMainLooper()).post {
findNavController().navigate(
R.id.action_cameraFragment_to_submitPostFragment,
bundle
)
}