如何在 Android 中使用自定义文件名保存相机拍摄的图像?

Posted

技术标签:

【中文标题】如何在 Android 中使用自定义文件名保存相机拍摄的图像?【英文标题】:How to save camera captured image with custom file name in Android? 【发布时间】:2019-06-15 00:45:54 【问题描述】:

我正在尝试从 android 中的相机拍摄照片,我想使用 UUID 以自定义文件名保存它(例如:f12b5700-1d92-11e9-ab14-d663bd873d93.jpg)。

在下面的代码中,在onActivityResult 中,我确实在 photoPath 中得到了 f12b5700-1d92-11e9-ab14-d663bd873d93.jpg 但是当我检查设备上的实际图像时,它被保存了作为 timestamp.jpg(例如:1548082653944.jpg)。我的问题是如何使图像以自定义名称保存?

private var photoURI: Uri? = null
private fun takePhoto()
    
        val values = ContentValues()
        values.put(MediaStore.Images.Media.TITLE, UUID.randomUUID().toString() + ".jpg")

        photoURI = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)

        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(packageManager) != null)
        
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            startActivityForResult(intent, PHOTO_REQUEST_CODE);
        
    

在 onActivityResult 处理程序中,代码如下所示:

if (requestCode == PHOTO_REQUEST_CODE)

    if (resultCode == Activity.RESULT_OK)
    
        val proj = arrayOf(MediaStore.Images.Media.TITLE)

        val cursor = contentResolver.query(photoURI!!, proj, null, null, null)
        val index = cursor!!.getColumnIndex(MediaStore.Images.Media.TITLE)

        cursor.moveToFirst()
        photoPath = cursor.getString(index)
        cursor.close()

         Toast.makeText(this, photoPath, Toast.LENGTH_LONG).show()
    
    else
    
        capturedImage.setImageURI(null)
        Toast.makeText(this, "Photo was not taken", Toast.LENGTH_SHORT).show()
    

【问题讨论】:

您的意思是直接保存为timestamp.jpg 还是保存为2019-01-21T15:35.jpg(或类似名称)? 另存为1548082653944.jpg 同样适用于uuid.jpg..?请把你的问题说清楚! 很抱歉。我已经更新了这个问题。我想将其保存为例如:f12b5700-1d92-11e9-ab14-d663bd873d93.jpg ContentValuescontentResolver.insert() 替换为FileProvider。见this sample app。 【参考方案1】:

经过一番努力,我在 CommonsWare 链接的帮助下解决了这个问题: https://github.com/commonsguy/cw-omnibus/tree/v8.13/Camera/FileProvider

此外,我还从这些链接中获得了帮助:

https://guides.codepath.com/android/Accessing-the-Camera-and-Stored-Media

https://guides.codepath.com/android/Sharing-Content-with-Intents#sharing-files-with-api-24-or-higher

https://developer.android.com/training/camera/photobasics

https://developer.android.com/reference/android/os/Environment.html#getExternalStorageState(java.io.File)

诀窍是使用 FileProvider。 我必须在 AndroidManifest.xml 中添加<provider>

工作代码如下所示:

if (Environment.getExternalStorageState() != Environment.MEDIA_MOUNTED)
        
            Toast.makeText(this, "Storage is not available", Toast.LENGTH_LONG).show()
            return
        

        var imageName = UUID.randomUUID().toString() + ".jpg"
        var output = File(Environment.getExternalStoragePublicDirectory(appName), imageName)


        if (!output.parentFile.exists() && !output.parentFile.mkdir())
        
            Toast.makeText(this, "Unable to create storage folder", Toast.LENGTH_LONG).show()
            return
        

        photoURI = FileProvider.getUriForFile(this, authority, output)

        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(packageManager) != null)
        
            intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI)
            startActivityForResult(intent, PHOTO_REQUEST_CODE);
        

提供者:

<provider
    android:authorities="com.domain.appname.fileprovider"
    android:name="android.support.v4.content.FileProvider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths"/>
</provider>

file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="appname" path="appname" />
</paths>

相应地更改 com.domain.appname 和 appname。

【讨论】:

权威的价值是什么?

以上是关于如何在 Android 中使用自定义文件名保存相机拍摄的图像?的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义表面的 Android CameraX

如何在android中使用相机捕获自定义图像大小?

如何在视频中保存相机预览帧?

如何在android中计算自定义相机中的剩余照片数量

mui拍照后如何保存到自定义目录中?mui代码如何建文件夹?

Android - 通过 Intent 拍摄照片并使用自定义名称将它们保存到自定义目的地