【问题标题】:How to get Image URI by intent MediaStore.ACTION_IMAGE_CAPTURE in Android 10 and above如何在 Android 10 及更高版本中通过意图 MediaStore.ACTION_IMAGE_CAPTURE 获取图像 URI
【发布时间】:2021-02-12 20:27:55
【问题描述】:

对于版主:我知道已经有这样的问题,但所有这些方法最终都会通过data.getExtra("data") 提供位图,实际上只是thumbnail。我想获取 URI 而不是位图,我需要获取 ACTUAL IMAGE 的 URI 而不是其缩略图,方法可在 2021 中使用。请在将问题标记为重复之前考虑这一点!

我正在从相机获取图像,它在较低的设备上工作正常,但是当仅在 Android 10 和 11 中调用 onActivityResult 时,它的数据为空。

这就是我正在做的事情

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(intent, ACTION_REQUEST_CAMERA)

这是我的 onActivityResult

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK && requestCode == ACTION_REQUEST_CAMERA) {

            data?.data?.let { uri ->
                 Toast.makeText(context, "Got URI", Toast.LENGTH_LONG).show()
            }
        }
    }

【问题讨论】:

标签: android android-camera


【解决方案1】:

这种方法对我有用

Manifest 文件中

     <application>
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.example.android.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths">
            </meta-data>
        </provider>
     ...
     </application

创建了一个文件/res/xml/file_paths.xml 并在其中指定了路径

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="my_images" path="Pictures" />
</paths>

在我的activity

创建了一个全局变量var cameraPhotoFilePath: Uri? = null

这就是我开始相机活动以获得结果的方式

val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
                val photoFile: File? = try {
                    createImageFileInAppDir()
                } catch (ex: IOException) {
                    // Error occurred while creating the File
                    null
                }

                photoFile?.also { file ->
                    val photoURI: Uri = FileProvider.getUriForFile(
                        this,
                        "com.example.android.provider",
                        file
                    )
                    cameraPhotoFilePath = photoURI
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
                }
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
                startActivityForResult(intent, ACTION_REQUEST_CAMERA)

这是我在上面代码中使用的辅助函数

@Throws(IOException::class)
    private fun createImageFileInAppDir(): File {
        val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
        val imagePath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
        return   File(imagePath, "JPEG_${timeStamp}_" + ".jpg")
    }

最后在onActivityResult 这就是我得到图像 Uri 的方式

if (resultCode == RESULT_OK && requestCode == ACTION_REQUEST_CAMERA) {
        cameraPhotoFilePath?.let { uri -> 
            // here uri is image Uri that was captured by camera
        }
    }

【讨论】:

  • 我花了几天时间才找到获取 imageUri 的解决方案,但没有尝试您的解决方案,因为只有 1 个支持。现在,当我尝试您的代码时,它第一次可以正常工作,根本没有错误。人们应该对此表示支持,以此作为吸引更多人的解决方案
【解决方案2】:

你应该通过MediaStore.ACTION_IMAGE_CAPTURE 动作将你自己的uri(路径)传递给意图

putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(
    applicationContext,
    "$packageName.your_file_provider",
    File("path/to")
))
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

更多关于FileProvider的信息

【讨论】:

  • 您能否解释一下如何在onActivityResult 中通过额外的方式访问该文件提供程序
  • onActivityResult 你不需要做任何事情,因为提供的意图路径是图像将出现的位置
  • 您自己不需要使用文件提供程序。只需使用File("path/to")。如果您想分享图片,只需从该路径再次构建 uri。
  • @blackapps 安全的方法是使用 FileProvider。至于我在旧版本的 Android 上 File("path/to") 不起作用
【解决方案3】:

Android 开发人员有关于如何获取全尺寸照片的良好文档。您还可以获取全尺寸图片的uri。请访问此链接Get full size image

【讨论】:

    猜你喜欢
    • 2021-01-09
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2016-08-25
    • 2021-11-17
    • 2021-08-02
    相关资源
    最近更新 更多