Italian HELP TextWriter non funziona su android 14

sirjo66

Well-Known Member
Licensed User
Longtime User
La cartella File.DirInternal non hai nessuna possibilità di vederla, la può vedere solo la tua app, ecco perchè da "fuori" non la vedi mentre il comando File.Exists ti dà true

Come ti hanno già consigliato devi salvare sulla cartella RP.GetSafeDirDefaultExternal("")
Poi, se colleghi il cellulare tramite cavo USB ad un PC windows, puoi tranquillamente navigare su questa cartella e vedere i tuoi files
(la trovi su /Android/data/nomeDellApp/files)

Da una certa versione di Android in poi (non mi ricordo esattamente ma mi sembra dalla 12), è stato limitato l'accesso a questa cartella, per cui i normali programmi non ci accedono più.
Ad esempio sul mio SAMSUNG con Android 12, se utilizzo il programma "archivio" (di samsung) non riesco più a vedere le cartelle dentro a "/Android/data", per cui ti consiglio di installare il programma X-plore che ti dà accesso a tutto e quindi puoi vederli (ma non ovviamente alla File.DirInternal)

https://play.google.com/store/search?q=x-plore&c=apps&hl=it
 

Xfood

Expert
Licensed User
allora, ho provato il save as come suggerito da erel
funziona, ma purtroppo mi sono imbattuto con questo problema

e cioe' se il file esiste fa una copia tipo se esiste ordine.out fa una copia ordine(1).out e cosi via,
a meno che l'utente non deve selezionare sempre il file con un longclick
la soluzione che ho trovato e sembra ottima e' questa

creo una cartella nel dispositivo dentro download, ad esempio file, e poi la prima volta che lanci il programma selezioni quella cartella, gli dai i permessi
e da quel momento in poi il terminale salva dentro quella cartella, ( chiaramente con il codice allegato nel post che ho linkato)
se esiste lo sovrascrive senza chiedere nulla
 

Xfood

Expert
Licensed User
adesso mi rimane l'ultima cosa da gestire che non trovo nella procedura che ho deciso di adottare,

e cioe' una volta selezionata la carte, il programma si ricorda della selezione ed ogni volta scrive senza piu chiedere nulla,
ma se voglio sapere da codice qual'e' la cartella selezionata, come faccio?
 

Xfood

Expert
Licensed User
ci sono molto vicino,
come posso estrarre la path completa da questa stringa
content://com.android.externalstorage.documents/tree/primary%3ADownload%2FDespar
dovrebbe essere /sdcard/Download/Despar
 

LucaMs

Expert
Licensed User
Longtime User
Eh, ma se quell'app può vedere tutti i file, anche le nostre, con le giuste istruzioni, dovrebbero poterlo fare.
 

LucaMs

Expert
Licensed User
Longtime User
Sto chiacchierando (!) con ChatGPT. Ancora non ho letto la parte "finale" (ammesso che lo sia).



Ha elencato un po' di passaggi necessari; a quel punto gli ho scritto:



Lo ha fatto, ma usando soltanto RuntimePermissions e generato un'app che non accederebbe ai file privati delle altre app, per cui gli ho scritto:








(leggo il resto e valuto se possa funzionare e valga la pena continuare a scrivere questo già fin troppo lungo post)
 

LucaMs

Expert
Licensed User
Longtime User
(... segue dal post precedente)

Codice di esempio usando SAF per selezionare una directory:
B4X:
Sub Process_Globals
    Dim rp As RuntimePermissions
End Sub

Sub Globals
    Private lblPath As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("MainLayout")
    lblPath.Text = "Seleziona una cartella"
End Sub

Sub Activity_Resume
    ' Gestione del risultato di SAF quando l'utente seleziona una cartella
    Dim jo As JavaObject
    jo = Me
    Dim uri As Object = jo.RunMethod("getSelectedUri", Null)
    If uri <> Null Then
        lblPath.Text = "Cartella selezionata: " & uri
    End If
End Sub

Sub btnSelectFolder_Click
    ' Chiamata a SAF per selezionare una cartella
    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



 

Xfood

Expert
Licensed User
ci sono molto vicino,
come posso estrarre la path completa da questa stringa
content://com.android.externalstorage.documents/tree/primary%3ADownload%2FDespar
dovrebbe essere /sdcard/Download/Despar
Grazie @LucaMs sono riuscito a gestire quello che mi serve con la classe externastorage che ho lincato sopra, per completare la mia personalizzazione mi servirebbe estrarre da questa stringa uri, il path completo ed in chiaro,
Qualche idea?
content://com.android.externalstorage.documents/tree/primary%3ADownload%2FDespar
dovrebbe essere /sdcard/Download/Despar
 

sirjo66

Well-Known Member
Licensed User
Longtime User
Ora... @sirjo66, X-plore ha accesso alle dir private delle altre app, anche se il dispositivo non è "rootato"?

Sì, confermo che il mio device non è "rootato", ho semplicemente installato l'app e vedo tutte le cartelle delle altre app

Ad esempio eccoti lo screenshot dove si vede la cartella dell'app "Airdroid"

 

Xfood

Expert
Licensed User
Intendi dire semplicemente usando Regex?

Anche con IndexOf e SubString sarebbe facile, ma temo che la tua domanda sia diversa.
La cosa che mi piacerebbe, e' riadattare questo vecchio codice di Erel , per la nuove versioni di android 14,b4a 13 perché adesso da errore di compilazione
 

LucaMs

Expert
Licensed User
Longtime User
Dovresti sempre pubblicare il messaggio d'errore, altrimenti come possiamo sperare di capire?

Fai una prova, "dillo" a ChatGPT, fornendogli sia il messaggio d'errore che quel sorgente in-line java.
 

Xfood

Expert
Licensed User
Hai ragione @LucaMs ,
Appena accendo il PC metto il log esatto di errore,
In pratica durante la compilazione da errore
android.annotation deprecato
E non compila il progetto
 

Xfood

Expert
Licensed User
errore durante la compilazione e questo

Compilazione del codice Java prodotto. Error
src\fqgr\Pdt\externalstorage.java:16: error: package android.support.annotation does not exist
import android.support.annotation.NonNull;
^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
1 error
only showing the first 1 errors, of 7 total; use -Xmaxerrs if you would like to see more

javac 14.0.1
 

Xfood

Expert
Licensed User
per il momento credo di aver risolto,
ho visto che molti hanno avuto il mio stesso problema, ma che non e' stato aggiornato il codice inline,
ma questo codice anche se non e' il massimo, sembra funzionare ( per adesso)
codice preso da qui


B4X:
Sub GetPath(uristring As String) As String
    Dim Const storage_const As String ="content://com.android.externalstorage.documents/tree/primary"
    
    If uristring.Contains(storage_const) Then
        Dim tmp As String = uristring.SubString(storage_const.Length) 'видираємо рядок для декодування
        Dim su As StringUtils
        tmp = su.DecodeUrl(tmp,"UTF8")
        tmp = tmp.Replace(":","/")
        uristring="/storage" & tmp
        Log ("Extracted path is: "& uristring)
        Return uristring
    Else
        Return ""
    End If
End Sub
 

Xfood

Expert
Licensed User
salve, purtroppo non ho risolto con questa funzione,
in u'altro terminale sempre la stessa app mi da questo :
content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FDespar
e dovrebbe retituirmi : /storage/emulate/0/Dounload/Despar

mentre questo risultato: content://com.android.externalstorage.documents/tree/primary%3ADownload%2FDespar
dovrebbe restiruire: /storage/Download/Despar

qualche idea per estrarre il percorso reale?
 

Xfood

Expert
Licensed User
non funziona, va addirittura in errore
B4X:
b4xmainpage_getpathfromcontentresult (java line: 1887)
java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FDespar
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167)
    at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
    at android.content.ContentProviderProxy.query(ContentProviderNative.java:418)
    at android.content.ContentResolver.query(ContentResolver.java:802)
    at android.content.ContentResolver.query(ContentResolver.java:752)
    at android.content.ContentResolver.query(ContentResolver.java:710)
    at anywheresoftware.b4a.objects.ContentResolverWrapper.Query(ContentResolverWrapper.java:49)
    at fqgr.Pdt.b4xmainpage._getpathfromcontentresult(b4xmainpage.java:1887)
    at fqgr.Pdt.b4xmainpage$ResumableSub_B4XPage_Created.resume(b4xmainpage.java:381)
    at anywheresoftware.b4a.BA.checkAndRunWaitForEvent(BA.java:275)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:215)
    at anywheresoftware.b4a.keywords.Common$12.run(Common.java:1212)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
java.lang.UnsupportedOperationException: Unsupported Uri content://com.android.providers.downloads.documents/tree/raw%3A%2Fstorage%2Femulated%2F0%2FDownload%2FDespar
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…