android 无法使用Coil从内容URI加载图像

n3schb8v  于 2023-06-27  发布在  Android
关注(0)|答案(1)|浏览(326)

我试图加载一个图像谁(mimeType是视频/mp4)使用**线圈 * 在我的Android应用程序从内容URI.
下面是我使用的代码片段:

  1. val mediaPath = "content://media/external/file/252819" // its mimeType is video/mp4
  2. AsyncImage(
  3. model = mediaPath,
  4. contentDescription = stringResource(id = R.string.thumbnail),
  5. placeholder = painterResource(id = R.drawable.ic_default_thumbnail),
  6. error = painterResource(id = R.drawable.ic_default_thumbnail),
  7. modifier = Modifier
  8. .fillMaxWidth()
  9. .aspectRatio(1f),
  10. contentScale = ContentScale.Crop
  11. )

甚至我也尝试使用rememberAsyncImagePainter加载:

  1. val imagePainter =
  2. rememberAsyncImagePainter(
  3. ImageRequest.Builder(LocalContext.current).data(data = media.mediaPath).apply(block = fun ImageRequest.Builder.() {
  4. placeholder(R.drawable.ic_default_thumbnail)
  5. error(R.drawable.ic_default_thumbnail)
  6. }).build()
  7. )
  8. Image(
  9. painter = imagePainter,
  10. contentDescription = stringResource(id = R.string.thumbnail),
  11. modifier = Modifier
  12. .fillMaxWidth()
  13. .aspectRatio(1f),
  14. contentScale = ContentScale.Crop
  15. )

尽管使用了正确的内容URI并提供了必要的占位符和错误资源,但我还是无法成功加载缩略图。我已经验证了内容URI是有效的,并且引用了现有的视频文件。

**注意:**我有访问内容URI所需的权限,并已确保内容URI正确。

z4iuyo4d

z4iuyo4d1#

使用此LoadThumbnail方法,通过coil加载图像/视频缩略图:

  1. @Composable
  2. fun LoadThumbnail(
  3. mediaPath: String,
  4. isVideo: Boolean,
  5. modifier: Modifier = Modifier
  6. ) {
  7. val context = LocalContext.current
  8. if (isVideo) {
  9. val imageLoader = remember {
  10. ImageLoader.Builder(context)
  11. .memoryCachePolicy(CachePolicy.ENABLED)
  12. .diskCachePolicy(CachePolicy.ENABLED)
  13. .respectCacheHeaders(true)
  14. .components {
  15. add(VideoFrameDecoder.Factory())
  16. }
  17. .crossfade(true)
  18. .build()
  19. }
  20. val painter = rememberAsyncImagePainter(
  21. model = mediaPath,
  22. imageLoader = imageLoader,
  23. )
  24. if (painter.state is AsyncImagePainter.State.Loading) {
  25. Image(
  26. painter = painterResource(id = R.drawable.ic_default_thumbnail),
  27. contentDescription = null,
  28. modifier = modifier,
  29. contentScale = ContentScale.Crop,
  30. )
  31. }
  32. Image(
  33. painter = painter,
  34. contentDescription = stringResource(id = R.string.thumbnail),
  35. contentScale = ContentScale.Crop,
  36. modifier = modifier
  37. )
  38. } else {
  39. AsyncImage(
  40. model = mediaPath,
  41. contentDescription = stringResource(id = R.string.thumbnail),
  42. modifier = modifier,
  43. contentScale = ContentScale.Crop,
  44. placeholder = painterResource(id = R.drawable.ic_default_thumbnail),
  45. error = painterResource(id = R.drawable.ic_default_thumbnail)
  46. )
  47. }
  48. }
展开查看全部

相关问题