Italian Leggere e scrivere sull'SD reale

AlpVir

Well-Known Member
Licensed User
Longtime User
Con le vecchie versioni di Android utilizando l'istruzione
B4X:
File.MakeDir(File.DirRootExternal, GlobalCartellaApp & "/" & GlobalCartellaQuestaApp & "/ImmaginiFoto")
ero in grado di creare una cartella nell'SD (fisica, reale) presente in uno smartphone ed aggiunta successivamente all'acquisto.
Con Lollipop viceversa questa stessa istruzione crea la cartella nell'SD facente parte strettamente dello smartphone, non in quella (fisica e reale) aggiunta successivamente nell'apposito slot.
Come fare dunque per accedere, in lettura ed eventualmente anche in scrittura, a questa SD aggiuntiva ?
Forse agendo sul file manifest che riporto qui sotto ?
B4X:
AddManifestText(
<uses-sdk android:minSdkVersion="4" />
<supports-screens android:largeScreens="true"
    android:normalScreens="true"
    android:smallScreens="true"
    android:anyDensity="true"/>)
SetApplicationAttribute(android:icon, "@drawable/icon")
SetApplicationAttribute(android:label, "$LABEL$")
SetApplicationAttribute(android:theme, "@android:style/Theme.Holo.Light")
Grazie per l'attenzione.
P.S.: Già che ci sono. C'è differenza fra scrivere

File.MakeDir(File.DirRootExternal, GlobalCartellaApp & "/" & GlobalCartellaQuestaApp & "/ImmaginiFoto")
e
File.MakeDir(File.DirRootExternal & "/" & GlobalCartellaApp & "/" & GlobalCartellaQuestaApp, "ImmaginiFoto") ?
 

imgsimonebiliato

Well-Known Member
Licensed User
Longtime User
Prova ad aggiungere le permission al manifest:

B4X:
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
AddPermission(android.permission.READ_EXTERNAL_STORAGE)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Grazie dell'interessamento.
Non mi sembra di aver notato alcuna differenza derivante dall'inserimento dei 2 permessi da te indicati.
Con l'istruzione
File.MakeDir(File.DirRootExternal, "P_RootExternal")
creo la cartella "P_RootExternal" nell'SD emulata all'interno dello smartphone (/storage/emulated/0/P_RootExternal)
Con l'istruzione
File.MakeDir(File.DirDefaultExternal , "P_DefaultExternal")
non sono riuscito a vedere dove viene creata la cartella P_DefaultExternal, ma, a quando ho capito, non è certo nella SD fisica esterna da 32 GB.
 

sirjo66

Well-Known Member
Licensed User
Longtime User
io ho capito che se la scheda viene emulata all'interno dello smartphone, secondo lui è una SD esterna :(
 

AlpVir

Well-Known Member
Licensed User
Longtime User
E' la stessa cosa che ho capito io.
L'app Total Commander ad esempio distingue fra "Scheda SD" e "Scheda SD (2)"
L'app MicroSD considera solo la vera SD.
Ma come scrivere e/o leggere sulla vera SD con B4A ?
 

AlpVir

Well-Known Member
Licensed User
Longtime User
I motivi per cui da Android 4 in poi non è consentito scrivere sulla vera SD è che non si fidano dell'utente e temono che faccia pasticci. Questo è quello che ho letto, se ben ricordo.
Conoscevo il codice da te segnalato. Esso restituire, nel mio caso :
/storage/emulated/0/Android/data/alpvir.taccuino/files
/storage/MicroSD/Android/data/alpvir.taccuino/files
Memorizzando queste due righe in un array pp() ed eseguendo le seguenti 2 istruzioni
B4X:
File.MakeDir (File.DirDefaultExternal, pp(0) & "/uno") 
File.MakeDir (File.DirDefaultExternal, pp(1) & "/due")
non viene creata nella vera SD nè la cartella "uno" nè la "due", sia utilizzando File.DirDefaultExternal che File.DirRootExternal.
Le due cartelle vengono create la "uno" in /sdcard/storage/emulater/0/Android/data/alpvir.taccuino/files. e la "due" in /sdcard/storage/MicroSD/Android/data/alpvir.taccuino/files.
Non mi sembra, detto senza ironia, la stessa cosa.
Non ho ben chiaro come Android organizzi il file system e le cartelle per cui continuo a pensare di non essere in grado di accedere alla vera SD.
 

LucaMs

Expert
Licensed User
Longtime User
I motivi per cui da Android 4 in poi non è consentito scrivere sulla vera SD è che non si fidano dell'utente e temono che faccia pasticci. Questo è quello che ho letto, se ben ricordo.
Conoscevo il codice da te segnalato. Esso restituire, nel mio caso :

Memorizzando queste due righe in un array pp() ed eseguendo le seguenti 2 istruzioni
B4X:
File.MakeDir (File.DirDefaultExternal, pp(0) & "/uno")
File.MakeDir (File.DirDefaultExternal, pp(1) & "/due")
non viene creata nella vera SD nè la cartella "uno" nè la "due", sia utilizzando File.DirDefaultExternal che File.DirRootExternal.
Le due cartelle vengono create la "uno" in /sdcard/storage/emulater/0/Android/data/alpvir.taccuino/files. e la "due" in /sdcard/storage/MicroSD/Android/data/alpvir.taccuino/files.
Non mi sembra, detto senza ironia, la stessa cosa.
Non ho ben chiaro come Android organizzi il file system e le cartelle per cui continuo a pensare di non essere in grado di accedere alla vera SD.

Sbaglio o dovresti usare direttamente il contenuto di pp() anziché File.Dir....?
Non posso fare prove, non avendo schede esterne.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Una app (TwoNav) che utilizzo frequentemente prevede di leggere dei file presenti nella SD vera nella cartella MAPPEASUS. Il percorso che ho impostato in TwoNav per consentire a questa app di accedere a questa cartella è "/storage/MicroSD/MAPPEASUS/". Tutto ciò prova che è possibile perlomeno leggere la SD vera.
Difatti il codice :
B4X:
 If File.Exists("/storage/MicroSD/MAPPEASUS","Vallemaira.RMAP") Then
      Log ("Vallemaira.RMAP esiste")
   Else
         Log ("NON esiste")    
   End If
segnala che il file Vallemaira.RMAP esiste veramente. Quindi sembra proprio che bisogna indicare, nell'istruzione File.Exists, "/storage/MicroSDN/NomeCartella" in luogo di File.Dir ....
Per contro l'istruzione
B4X:
File.MakeDir ("/storage/MicroSD" , "prova")
non riesce a creare la cartella "prova".
In conclusione: sembra che sia riuscito a leggere nella SD vera ma non a scriverci.
 

maXim

Active Member
Licensed User
Longtime User

AlpVir

Well-Known Member
Licensed User
Longtime User
Come mi è stato suggerito ho inserito nel manifest
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
Adesso sono in grado di leggere, ma non di scrivere (o creare cartelle).
 

LucaMs

Expert
Licensed User
Longtime User
Quali messaggi di errore ricevi quando tenti di creare una cartella?

In un post precedente, intendevo dire di usare un path restituito dalla funzione di Erel nell'istruzione per la creazione di una nuova cartella, qualcosa tipo:

File.MakeDir(PathRestituito, "NuovaCartella").

Il punto è che il codice di Erel restituisce un elenco di percorsi, non uno solo. Tutto sta a scegliere quello giusto, a seconda di dove vuoi creare la nuova cartella.


P.S. prova così:
B4X:
Sub Activity_Create(FirstTime As Boolean)
    Dim KnownExternalPath As String = "/storage/MicroSD/Android/data/alpvir.taccuino/files"

   Dim paths() As Object = GetContext.RunMethod("getExternalFilesDirs", Array(Null))
   
    Dim Path As String
   For i = 0 To paths.Length - 1
        Path = paths(i)
       If Path.Contains(KnownExternalPath) Then
            Try
                File.MakeDir(Path, "NewFolder")
                Exit
            Catch
                Log(LastException)
            End Try
        End If
   Next

End Sub


Sub GetContext As JavaObject
  Return GetBA.GetField("context")
End Sub

Sub GetBA As JavaObject
  Dim jo As JavaObject
  Dim cls As String = Me
  cls = cls.SubString("class ".Length)
  jo.InitializeStatic(cls)
  Return jo.GetFieldJO("processBA")
End Sub
 
Last edited:

AlpVir

Well-Known Member
Licensed User
Longtime User
Avevo già fatto qualcosa del genere ed ero riuscito a creare una cartella in
"/storage/MicroSD/Android/data/alpvir.taccuino/files"
ma non in
"/storage/MicroSD"
dove interessa a me, cioè in radice della SD.
Il codice
B4X:
File.MakeDir("/storage/MicroSD", "NuovaCartella")
non crea la cartella NuovaCartella nè produce alcun errore. Come se non ci fosse.
Tuttavia la cosa non mi preoccupa in quanto al momento non è mia intenzione scrivere nell'SD ma solo leggere.
Va da se che se si trova una soluzione tutti ne saranno avvantaggiati in quanto ritengo che poter maneggiare totalmente l'SD possa essere utile.
 
Top