Italian FileProvider leggere file da app esterna

GaNdAlF89

Active Member
Licensed User
Ciao a tutti!
Ho un problema: ho due app, ed ho bisogno che la prima legga un file che è stato scaricato dalla seconda. Come faccio a settare il FileProvider della prima app per poter leggere su una directory della seconda app? Grazie mille

Il file si trova in questa cartella della seconda app:
B4X:
RuntimePermissions.GetSafeDirDefaultExternal("") + "/dwl/files"

Ecco il manifest della prima app:
B4X:
AddApplicationText(<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="$PACKAGE$.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/fileprovider_paths"/>
</provider>)

CreateResource(xml,fileprovider_paths,
<paths>
    <external-files-path
        name="apk_update"
        path="/dwl/files/"/> 'seconda app
</paths>)
 

Star-Dust

Expert
Licensed User
 

GaNdAlF89

Active Member
Licensed User

Grazie, ma non capisco come configurare il seguente:
B4X:
CreateResource(xml,fileprovider_paths,
<paths>
    <external-files-path
        name="apk_update"
        path="/dwl/files/"/> 'seconda app
</paths>)
in "path" va il path condiviso, ma relativo alla directory dell'app corrente?
 

Star-Dust

Expert
Licensed User
B4X:
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)
files-path = File.DirInternal
 

LucaMs

Expert
Licensed User
Il file si trova in questa cartella della seconda app:
RuntimePermissions.GetSafeDirDefaultExternal("") + "/dwl/files"
Dovrebbe funzionare anche così:
B4X:
RuntimePermissions.GetSafeDirDefaultExternal("dwl/files")


Grazie, ma non capisco come configurare il seguente:
Quella parte va lasciata come l'originale di Erel.


Il problema è che usando quella classe non saprai apriori se verrà usata la DirInternal o la "default external"; ecco il motivo (inizializzazione di quella classe):
B4X:
Public Sub Initialize
    Dim p As Phone
    If p.SdkVersion >= 24 Or File.ExternalWritable = False Then
        UseFileProvider = True
        SharedFolder = File.Combine(File.DirInternal, "shared")
        File.MakeDir("", SharedFolder)
    Else
        UseFileProvider = False
        SharedFolder = rp.GetSafeDirDefaultExternal("shared")
    End If
    Log($"Using FileProvider? ${UseFileProvider}"$)
End Sub
Verrà usata la DirInternal nel caso in cui l'app girasse su versioni Android SDK superiori alla 23 o non ci sia la possibilità di scrivere su memoria "esterna".
 

GaNdAlF89

Active Member
Licensed User
Grazie per la risposta.

Per togliermi ogni dubbio, ho voluto fare una prova:
dal momento che in entrambe le app io utilizzo la classe FileProvider per leggere il path, sono sicuro del fatto che
B4X:
RuntimePermissions.GetSafeDirDefaultExternal("")
in entrambi i casi restituisce un path che, tra le due app, differesce solo per il package name di ognuna. Quindi ho provato a fare un semplice replace, nel path restituito dalla prima app, con il package name della seconda app (quello da cui voglio leggere), e in questo modo dalla prima app riesco benissimo ad ottenere il file che si trova nella directory della seconda app.

Nel Manifest ho aggiunto questo:
B4X:
CreateResource(xml,fileprovider_paths,
<paths>
    <external-path name="name" path=""/>
</paths>)


In teoria non dovrebbe funzionare, ma se qualcuno sa spiegarmi il perchè... 😁
 

GaNdAlF89

Active Member
Licensed User
Faccio già tanta fatica per cercare di capire quando le cose non funzionano, non consumo uno dei miei due neuroni rimasti indagare perché, invece, funzionino 😄
Figurati 😅 E' per capire se è un puro caso (...e quale!) oppure se è normale che funzioni ma semplicemente non ho capito io...
 

LucaMs

Expert
Licensed User
Oh, bevuto un caffè (che ancora non è nemmeno arrivato in fondo allo stomaco).

L'originale di Erel è:
B4X:
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)
ma quella sottocartella "shared" ha voluto crearla lui, per... <lunga, ometto>.

Dovrebbe funzionarti anche lasciandola (in entrambe le app, però).
 
Top