провайдер включен / хранилище / эмулируется / 0 / - PullRequest
0 голосов
/ 17 мая 2018


Я знаю, что это старенький, но я, кажется, не могу найти способ справиться с этим ...
Я должен захватить изображение с камеры для последующей обработки ввода-вывода, перенести его на общий сетевой ресурс, но перед этим мне многое не удалось ... после некоторого прочтения я нашел способ сделать это на KitKat, проверяя работающий SDK, и он работает .. но теперь я также тестирую его на устройстве Nougat.

для нуги я прочитал, что должен использоваться провайдер, и я пытаюсь ...
захваченное изображение ДОЛЖНО храниться в определенной папке, которая является
"/ storage / emulated / 0 / InsulinPower / amSignTool / Data"
для последующей обработки ввода-вывода ... так что я думаю, что-то похожее на должен быть использован, в настоящее время без взгляда ..
Я посмотрел на определение провайдера для всех «областей», но не могу получить ответ, который мне нужен, и больше я получаю исключения ... как определение URI для получения, я получаю
java.lang.reflect.InvocationTargetException
java.lang.IllegalArgumentException: не удалось найти настроенный корень, который содержит /storage/emulated/0/InsulinPower/amSignTool/Data/XCAMX-201805171828082115829615.jpg

в file_paths я пытался все тихо, как вы можете видеть ... но это работает, только если я ссылаюсь external-path и NOT external-path-files , что действительно кажется будь тем, кто мне нужен .. внешний путь код тривиален ....

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
    File pictureFile = null;
    try {
        pictureFile = GENERIC.amPictureFile(this);
    } catch (IOException ex) {
    // Error occurred while creating the File
    Toast.makeText(this, "Create file failed!", Toast.LENGTH_SHORT).show();
    }

if (pictureFile != null) {
    //https://stackoverflow.com/questions/40087944/content-uri-crashes-camera-on-android-kitkat
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT){
        this.imageToUploadUri = Uri.fromFile(pictureFile);
    } else {            
        this.imageToUploadUri = FileProvider.getUriForFile(this,"com.insulinpower.android.fileprovider", pictureFile);  // <-- THIS statement crashes with the indicated exception
    }
    //\  https://stackoverflow.com/questions/40087944/content-uri-crashes-camera-on-android-kitkat

    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri);
    startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
}


// file_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Share folder under public external storage folder.The base folder is Environment.getExternalStorageDirectory()-->
    <!--external-path name="my_data" path="InsulinPower/amSignTool/Data/" /> -->
    <external-files-path name="my_data" path="/InsulinPower/amSignTool/Data/" />
    <!-- external-files-path name="my_data" path="InsulinPower/amSignTool/Data/" / -->
    <!-- external-files-path name="my_data" path="/" /-->
</paths>


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

File storageDir = новый файл (Environment.getExternalStorageDirectory (), "");
возвращает "/ storage / emulated / 0" // действительный, добавляя суффикс / InsulinPower / amSignTool / Data для перехода в нужную папку ...

Файл file = this.getExternalFilesDir (null);
возвращает "/storage/emulated/0/Android/data/com.insulinpower.amsigntool/files" // недействительно для меня

Любой намек был бы очень признателен, чтобы понять мои ошибки, и, пожалуйста, извините за мой плохой английский.
TIA
Andrea

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

@ CommonsWare: вау ... спасибо, это работает ...
Я просто должен был изменить свой pictureFile = GENERIC.amPictureFile (this);
установить для ссылочного модуля StringFileName значение

this.m_PictureFilePath = "file:" + pictureFile.getAbsolutePath(); 


так как я тоже не запустил его с "file:" ...
и поскольку GENERIC.amPictureFile (this) уже указывает на Environment.getExternalStorageDirectory () + "/Insulin...../"
Я должен был изменить

<external-path name="my_data" path="/InsulinPower/amSignTool/Data/" />


до

<external-path name="my_data" path="." />


как я понимаю, создание файла уже указывает на подпапку корневого каталога, и его дублирование в поставщике и в создании файла должно быть вложенным в свертывание ... или это мое понимание.
< br /> https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en тоже помогло ...
Большое вам спасибо, вы были очень полезны на самом деле ... очень признателен, потому что я только начинаю понимать этот материал провайдера
Andrea

0 голосов
/ 17 мая 2018

захваченное изображение ДОЛЖНО храниться в определенной папке, которая "/ Хранение / эмулировать / 0 / InsulinPower / amSignTool / Data"

То есть new File(Environment.getExternalStorageDirectory(), "InsulinPower/amSignTool/Data").

но это работает, только если я обращаюсь к файлам external-path и NOT external-path-files, которые действительно мне нужны

Правильно. Попробуйте:

<external-path name="my_data" path="/InsulinPower/amSignTool/Data/" />

Вы определенно хотите <external-path>, а не <external-files-path>, учитывая, куда вы хотите поместить файл.

Вам также необходимо:

cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

до начала занятия. В противном случае приложение камеры не имеет прав на запись в это местоположение.

...