我正在使用jetpack compose。我有两个屏幕,我想将位图从第一个屏幕发送到第二个屏幕。因此,我将位图转换为字符串并将其作为参数传递:
composable(
route = "${NavGraph.FilterScreen.route}/{screenShot}",
arguments = listOf(navArgument("screenShot") {
this.type = NavType.StringType
})
) {
FilterScreen(
innerPadding = padding,
navController = navController,
screenShot = it.arguments?.getString("screenShot")
)
}
Run Code Online (Sandbox Code Playgroud)
我从第一个屏幕导航到第二个屏幕,如下所示:
navController.navigate(NavGraph.FilterScreen.route + "/${bitmapToString(it)}")
Run Code Online (Sandbox Code Playgroud)
问题是:
看来是因为 Bitmap 的字符串版本太长,导航无法处理它并给出以下错误:
cannot be found in the navigation graph NavGraph(0x0) startDestination={Destination(0x78d845ec) route=home}
Run Code Online (Sandbox Code Playgroud)
我这么说是因为当我用包含位图值的字符串替换一个小的随机字符串时,一切都有效。
我也尝试过使用parcellable。但我收到错误,parcellable 不能有默认值,所以我们必须作为字符串传递。我该如何解决这个问题?
尝试显示 URI 时出现以下异常。我认为它发生在我的活动停止并且我再次尝试访问可行的 URI 之后。还有其他问题可以解决这个问题,但我很困惑如何将任何解决方案应用于我的代码,因为我的 takePhotoIntent 允许拍摄或从图库中选择图片(见下文)。
Unable to open content: content://com.android.providers.media.documents/document/image%3A49688
java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri
content://com.android.providers.media.documents/document/image%3A49688 from pid=821, uid=10238 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()
Run Code Online (Sandbox Code Playgroud)
我的 createImageFile 和我的 takePhotoIntent:
private File createImageFile() throws IOException {
// Create an image file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp;
File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
File image = File.createTempFile(
imageFileName, /* prefix */
".jpg", /* suffix */
storageDir /* directory */
);
// Save a file: path …Run Code Online (Sandbox Code Playgroud)