【问题标题】:TakePicture without using a FileProvider不使用 FileProvider 的 TakePicture
【发布时间】:2021-11-22 16:07:33
【问题描述】:

我只是想拍照并设置为ImageView

我找到了两种方法:

1) 使用ActivityResultContracts.TakePicture ()

这种方法的问题是我必须创建一个文件并传递 Uri 来调用启动器。由于新活动不会“属于”我的应用程序,因此我必须使用需要修改 manifest.xml 并创建一个新文件的 FileProvider:file_paths.xml

2) 使用ActivityResultContract.TakePicturePreview ()

使用此选项,我可以避免使用 FileProvider,并将捕获的图像通过 lambda 函数的位图传递,如下所示:

    private val cameraLauncher =
        registerForActivityResult(ActivityResultContracts.TakePicturePreview()) { imageBitmap ->
            view?.findViewById<ImageView>(R.id.image)?.setImageBitmap(imageBitmap)
}

此解决方案的问题是返回的imageBitmap 质量非常低。

我想要什么

我只需要在 ImageView 中设置图像。出于这个原因,在我的数据流中,这个图像不应该存储在磁盘上。我不想使用第一个选项,因为我认为 FileProvider 会重载代码,并且我正在创建一个我永远不会使用的帮助文件。

有没有不使用 FileProvider 获取完整图像的简单解决方案?

【问题讨论】:

  • "这张图片不应该存储在磁盘上" -- 全分辨率照片很大,这就是为什么ACTION_IMAGE_CAPTURE/ActivityResultContracts.TakePicture 要求它们存储在磁盘上,并且“预览” " 方法(避免使用磁盘)会导致低分辨率图像。 “是否有一个简单的解决方案可以在不使用 FileProvider 的情况下获取完整图像?” - 并不真地。您可以集成 CameraX 或第三方相机库并自行实现相机功能。

标签: java android kotlin android-fileprovider


【解决方案1】:

如果您访问特定于应用程序的目录,则无需处理文件提供程序和其他东西

只需创建一个缓存文件

new File(context.getExternalCacheDir().getAbsolutePath() + File.separator + "TemperoryFile_"+System.currentTimeMillis()+".png");

File apis 会顺利运行

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多