Italian [B4A] Importare file dalla dir di download

Aldo's

Well-Known 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

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

Well-Known 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

Well-Known 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

Well-Known 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: 231

Aldo's

Well-Known 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