如何在 Android 10 及更高版本中通过意图 MediaStore.ACTION_IMAGE_CAPTURE 获取图像 URI
How to get Image URI by intent MediaStore.ACTION_IMAGE_CAPTURE in Android 10 and above
致主持人:我知道已经有这样的问题,但所有这些方法最终都通过 data.getExtra("data")
提供位图,实际上只是 thumbnail
。我想要获取 URI 而不是位图,并且我需要使用 2021
中可用的方法获取实际图像的 URI 而不是其缩略图。在将问题标记为重复之前请考虑这一点!
我正在从相机获取图像,它在低端设备上工作正常,但当仅在 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()
}
}
}
您应该将自己的 uri(路径)传递给 intent with action MediaStore.ACTION_IMAGE_CAPTURE
putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(
applicationContext,
"$packageName.your_file_provider",
File("path/to")
))
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
有关 FileProvider
的更多信息
Android 开发人员有关于如何获取全尺寸照片的详细文档。您还可以获得全尺寸图像的uri。请访问此link Get full size image
这个方法对我有用
在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
这就是我启动 Camera acitivity for results 的方式
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
}
}
致主持人:我知道已经有这样的问题,但所有这些方法最终都通过 data.getExtra("data")
提供位图,实际上只是 thumbnail
。我想要获取 URI 而不是位图,并且我需要使用 2021
中可用的方法获取实际图像的 URI 而不是其缩略图。在将问题标记为重复之前请考虑这一点!
我正在从相机获取图像,它在低端设备上工作正常,但当仅在 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()
}
}
}
您应该将自己的 uri(路径)传递给 intent with action MediaStore.ACTION_IMAGE_CAPTURE
putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(
applicationContext,
"$packageName.your_file_provider",
File("path/to")
))
addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
有关 FileProvider
的更多信息Android 开发人员有关于如何获取全尺寸照片的详细文档。您还可以获得全尺寸图像的uri。请访问此link Get full size image
这个方法对我有用
在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
这就是我启动 Camera acitivity for results 的方式
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
}
}