我从图库中访问图像,或者直接从我的应用程序中的相机访问图像。在将其发送到服务器之前,必须确保图像旋转不正确。因此,我正在使用该函数从画廊或相机拍摄的图像中获取旋转。
一切正常,没有问题,但是在Xiaomi Mi A1
上却导致此错误:
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
从意图返回的相机图像错误(实际上是AndroidStudio中的Logcat中的错误):
E/mm-camera: <MCT ><ERROR> 1108: mct_pipeline_decide_hw_wakeup: Couldn't find meta stream
Android版本是9.0。但这是100%与版本无关的。我还有另一部Android 9.0手机,可以正常使用。当我从第一行和第二列中选择一张照片时,如何访问画廊的-1列?
出于相机意图->根本没有在控制台中引发任何异常->应用将不会停止工作,只会显示错误提示(因为onActivityResult' intent is
空but
结果代码{{ 1}} RESULT_OK`。
画廊和照相机的旋转功能:
is
也许我应该包括如何访问相机和画廊:
fun getRotationFromCamera(context: Context, imageFile: Uri): Int {
var rotate = 0
try {
context.contentResolver.notifyChange(imageFile, null)
val exif = ExifInterface(imageFile.path!!)
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
}
} catch (e: Exception) {
e.printStackTrace()
}
return rotate
}
fun getRotationFromGallery(context: Context, imageUri: Uri): Int {
val columns = arrayOf(MediaStore.Images.Media.ORIENTATION)
val cursor = context.contentResolver.query(imageUri, columns, null, null, null) ?: return 0
cursor.moveToFirst()
val orientationColumnIndex = cursor.getColumnIndex(columns[0])
return cursor.getInt(orientationColumnIndex)
}
更新:
搜索了几个小时后,我找到了解决方案(仅适用于通过相机拍摄照片)。如果您打开private fun openGallery() {
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
a.startActivityForResult(intent, REQUEST_GALLERY_NODE_MISUSE)
}
private fun openCamera() {
val tempFile = createImageFile()
photoUri = FileProvider.getUriForFile(a, app.packageName + ".fileprovider", tempFile)
val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
if (intent.resolveActivity(a.packageManager) != null) {
a.startActivityForResult(intent, REQUEST_CAMERA_NODE_MISUSE)
}
}
,即使您使用相机拍照,此Intent也不会返回CameraIntent
。它实际上会将这张照片添加到data: Intent
制作的空白文件中(在上面的代码中为FileProvider
)。您必须从此photoUri
中读取照片,而不要从发送至Uri
的{{1}}中读取照片。这实际上很奇怪,仅与data
手机的情况类似。我已经尝试过onActivityResult
和Xiaomi
(都是Android 9.0),并且数据不为空。
仍然存在一个问题,为什么这种旋转对于画廊和相机Uri均不起作用。