使用Kotlin从相机/相册中捕获图像并在Activity/Fragment中显示

3

我知道这是一个使用Java很容易回答的琐碎问题,但我相信有新的API可以使事情更加容易,例如:

val getContent = registerForActivityResult(GetContent()) { uri: Uri? -> // 处理返回的Uri }

以及

val takePicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { success: Boolean ->
    if (success) {
        // The image was saved into the given Uri -> do something with it
    }
}

val imageUri: Uri = ...
button.setOnClickListener {
    takePicture.launch(imageUri)
}

问:如何使用Kotlin实现上述问题并实现最新的API

附注:如果提供的答案过时或已弃用,这个问题仍然有效。

1个回答

8

以下是我的代码,希望能对你有所帮助。

  • 拍照:
  fun takePicture() {
        val root =
               File(Environment.getExternalStorageDirectory(), BuildConfig.APPLICATION_ID + File.separator)
           root.mkdirs()
           val fname = "img_" + System.currentTimeMillis() + ".jpg"
           val sdImageMainDirectory = File(root, fname)
           viewModel.profileImageUri = FileProvider.getUriForFile(requireContext(), context?.applicationContext?.packageName + ".provider", sdImageMainDirectory)
           takePicture.launch(viewModel.profileImageUri)
       }

  val takePicture = registerForActivityResult(ActivityResultContracts.TakePicture()) { success: Boolean ->
       if (success) {
           // The image was saved into the given Uri -> do something with it
             Picasso.get().load(viewModel.profileImageUri).resize(800,800).into(registerImgAvatar)
       }
   }

  • 从库中选择
    private val pickImages = registerForActivityResult(ActivityResultContracts.GetContent()){ uri: Uri? ->
            uri?.let { it ->
                // The image was saved into the given Uri -> do something with it
               Picasso.get().load(it).resize(800,800).into(registerImgAvatar)
            }
        }

当按下按钮时,调用该函数:

btnSelectFromGallery.setOnClickListener {
                pickImages.launch("image/*")
            }
btnTakePicture.setOnClickListener {
                takePicture()
            }

谢谢你的回答。你能否解释一下takePicture()中的ViewModel是什么? 另外,Environment.getExternalStorageDirectory()似乎已经过时了。 - alex
1
@alex ViewModel 是 MVVM 架构中声明 profileImageUri 值的类。是的,Environment.getExternalStorageDirectory() 已经过时了,你可以使用 getExternalFilesDir() 代替。 - Le Trung Hieu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接