FileProvider - IllegalArgumentException: impossibile trovare il root configurato


234

Sto cercando di scattare una foto con la fotocamera, ma visualizzo il seguente errore:

FATAL EXCEPTION: main
Process: com.example.marek.myapplication, PID: 6747
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.marek.myapplication/files/Pictures/JPEG_20170228_175633_470124220.jpg
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
    at com.example.marek.myapplication.MainActivity.dispatchTakePictureIntent(MainActivity.java:56)
    at com.example.marek.myapplication.MainActivity.access$100(MainActivity.java:22)
    at com.example.marek.myapplication.MainActivity$1.onClick(MainActivity.java:35)

AndroidManifest.xml:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.marek.myapplication.fileprovider"
        android:enabled="true"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

Giava:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Toast.makeText(getApplicationContext(), "Error while saving picture.", Toast.LENGTH_LONG).show();
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.marek.myapplication.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="images/"/>
</paths>

Stavo cercando tutto il giorno su questo errore e FileProviderstavo cercando di capire , ma non ho idea di cosa questo messaggio di errore tenti di dirmi. Se vuoi maggiori informazioni / codice, scrivimi nel commento.


2
Puoi anche incollare il codice del metodo createImageFile?
Ankit Batra,

Mi dispiace tanto, ma ho annullato questo progetto e non ci sto più lavorando . Accetterò la risposta preferita per "chiudere" questa domanda. Grazie a tutti per la partecipazione e spero che aiuti gli altri.
Pivoman,

Ho affrontato lo stesso problema. Abbiamo trovato questa soluzione per avviare una configurazione di FileProvider di base utilizzando un progetto di esempio github minimo: stackoverflow.com/a/48103567/2162226 . Fornisce i passaggi per i quali copiare i file (senza apportare modifiche) in un progetto autonomo locale
Gene Bo,

Questo problema è ora risolto in Delphi 10.4: quality.embarcadero.com/browse/RSP-26950
Dave Nottage

Risposte:


211

Il tuo file è archiviato sotto getExternalFilesDir(). Questo è mappato <external-files-path>, no <files-path>. Inoltre, il percorso del file non contiene images/al suo interno, quindi l' pathattributo nel tuo XML non è valido.

Sostituisci res/xml/file_paths.xmlcon:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="my_images" path="/" />
</paths>

AGGIORNAMENTO 2020 MAR 13

Percorso del provider per un percorso specifico come segue:

  • <files-path/> -> Context.getFilesDir()
  • <cache-path/> -> Context.getCacheDir()
  • <external-path/> -> Environment.getExternalStorageDirectory()
  • <external-files-path/> -> Context.getExternalFilesDir(String)
  • <external-cache-path/> -> Context.getExternalCacheDir()
  • <external-media-path/> -> Context.getExternalMediaDirs()

Rif: https://developer.android.com/reference/androidx/core/content/FileProvider


5
ok, ho aggiunto percorso-file esterno, ma ho ancora lo stesso errore: / Forse ci sono più bug. Sto utilizzando un dispositivo Android emulatore, devo creare quella cartella o qualcosa del genere?
Pivoman,

22
"L'attributo 'percorso' deve essere definito" qui ci manca il percorso nella configurazione.
blackjack il

1
Avevo un problema con più percorsi su Android 5. Ho lasciato solo un percorso, invece di 2.
ODAXY

3
Ho ricevuto un rapporto sugli arresti anomali (su 50-100 dispositivi, credo) che è identico a questo. <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>Il path="."è quello che ho trovato nella mia ricerca di rimanere al livello superiore. Se analizzi FileProvider più da vicino, vedrai che il percorso letto da XML viene canonizzato. La mia ipotesi migliore è che ha ContextCompat#getExternalFilesDirsrestituito null @line 616 (v26.0.1), quindi PathStrategy non è stato registrato. Ciò si è verificato sul dispositivo Huawei.
androidguy

10
Invece di usare <percorso-file-esterno ho provato <percorso-esterno e ha funzionato.
Più sicuro il

166

Questo può risolvere il problema di tutti: tutti i tag vengono aggiunti, quindi non devi preoccuparti del percorso delle cartelle. Sostituisci res / xml / file_paths.xml con:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path
    name="external"
    path="." />
  <external-files-path
    name="external_files"
    path="." />
  <cache-path
    name="cache"
    path="." />
  <external-cache-path
    name="external_cache"
    path="." />
<files-path
    name="files"
    path="." />
</paths>

3
Soluzione migliore. Grazie.
Pawan Pillai,

1
Soluzione semplice ... ma per questo geniale! Ho usato un provider quindi ho inserito la possibilità per l'utente di modificare la directory di destinazione ... nulla ha funzionato più perché a quel punto il provider dovrebbe essere dinamico .... mi hai salvato la giornata!
Bronz,

1
usato questa soluzione e il codice ha iniziato a funzionare. Rimosso il codice non necessario testando quale di questi funzionava
Kartik

1
Fratello, mi hai salvato la giornata. Grazie mille :-)
manjunath kallannavar il

1
Grande lavoro per me, come nuovo studente mi ha fatto capire che non stavo ottenendo da file esterni ma cache
Tony Merritt

82

Si è verificato un problema simile dopo i sapori abilitati (sviluppo, fase).

Prima dei sapori la mia risorsa percorso era simile a questa:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
    name="my_images"
    path="Android/data/pl.myapp/files/Pictures" />
</paths>

Dopo l'aggiunta di android: authority = "$ {applicationId} .fileprovider" in Manifest appId era pl.myapp.dev o pl.myapp.stage dipende dal sapore e l'app ha iniziato a bloccarsi. Ho rimosso il percorso completo e sostituito con punto e tutto ha iniziato a funzionare.

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="my_images"
        path="." />
</paths>

7
Ha funzionato per me. Grazie! Come ti è venuto in mente "." notazione?
NightFury il

2
@antygravity puoi fornire riferimento / documentazione di questa soluzione?
geekoraul,

7
Ci sono conseguenze negative di questa soluzione?
RediOne1,

Ha funzionato per me, grazie mille.
Hiren,

Questa dovrebbe essere la risposta accettata! L'unica soluzione che ha funzionato
egorikem,

43

Se si utilizza la cache interna, utilizzare.

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="cache" path="/" />
</paths>

3
grazie, la mia situazione: voglio installare un'app che abbia salvato in / data / data / pkg_name / files, quindi la mia corretta configurazione è la seguente: <files-path name = "files" path = "/" />
aolphn

25

Ho perso 2 settimane cercando di trovare una soluzione ... Se arrivate qui dopo aver provato tutto quanto sopra:

1 - Verifica se il tuo fornitore di tag è all'interno dell'applicazione tag

<application>

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

</application>

2 - Se provi molti percorsi senza successo, prova con questo:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <cache-path name="cache" path="." />
  <external-path name="external" path="." />

  <root-path name="root" path="." />
  <files-path name="my_images" path="/" />
  <files-path name="my_images" path="myfile/"/>
  <files-path name="files" path="." />

  <external-path name="external_files" path="." />
  <external-path name="images" path="Pictures" />
  <external-path name="my_images" path="." />
  <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures" />
  <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures/" />

  <external-files-path name="images" path="Pictures"/>
  <external-files-path name="camera_image" path="Pictures/"/>
  <external-files-path name="external_files" path="." />
  <external-files-path name="my_images" path="my_images" />

  <external-cache-path name="external_cache" path="." />

</paths>

Prova questo, se la fotocamera funziona, quindi inizia a eliminare alcune linee e continua i test ...

3 - Non dimenticare di verificare se la videocamera è attivata nell'emulatore.


1
Grazie, ha funzionato per me. È necessario rimuovere altri percorsi?
CodeSlave

22

Sono sicuro di essere in ritardo alla festa, ma di seguito ha funzionato per me.

<paths>
    <root-path name="root" path="." />
</paths>

Questo è stato l'ultimo passaggio per far funzionare anche il mio codice! Grazie.
Dog Dogma

15

Anche questo mi confonde un po '.

Il problema è nell'attributo "percorso" nel tuo file xml.

Da questo documento FileProvider 'percorso' è una sottodirectory, ma in un altro documento (videocamera / foto di base) mostrato 'percorso' è percorso completo.

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

Ho appena cambiato questo 'percorso' in percorso completo e funziona.


15

Sarei in ritardo ma ho trovato una soluzione per esso. Lavorando bene per me, ho appena cambiato il file XML dei percorsi in:

 <?xml version="1.0" encoding="utf-8"?>
<paths>
    <root-path name="root" path="." />
</paths>

1
Per me questo in provider_paths.xmldà un avviso di ispezione "Il percorso radice dell'elemento non è permesso qui".
Luis A. Florit,

15

Tieni presente che il percorso esterno non punta alla tua memoria secondaria, nota anche come "memoria rimovibile" (nonostante il nome "esterno"). Se ricevi "Impossibile trovare il root configurato" puoi aggiungere questa riga al tuo file XML.

<root-path name="root" path="." />

Vedi maggiori dettagli qui FileProvider e memoria esterna secondaria


14

Controlla quanti archivi offre il tuo dispositivo - la condivisione di file dall'archivio secondario non è supportata. Guarda l' FileProvider.javaorigine (da support-core-utils 25.3.1 ):

            } else if (TAG_EXTERNAL_FILES.equals(tag)) {
                File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
                if (externalFilesDirs.length > 0) {
                    target = externalFilesDirs[0];
                }
            } else if (TAG_EXTERNAL_CACHE.equals(tag)) {
                File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
                if (externalCacheDirs.length > 0) {
                    target = externalCacheDirs[0];
                }
            }

Quindi, prendono solo il primo spazio di archiviazione.

Inoltre, puoi vedere che getExternalCacheDirs()viene utilizzato per ottenere un elenco di archivi tramite l' ContextCompatinterfaccia. Consulta la documentazione per i suoi limiti (ad esempio viene detto di non riconoscere i flash USB). La cosa migliore è fare da soli un output di debug dell'elenco di archivi da questa API, in modo da poter verificare che il percorso di archiviazione corrisponda al percorso passato getUriForFile().

C'è già un biglietto assegnato (come per il 06-2017) nel tracker dei problemi di Google, che chiede di supportare più di un archivio. Alla fine, ho trovato anche una domanda così su questo .


1
Questa risposta approfondita dovrebbe ottenere più voti. Grazie per la ricerca di ciò che FileProvider di archiviazione esterna riconosce effettivamente.
LarsH

10

Ho trascorso 5 ore per questo ..

Ho provato tutti i metodi sopra, ma dipende da quale storeage la tua app sta attualmente utilizzando.

https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

Controllare la documentazione prima di provare i codici.

Nel mio caso, poiché la files-pathdirectory secondaria sarà Context.getFilesDir(). La cosa strana è che si Context.getFilesDir()nota l'un l'altro sottodirectory.

quello che sto cercando è

data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png

Context.getFilesDir()

ritorna /data/user/0/com.psh.mTest/files

quindi il tag dovrebbe essere

....files-path name="app_imageDir" path="../app_imageDir/" ......

Quindi funziona !!


1
Grazie per aver fatto riferimento alla documentazione. Mi ha portato alla risposta corretta. Nel mio caso il mio file è stato salvato getExternalStorageDirectory()e dovevo fornire il percorso con <external-path>tag anziché<files-path>
alierdogan7

Grazie per questa risposta specifica sul percorso dei file. Mi ha aiutato molto. :)
arungiri_10

Sì funziona!!! il punto chiave è specificare ".." all'inizio del percorso, come questo percorso = "../ myDirectory /"
Robert Apikyan,

9

Niente di tutto questo ha funzionato per me. L'unico approccio che funziona non è dichiarare un percorso esplicito in xml. Quindi fai questo e sii felice:

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

Anche qui c'è un eccellente tutorial su questa domanda: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s


7

Il mio problema era che avevo nomi sovrapposti nei percorsi dei file per diversi tipi, come questo:

<cache-path
    name="cached_files"
    path="." />
<external-cache-path
    name="cached_files"
    path="." />

Dopo aver modificato i nomi ("cached_files") per renderli univoci, mi sono liberato dell'errore. La mia ipotesi è che quei percorsi siano memorizzati in alcuni HashMap o in qualcosa che non consente duplicati.


3

Cosa ho fatto per risolvere questo -

AndroidManifest.xml

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

filepaths.xml (Consentire a FileProvider di condividere tutti i file che si trovano nella directory dei file esterni dell'app)

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

e in classe java -

Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);

3

Questo ha funzionato anche per me. Invece di dare il percorso completo ho dato path = "Immagini" e ha funzionato bene.

<?xml version="1.0" encoding="utf-8"?>
 <paths>
  <external-files-path
    name="images"
    path="Pictures">
  </external-files-path>
 </paths>

2

Dipende dal tipo di archiviazione che si desidera fare, INTERNO o ESTERNO

per STOCCAGGIO ESTERNO

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="my_images" path="my_images" />
</paths>

ma per STOCCAGGIO INTERNO, prestare attenzione al percorso, poiché utilizza il metodo getFilesDir () che significa che il file verrà posizionato nella directory principale per l'app ("/")

  File storeDir = getFilesDir(); // path "/"

Quindi il file del tuo provider deve essere così:

<paths>
    <files-path name="my_images" path="/" />
</paths>

Tutti gli esempi presuppongono che l'utente stia utilizzando una memoria esterna. Avevo bisogno di aiuto con la memoria interna e ci sono volute ore per trovare questa risposta. Grazie.
Zeeshan,

2

nessuno dei precedenti ha funzionato per me, dopo alcune ore di debug ho scoperto che il problema è createImageFile(), in particolare absolute pathvsrelative path

Suppongo che state usando la guida Android ufficiale per scattare foto. https://developer.android.com/training/camera/photobasics

    private static File createImageFile(Context context) throws IOException {
        // Create an image file name
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_" + timeStamp + "_";
        File storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = image.getAbsolutePath();
        return image;
    }

Prendi nota di storageDir, questa è la posizione in cui verrà creato il file. Quindi, per ottenere il percorso assoluto di questo file, lo uso semplicemente image.getAbsolutePath(), questo percorso verrà utilizzato onActivityResultse hai bisogno dell'immagine Bitmap dopo aver scattato la foto

sotto è il file_path.xml, semplicemente utilizzare in .modo che utilizzi il percorso assoluto

<paths>
    <external-path
        name="my_images"
        path="." />
</paths>

e se hai bisogno della bitmap dopo aver scattato la foto

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Bitmap bmp = null;
        try {
            bmp = BitmapFactory.decodeFile(mCurrentPhotoPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2

Stavo ricevendo questo errore Failed to find configured root that contains...

Il seguente lavoro risolve il mio problema

res / xml / file_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="media" path="." />
</paths>

AndroidManifest.xml

<provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="[PACKAGE_NAME]"
      android:exported="false"
      android:grantUriPermissions="true">
         <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">
         </meta-data>
</provider>

ActivityClass.java

void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,"com.slappstudio.pencilsketchphotomaker", selectedFilePath));
        startActivity(Intent.createChooser(intent,getString(R.string.string_share_with)));
    }

1

Il documento ufficiale Android dice che file_paths.xml dovrebbe avere:

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

Ma per farlo funzionare nell'ultimo Android ci dovrebbe essere un "/" alla fine del percorso, in questo modo:

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

1

La seguente modifica nel file xml file_paths ha funzionato per me.

 <external-files-path name="my_images" path="Pictures"/>
 <external-files-path name="my_movies" path="Movies"/>

1

Ho avuto lo stesso problema, ho provato il codice qui sotto per il suo funzionamento.

1.Crea file Xml: provider_paths

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="myfile/"/>
</paths>

2. File principale

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.ril.learnet.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
 </provider>

3. Nel tuo file Java.

      File file =  new File(getActivity().getFilesDir(), "myfile");
        if (!file.exists()) {
            file.mkdirs();
        }
        String  destPath = file.getPath() + File.separator + attachmentsListBean.getFileName();

               file mfile = new File(destPath);
                Uri path;
                Intent intent = new Intent(Intent.ACTION_VIEW);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                {
                    path = FileProvider.getUriForFile(AppController.getInstance().getApplicationContext(), AppController.getInstance().getApplicationContext().getPackageName() + ".provider", mfile );
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                } else {
                    path = Uri.fromFile(mfile);
                }
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setDataAndType(path, "image/*");
                    getActivity().startActivity(intent);

1

Se nulla aiuta e stai ricevendo l'errore

failed to find configured root that contains /data/data/...

quindi prova a cambiare qualche riga come:

File directory = thisActivity.getDir("images", Context.MODE_PRIVATE);

per:

File directory = new File(thisActivity.getFilesDir(), "images");

e nel file xml:

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

che è strano, dato che è la cartella a cui accedo /images.


Passare da .getDir a .getFilesDir mi ha aiutato. Grazie!
Dmitriy Pavlukhin,

1

Il mio problema era errato Nome file : creo file_paths.xmlin res / xml mentre la risorsa era impostata su provider_paths.xmlManifest:

<provider
        android:authorities="ir.aghigh.radio.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/provider_paths"/>
    </provider>

Ho cambiato provider_pathsper file_pathse problema risolto.


1

Se il percorso del tuo file è come / storage / emulato / 0 / "tuofile"

devi solo modificare il tuo FileProvider xml

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

quindi chiamare questa funzione quando è necessario condividere il file

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    Uri fileUri = FileProvider.getUriForFile(getContext(),
                            "com.example.myapp.fileprovider",
                            file);
                    sharingIntent.setType("*/*"); // any flie type
                    sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
                    startActivity(Intent.createChooser(sharingIntent, "Share file"));

funziona su Android M ~ Pie


Le sue opere! Ma puoi spiegare perché usiamo path = "." invece di path = "DCIM", "Immagini" ...?
Hoang Lam,

@Hoang Lam La differenza è se devi specificare una directory, nel mio esempio puoi accedere a tutti
pigro

0

Vedo che almeno non stai fornendo lo stesso percorso degli altri in file_paths.xml. Quindi assicurati di fornire esattamente lo stesso nome o percorso del pacchetto in 3 posti, tra cui:

  • android:authorities attributo in manifest
  • path attributo in file_paths.xml
  • authority argomento quando si chiama FileProvider.getUriForFile ().

0
  • Per utenti Xamarin.Android

Questo potrebbe anche essere il risultato del mancato aggiornamento dei pacchetti di supporto quando si utilizza Android 7.1, 8.0+. Aggiornali su v25.4.0.2 + e questo particolare errore potrebbe scomparire (dandoti che hai configurato correttamente il tuo file file_path come altri hanno affermato).


Dare contesto: sono passato al targeting di Oreo da Nougat in un'app Xamarin.Forms e a scattare una foto con Xam.Plugin.Media ha iniziato a fallire con il messaggio di errore sopra, quindi l'aggiornamento dei pacchetti ha fatto il trucco per me ok.


0

Ho notato che la politica o il comportamento relativo al path.xmlfile è cambiato tra la Support Library 26 e 27. Per acquisire un'immagine dalla fotocamera, ho visto le seguenti modifiche:

  • Con 26, ho dovuto usare <external-path>e il percorso completo indicato nella pathdiscussione.

  • Con 27, ho dovuto usare <external-files-path>e solo la sottocartella pathnell'argomento.

Quindi, ciò che ha funzionato specificamente per me con Support Library 27 come era il path.xmlfile

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="camera_image" path="Pictures/"/>
</paths>

0

Ciao amici, provate questo

In questo codice

1) Come dichiarare 2 File Provider in Manifest.

2) Primo provider per il download di file

3) secondo provider utilizzato per telecamera e gallary

PASSO 1

     <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

Provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="apks" path="." />
</paths>

Secondo fornitore

     <provider
        android:name=".Utils.MyFileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities"
        tools:ignore="InnerclassSeparator">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_path" />
    </provider>

file_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="storage/emulated/0" path="."/>
</paths>

.Utils.MyFileProvider

Crea classe MyFileProvider (solo Crea classe senza alcun metodo dichiarato)

Quando hai usato File Provider ha usato (.fileprovider) questo nome e hai usato per immagine (.provider) ha usato questo.

SE qualcuno Problemi a comprendere questo codice Puoi contattare su rp1741995@gmail.com ti aiuterò.


0

Il problema potrebbe non essere solo il percorso xml.

Di seguito è la mia correzione:

Esaminando il corso radice in android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile():

    public File getFileForUri(Uri uri) {
        String path = uri.getEncodedPath();

        final int splitIndex = path.indexOf('/', 1);
        final String tag = Uri.decode(path.substring(1, splitIndex));
        path = Uri.decode(path.substring(splitIndex + 1));

        final File root = mRoots.get(tag); // mRoots is parsed from path xml
        if (root == null) {
            throw new IllegalArgumentException("Unable to find configured root for " + uri);
        }

        // ...
    }

Questo significa che mRootsdovrebbe contenere il tag dell'uri richiesto. Quindi scrivo un po 'di codice per stampare mRootse taggare uri, e poi trovo facilmente che i tag non corrispondono .

Viene fuori che l'impostazione dell'autorità del provider ${applicationID}.providerè un'idea stupida ! Questa autorità è così comune che potrebbe essere utilizzata da altri provider, il che confonderà la configurazione del percorso!


-1

È necessario modificare il file xml file_paths.xml da

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="images/"/>
</paths>

per

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <fexeternal-path name="my_images" path="Android/data/com.example.marek.myapplication/files/Pictures"/>
</paths>

1
Sebbene tu abbia copiato la tua risposta dall'alto, non è stata eseguita correttamente. Correggi la mancata corrispondenza nella digitazione nella tua risposta.
Abhinav Saxena,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.