Фотосъемка и сохранение во внутреннем хранилище и получение ошибки для getUriForFile - PullRequest
0 голосов
/ 27 апреля 2018

Итак, я работаю над приложением, где делаю фотографию и пытаюсь сохранить ее во внутреннем хранилище приложений. У меня проблемы с файловым провайдером. Я рассмотрел много вопросов, задаваемых о переполнении стека, но хотел бы получить более подробное объяснение, если это возможно.

Я также последовал примеру Google, и это дает мне следующую ошибку. https://developer.android.com/training/camera/photobasics

Failed to find configured root that contains /storage/emulated/0/Android/data/com.myapp.debug/files/Pictures/JPEG_20180427_095752_2090822261.jpg

Вот код, который у меня есть, когда я следую примеру Google.

<provider
        android:name=".application.blinkupregistration.postworkphotos.PostWorkPhotosFileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

В моем коде.

Uri photoURI = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".provider", photoFile);

Для двух вышеперечисленных я также попытался жестко закодировать com.myapp.provider в полномочия и метод getUriForFile. Также сделал getpackageName () для метода getUriForFile. Но это не сильно изменилось. Я думаю, что главная проблема - пути.

Попробовал следующие пути на примере Google,

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="post_work_photos" path="Android/data/${applicationId}/files/Pictures" />
</paths>


<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="post_work_photos" path="Android/data/com.myapp/files/Pictures" />
</paths>

Я заставляю это работать всякий раз, когда я изменяю свой путь.

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

Но я не понимаю, почему это работает с периодом. Я также не знаю, правильная ли это практика, что является моей главной заботой.

Если кто-нибудь может мне помочь, то это было бы здорово. Благодарю.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Если вы пытаетесь сохранить изображение в папке данных вашего приложения, это должно работать:

Intent imageIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File image = new File(getApplicationContext().dataDir, "image.jpg");
Uri uriSavedImage = Uri.fromFile(image);
imageIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);

context.dataDir поддерживается начиная с уровня API 4.

Полный путь к каталогу по умолчанию, назначенному пакету для его постоянных данных.

В противном случае, если вы работаете выше API уровня выше 24, вы можете вызвать getFilesDir() в любом месте контекста. (Деятельность, Сервис, ...)

Возвращает абсолютный путь к каталогу в файловой системе, где хранятся файлы, созданные с помощью openFileOutput (String, int).

0 голосов
/ 27 апреля 2018

Пробовал следующие пути, используя пример Google,

Их пример ... имеет проблемы.

Но я не понимаю, почему это работает с периодом.

Потому что вы говорите, что готовы поддерживать что-либо внутри корня внешнего хранилища.

Я тоже не знаю, правильная ли это практика

Вы можете немного уменьшить область видимости, используя <external-files-path>:

<external-files-path name="post_work_photos" path="." />

Теперь вы обслуживаете только файлы из getExternalFilesDir(), на которые указывает ваш файл.

...