5

嗨,我有一个 compileSdkVersion 30 和 targetSdkVersion 30 的应用程序。因为我需要知道图像的方向,所以我写了这些:

val exif = ExifInterface(imageFile.absolutePath)
            val orientation = exif.getAttributeInt(
                ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_NORMAL
            )

            when (orientation) {
                ExifInterface.ORIENTATION_ROTATE_270 -> rotate = 270
                ExifInterface.ORIENTATION_ROTATE_180 -> rotate = 180
                ExifInterface.ORIENTATION_ROTATE_90 -> rotate = 90
            }

但是有一个例外显示,例如:

java.io,FileNotFoundException:/storage/emulated/0/DCIM/Camera/xxx.jpg: open failed EACCESS(Permission denied)
...
at android.media.ExifInterface.<init>(ExifInterface.java.1389)

我想做的是获取图像并知道它的方向,但我在互联网上找不到任何样本。任何人都可以给我一个提示吗?谢谢!

4

2 回答 2

1

目标 API 30 的 Foi 项目必须使用支持 ExifInterface:

implementation "androidx.exifinterface:exifinterface:1.3.2"

和带有 InputStream 的 ExifInterface 构造函数:

import androidx.exifinterface.media.ExifInterface

private fun calculateBitmapRotateDegrees(uri: Uri): Float {
    var exif: ExifInterface? = null
    try {
        val inputStream: InputStream? = contentResolver.openInputStream(uri)
        inputStream?.run {
            exif = ExifInterface(this)
        }
    } catch (e: IOException) {
        e.printStackTrace()
    }

    exif?.run {
        val orientation = getAttributeInt(
            ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_NORMAL
        )

        return when (orientation) {
            ExifInterface.ORIENTATION_ROTATE_90 -> 90F
            ExifInterface.ORIENTATION_ROTATE_180 -> 180F
            ExifInterface.ORIENTATION_ROTATE_270 -> 270F
            else -> 0F
        }
    }
    return 0F
}
于 2021-05-06T14:27:09.960 回答
-1

在 Android 11 上,您可以访问该 Camera 目录,但大多数情况下无法访问该目录中属于其他应用的文件。

如果您使用经典的文件系统路径,那就不行了。

那么哪个应用程序将这些文件放在那里?

如果不是,您使用 ACTION_OPEN_DOCUMENT 之类的操作让用户选择一个文件,该文件可以为您提供一个不错的 uri。

于 2020-10-19T07:54:02.033 回答