Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 拍照并保存到多媒体资料_Android_Kotlin_Camera_Image Gallery_Android Camera Intent - Fatal编程技术网

Android 拍照并保存到多媒体资料

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

我花了数小时研究这个问题,但没有找到解决方案(关于StackOverflow或其他)。 我的应用程序的目标是API 30,Minssk版本是29。我将遵循本教程:

我的活动中有一个按钮,可以使用以下意图打开相机:

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"