Italian [B4A] Importare file dalla dir di download

Aldo's

Active Member
Licensed User
Ciao a tutti.
Io dovrei importare all'interno dell'app uno o più file (di cui non conosco il nome) presenti sulla cartella download.
Qualche domanda:
1) esiste un modo per puntare a quella cartella?
2) si può creare una lista o un'array dei file presenti sulla cartella che rispondono a determinate caratteristiche? (es. *.pdf)
Grazie a tutti
 

LucaMs

Expert
Licensed User
Longtime User
Un minuto fa ho posto la domanda a ChatGPT

Con Android 11 e versioni successive, l'approccio descritto nel 2020 (usare File.Combine(File.DirRootExternal, "Download") con il flag legacy e le autorizzazioni di scrittura) non è più affidabile.

Cosa è cambiato:

- Scoped Storage: Android 11 introduce restrizioni più severe sull'accesso diretto ai file nelle cartelle esterne, inclusa la cartella Download. Questo significa che non puoi più accedere liberamente a tale cartella con i metodi tradizionali.

- Uso del SAF o MediaStore: Per gestire file nella cartella Download, dovrai utilizzare il [Storage Access Framework (SAF)](https://developer.android.com/guide/topics/providers/document-provider) oppure l'API MediaStore, che richiedono l'interazione con un'interfaccia di sistema per selezionare file o ottenere permessi specifici.

- Permesso MANAGE_EXTERNAL_STORAGE: In alcuni casi, per applicazioni che necessitano un accesso molto esteso ai file, esiste il permesso MANAGE_EXTERNAL_STORAGE. Tuttavia, questo permesso è soggetto a restrizioni più severe (e richiede una giustificazione convincente per il Play Store) ed è pensato per applicazioni particolari come i file manager.


In sintesi:
Se sviluppi un'app B4A oggi e la tua app deve funzionare su dispositivi con Android 11 o superiore, non puoi più fare affidamento sul vecchio metodo per accedere direttamente alla cartella Download. Dovrai implementare soluzioni basate su SAF o MediaStore, oppure (con le dovute attenzioni) usare MANAGE_EXTERNAL_STORAGE se il tuo caso d'uso lo giustifica.

Quindi, la risposta è: non in modo diretto come in passato; occorre adottare le nuove modalità previste dal sistema operativo.
 

Aldo's

Active Member
Licensed User
Con Android 11 e versioni successive, l'approccio descritto nel 2020 (usare File.Combine(File.DirRootExternal, "Download") con il flag legacy e le autorizzazioni di scrittura) non è più affidabile.

Cosa è cambiato:

- Scoped Storage: Android 11 introduce restrizioni più severe sull'accesso diretto ai file nelle cartelle esterne, inclusa la cartella Download. Questo significa che non puoi più accedere liberamente a tale cartella con i metodi tradizionali.

- Uso del SAF o MediaStore: Per gestire file nella cartella Download, dovrai utilizzare il [Storage Access Framework (SAF)](https://developer.android.com/guide/topics/providers/document-provider) oppure l'API MediaStore, che richiedono l'interazione con un'interfaccia di sistema per selezionare file o ottenere permessi specifici.

- Permesso MANAGE_EXTERNAL_STORAGE: In alcuni casi, per applicazioni che necessitano un accesso molto esteso ai file, esiste il permesso MANAGE_EXTERNAL_STORAGE. Tuttavia, questo permesso è soggetto a restrizioni più severe (e richiede una giustificazione convincente per il Play Store) ed è pensato per applicazioni particolari come i file manager.


In sintesi:
Se sviluppi un'app B4A oggi e la tua app deve funzionare su dispositivi con Android 11 o superiore, non puoi più fare affidamento sul vecchio metodo per accedere direttamente alla cartella Download. Dovrai implementare soluzioni basate su SAF o MediaStore, oppure (con le dovute attenzioni) usare MANAGE_EXTERNAL_STORAGE se il tuo caso d'uso lo giustifica.

Quindi, la risposta è: non in modo diretto come in passato; occorre adottare le nuove modalità previste dal sistema operativo.
Se ho capito bene, usando il metodo SAF proposto nel post sotto a quello che hai postato nel threds che hai linkato prima, si può riuscire...altrimenti ciccia.
 

Aldo's

Active Member
Licensed User
Sto facendo un po' di prove (mettendo tutto in B4XPages).
Ho scritto:
B4X:
#Region Shared Files
#CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files"
'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True
#End Region

'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip

Sub Class_Globals
    Private Root As B4XView
    Private xui As XUI
    
    Private staractivityforresult As StartActivityForResult
    Dim rp As RuntimePermissions
    
    Private lblPath As B4XView
End Sub

Public Sub Initialize
'    B4XPages.GetManager.LogEvents = True
End Sub

'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    lblPath.as(Label).Text = "Seleziona una cartella"
End Sub

Private Sub B4XPage_Appear
    Dim jo As JavaObject
    jo = Me
    Dim uri As Object = jo.RunMethod("getSelectedUri", Null)
    If uri <> Null Then
        lblPath.as(Label).Text = "Cartella selezionata: " & uri
    End If
End Sub

Private Sub Button1_Click
    Dim intent As Intent
    intent.Initialize("android.intent.action.OPEN_DOCUMENT_TREE", "")
    StartActivityForResult(intent)
End Sub

#If JAVA
    import android.content.Intent;
    import android.net.Uri;
    
    public static Uri selectedUri;
    
    public static void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == 42 && resultCode == -1) {
            selectedUri = data.getData();
        }
    }
    
    public Object getSelectedUri() {
        return selectedUri;
    }
#End If

La finestra logs mi genera questi errori:
B4XMainPage - 41: Use of undeclared array: startactivityforresult
B4XMainPage - 12: Alla variabile 'staractivityforresult' non è stato mai assegnato alcun valore. (warning #10)
B4XMainPage - 13: Alla variabile 'rp' non è stato mai assegnato alcun valore. (warning #10)

Quindi non posso neanche provare un debug.
Qualche suggerimento?
 

Aldo's

Active Member
Licensed User
Allego un file zip con un progetto che potrebbe funzionare.
Volete darci un'occhiata?
Grazie
 

Attachments

  • ProvaDirDownload.zip
    10.5 KB · Views: 1

Aldo's

Active Member
Licensed User
Adesso, per andare avanti dovrei capire come fare ad importare un file con definizione URI in una cartella (File.DirInternal) e con un determinato nome.
Tenete conto che mi restituisci i seguenti valori:
Dir: ContentDir
FileName: content://com.android.externalstorage.documents/document/C06059376059357E%3AGCH%20-%20SANREMO%20-%2025%20APRILE%2FGCH%20-%20Si%20fa%20presto%20a%20dire%20angelo%20-%2025.04%20(ARMA%20DI%20TAGGIA).pdf
 
Last edited:
Top