Android 拍照并保存到多媒体资料
我花了数小时研究这个问题,但没有找到解决方案(关于StackOverflow或其他)。 我的应用程序的目标是API 30,Minssk版本是29。我将遵循本教程: 我的活动中有一个按钮,可以使用以下意图打开相机:Android 拍照并保存到多媒体资料,android,kotlin,camera,image-gallery,android-camera-intent,Android,Kotlin,Camera,Image Gallery,Android Camera Intent,我花了数小时研究这个问题,但没有找到解决方案(关于StackOverflow或其他)。 我的应用程序的目标是API 30,Minssk版本是29。我将遵循本教程: 我的活动中有一个按钮,可以使用以下意图打开相机: fun takePhoto() { Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent -> takePictureIntent.resolveActivity(packageM
fun takePhoto() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
takePictureIntent.resolveActivity(packageManager)?.also {
startActivityForResult(takePictureIntent, CAMERA_REQUEST)
}
}
}
但我还想将图片保存在设备库中。因此,我将我的takePhoto()
方法更改为:
fun takePhoto() {
Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->
takePictureIntent.resolveActivity(packageManager)?.also {
val photoFile: File? = try {
createImageFile()
} catch (ex: IOException) {
ex.printStackTrace()
null
}
photoFile?.also {
try {
val photoURI: Uri = FileProvider.getUriForFile(
this,
"net.filiperamos.photogrid.provider",
it
)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
} catch (ex: IllegalArgumentException) {
Log.d(TAG, "Could not get file URI.")
ex.printStackTrace()
}
startActivityForResult(takePictureIntent, CAMERA_REQUEST)
}
}
}
}
并添加了createImageFile()
方法:
private fun createImageFile(): File {
val timeStamp: String = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date())
val filename = "image_$timeStamp"
val storageDir: File? = getExternalFilesDir(Environment.DIRECTORY_PICTURES)
return File.createTempFile(filename, ".jpg", storageDir).apply {
currentPhotoPath = absolutePath // Save path for later use
}
}
我的清单具有摄像头使用和外部写入权限:
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在我的设备上运行此代码时,在运行FileProvider.getUriForFile()时会出现异常。
:
如果我更改我的文件\u paths.xml
文件,将外部文件路径
替换为外部路径
,错误会消失,但没有图像存储在任何地方
我缺少什么?在清单文件中添加以下行作为“应用程序”标记的属性
android:requestLegacyExternalStorage="true"
这应该可以解决您面临的问题,异常应该消失。“我创建了文件_paths.xml:”--用
图片
替换路径
值。“没有图像存储在任何地方”--您如何查找它?它不会显示在MediaStore
中,因为存储在该位置的图像不再可索引。因此,Gallery样式的应用不太可能拾取图像。谢谢,错误现在消失了。但我希望用我的应用程序拍摄的照片可以用于其他应用程序。我如何才能从系统的媒体提供商处访问它?在接下来的一年左右,使用android:requestLegacyExternalStorage=“true”并将其写入公共位置,例如顶级的图片/
目录,而不是您现在使用的特定于应用程序的位置。此时,考虑到整个作用域存储混乱,我不知道一年后您所需功能的计划是什么。这不起作用:如果我保留外部文件路径
,我仍然会看到错误,如果我将其更改为外部路径
,我看不到错误,但也看不到保存的图像。虽然看起来,根据@commonware,我在错误的位置寻找照片…
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-files-path
name="my_images"
path="Android/data/net.ramos.photos/files/Pictures/" />
</paths>
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/net.ramos.photos/files/Pictures/image_20200823_1415398042919497737944663.jpg
android:requestLegacyExternalStorage="true"