使用 Kotlin 从相机/图库捕获图像并在活动/片段中显示

X-B*_*... 0 android kotlin

我知道这是一个使用 java 很好回答的微不足道的问题,但我确信有新的APIs东西可以让事情变得更容易,比如

val getContent = registerForActivityResult(GetContent()) { uri: Uri? -> // Handle the returned 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)
}
Run Code Online (Sandbox Code Playgroud)

问:如何使用 kotlin 实现上述问题并为此实现最新APIs

PS:如果提供的答案贬值或过时,这个问题仍然有效。

Le *_*ieu 5

这是我的代码,希望对您有所帮助

  • 拍照:
  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)
       }
   }

Run Code Online (Sandbox Code Playgroud)
  • 从库中选择
    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)
            }
        }

Run Code Online (Sandbox Code Playgroud)

然后在按下按钮时调用该函数:

btnSelectFromGallery.setOnClickListener {
                pickImages.launch("image/*")
            }
btnTakePicture.setOnClickListener {
                takePicture()
            }
Run Code Online (Sandbox Code Playgroud)