Как сохранить захваченное камерой изображение с пользовательским именем файла в Android? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь сделать снимок с камеры в Android и хочу сохранить его с пользовательским именем файла, используя UUID (например: f12b5700-1d92-11e9-ab14-d663bd873d93.jpg).

В следующем коде в onActivityResult я получаю f12b5700-1d92-11e9-ab14-d663bd873d93.jpg в photoPath, но когда я проверяю фактическое изображение на устройстве, оно сохраняется как 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()
    }
}

1 Ответ

0 голосов
/ 21 января 2019

С некоторой борьбой мне удалось решить проблему с помощью ссылки 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. Мне пришлось добавить <provider> в AndroidManifest.xml

Рабочий код выглядит так:

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 соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...