Italian FileProvider leggere file da app esterna

GaNdAlF89

Active Member
Licensed User
Longtime 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
Longtime User
 

GaNdAlF89

Active Member
Licensed User
Longtime 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
Longtime User
B4X:
CreateResource(xml, provider_paths,
   <files-path name="name" path="shared" />
)
files-path = File.DirInternal
 

LucaMs

Expert
Licensed User
Longtime 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
Longtime 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
Longtime 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...
 

GaNdAlF89

Active Member
Licensed User
Longtime User
Forse tra un paio di caffè tenterò di leggere meglio e capire (sperando che nel frattempo qualcuno lo faccia prima di me e ce lo spieghi 😄)
Non preoccuparti, intanto visto che funziona può essere utile a qualcuno ;)
 

LucaMs

Expert
Licensed User
Longtime 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