嗨,我试着用kotlin和registerForActivityResult捕捉一张照片,但是我总是得到一个模糊的图像,没有质量,我读过几篇文章,但我不知道如何处理我的应用程序。我用一段片段给摄像机打电话。有什么建议吗?对不起,我的英语不太好,我花了整整一周的时间试着用它。什么都没有。提前感谢
私有变量imagenUri: Uri?=null
val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
result: ActivityResult ->
if (result.resultCode == Activity.RESULT_OK) {
try {
val intent = result.data
intent!!.putExtra(MediaStore.EXTRA_OUTPUT, imagenUri)
val bitMap = intent?.extras?.get("data") as Bitmap
imagenUri= getImageUriFromBitmap(requireContext(),bitMap)
binding.ivImagen.setImageURI(imagenUri)
Toast.makeText(context, "la uri es: $imagenUri", Toast.LENGTH_SHORT).show()
} catch (e: java.lang.Exception){
Toast.makeText(context, "NO SE HA PODIDO ENCONTRAR IMAGEN", Toast.LENGTH_SHORT).show()}
}
}
binding.ibTomarFoto.setOnClickListener(){
startForResult.launch(Intent(MediaStore.ACTION_IMAGE_CAPTURE))
}发布于 2022-11-28 11:40:18
来自文献资料
public static final String ACTION_IMAGE_CAPTURE标准的意图动作,可以发送给相机应用程序捕获并返回图像。 调用方可以传递一个额外的EXTRA_OUTPUT来控制该图像的写入位置。如果不存在EXTRA_OUTPUT,则在额外字段中以位图对象的形式返回一个较小的图像。这对于只需要小图像的应用程序非常有用。如果存在,则将将完整的映像写入EXTRA_OUTPUT.的Uri值。
因此,您需要额外添加EXTRA_OUTPUT以获得存储在您提供的URI中的完整映像。否则,您将在结果Intent中获得一个作为数据有效负载的小映像(这些包无法处理大型对象)。
看起来您已经在尝试这样做了,您只是将它添加到了错误的位置--您需要将它添加到调用launch的launch中,而不是结果之一。这是您正在启动的任务的配置选项!
所以这应该是可行的:
binding.ibTomarFoto.setOnClickListener(){
startForResult.launch(
Intent(MediaStore.ACTION_IMAGE_CAPTURE).putExtra(MediaStore.EXTRA_OUTPUT, imagenUri)
)
}然后从结果处理程序代码中删除相同的putExtra行(它什么也不做,但没有意义)
https://stackoverflow.com/questions/74592988
复制相似问题