Italian lisview1

Antonio Costa

Member
Licensed User
salve a tutti , mi servirebbe un saggio consiglio da parte vostra , ( premetto che non sono un programmatore di alto livello , ma questo alcuni di voi lo sanno già :p:p:p ) sto avendo un piccolo problema con un test di matematica , quando il test raggiunge il livello 15 dovrebbe apparire un panel con dei risultati tipo errori tempo ecc, se faccio il debug su bluestacks funziona tutto bene , ma se faccio il debug da cellulare mi da errori ed al livello 15 va in crash con il seguente errore , come posso correggere ?


B4X:
Error occurred on line: 116 (List)
java.io.FileNotFoundException: /storage/emulated/0/MathTest/ListResult.txt (Permission denied)

'linea 116
    'carico i dati dal file di testo
        List1 = File.ReadList(File.DirInternal, "MathTest/ListResult.txt")
 

ilan

Expert
Licensed User
Longtime User
salve a tutti , mi servirebbe un saggio consiglio da parte vostra , ( premetto che non sono un programmatore di alto livello , ma questo alcuni di voi lo sanno già :p:p:p ) sto avendo un piccolo problema con un test di matematica , quando il test raggiunge il livello 15 dovrebbe apparire un panel con dei risultati tipo errori tempo ecc, se faccio il debug su bluestacks funziona tutto bene , ma se faccio il debug da cellulare mi da errori ed al livello 15 va in crash con il seguente errore , come posso correggere ?


B4X:
Error occurred on line: 116 (List)
java.io.FileNotFoundException: /storage/emulated/0/MathTest/ListResult.txt (Permission denied)

'linea 116
    'carico i dati dal file di testo
        List1 = File.ReadList(File.DirInternal, "MathTest/ListResult.txt")

are you sure the file exists before you try to read from it?

check first if it exists with:

B4X:
If File.Exists("MathTest/ListResult.txt") Then
    List1 = File.ReadList(File.DirInternal, "MathTest/ListResult.txt")
Else
    Log("file does not exists")   
End If

my guess is that the folder you create is different maybe with small letters and not capital letters.
 

Antonio Costa

Member
Licensed User
are you sure the file exists before you try to read from it?

check first if it exists with:

B4X:
If File.Exists("MathTest/ListResult.txt") Then
    List1 = File.ReadList(File.DirInternal, "MathTest/ListResult.txt")
Else
    Log("file does not exists") 
End If

my guess is that the folder you create is different maybe with small letters and not capital letters.


mi dice che il file non esiste , ma quella riga di codice è già inserita , a continua a darmi sempre errore


B4X:
Sub RegisterResults(minutesInt As Int, secondsInt As Int , errorsInt As Int)
   
    Dim List1 As List
   
    'controllo se il file di testo esiste
    If File.Exists(File.DirRootExternal, "mathtest/ListResult.txt") Then
       
        Log("file does not exists")
       
        'seil file esiste
       
        'carico i dati dal file di testo
        List1 = File.ReadList(File.DirRootExternal, "mathtest/ListResult.txt")
       
        Dim trovato As Boolean
        trovato = False
       
        For i = 0 To 99
           
            ListResult(i) = List1.Get(i)
           
            If ListResult(i) = "0" And trovato = False Then
               
                'riempio lo slot dell'array con i valori da registrare
                ListResult(i) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
               
                'imposto la booleam in True
                trovato = True
               
               
            End If
           
           
        Next
       
       
        'se trova tutti gli slot occupati cancella il primo
        If trovato = False Then
           
            For 1 = 1 To 99
                ListResult(i-1) = ListResult(i)
            Next
        End If
       
        'salvo la array nel file di testo
        File.WriteList(File.DirRootExternal, "mathtest/ListResult.txt",ListResult)
       
    Else  'se il file non esiste
        Log("file does not exists")
        For i = 0 To 99
            ListResult(i) = "0"
        Next
           
        ListResult(99) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
       
        'creo la directory
        File.MakeDir(File.DirRootExternal, "mathtest")
       
        'salvo la array nel file di testo
        File.WriteList(File.DirRootExternal, "mathtest/ListResult.txt",ListResult)
       
       
       
    End If
   
   
   
End Sub
 

Attachments

  • Screenshot_1.png
    Screenshot_1.png
    28.4 KB · Views: 165

udg

Expert
Licensed User
Longtime User
Credo ci sia un po' di confusione.
Nel post #1 fai riferimento a File.DirInternal e a MathTest/ListResult.txt
Nel post #3 fai riferimento a File.DirRootExternal e a mathtest/ListResult.txt

Pubblica il codice che usi per scrivere il file o comunque confrontalo con quello che usi per leggerlo.
Tutto ok con i permessi per accedere a DirRootExternal (nel caso sia utilizzata)?

WriteList (Dir As String, FileName As String, List As List)

Non ho modo di provare, ma direi che il secondo parametro dovrebbe essere solo il nome del file. L'eventuale sottodirectory andrebbe in Combine con File.DirRootExternal nel primo parametro)
 
Last edited:

Antonio Costa

Member
Licensed User
Credo ci sia un po' di confusione.
Nel post #1 fai riferimento a File.DirInternal e a MathTest/ListResult.txt
Nel post #3 fai riferimento a File.DirRootExternal e a mathtest/ListResult.txt

Pubblica il codice che usi per scrivere il file o comunque confrontalo con quello che usi per leggerlo.
Tutto ok con i permessi per accedere a DirRootExternal (nel caso sia utilizzata)?


si scusami il file che uso e DirRootExternal mathtest/ListResult.txt
avevo provato a cambiare in dirInternal magari fosse quello , ma niente
 

Antonio Costa

Member
Licensed User
Credo ci sia un po' di confusione.
Nel post #1 fai riferimento a File.DirInternal e a MathTest/ListResult.txt
Nel post #3 fai riferimento a File.DirRootExternal e a mathtest/ListResult.txt

Pubblica il codice che usi per scrivere il file o comunque confrontalo con quello che usi per leggerlo.
Tutto ok con i permessi per accedere a DirRootExternal (nel caso sia utilizzata)?

WriteList (Dir As String, FileName As String, List As List)

Non ho modo di provare, ma direi che il secondo parametro dovrebe esesre solo il nome del file. L'eventuale sottodirectory andrebbe in Combine con File.FDirRootExternal nel primo parametro)


B4X:
RegisterResults(minutesInt As Int, secondsInt As Int , errorsInt As Int)
    
    Dim List1 As List
    
    'controllo se il file di testo esiste
    If File.Exists(File.DirRootExternal, "mathtest/ListResult.txt") Then
        
        Log("file does not exists")
        
        'seil file esiste
        
        'carico i dati dal file di testo
        List1 = File.ReadList(File.DirDefaultExternal, "mathtest/ListResult.txt")
        
        Dim trovato As Boolean
        trovato = False
        
        For i = 0 To 99
            
            ListResult(i) = List1.Get(i)
            
            If ListResult(i) = "0" And trovato = False Then
                
                'riempio lo slot dell'array con i valori da registrare
                ListResult(i) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
                
                'imposto la booleam in True
                trovato = True
                
                
            End If
            
            
        Next
        
        
        'se trova tutti gli slot occupati cancella il primo
        If trovato = False Then
            
            For 1 = 1 To 99
                ListResult(i-1) = ListResult(i)
            Next
        End If
        
        'salvo la array nel file di testo
        File.WriteList(File.DirRootExternal, "mathtest/ListResult.txt",ListResult)
        
    Else  'se il file non esiste
        Log("file does not exists")
        For i = 0 To 99
            ListResult(i) = "0"
        Next
            
        ListResult(99) = dayTodayString & "|" & monthTodayString & "|" & yearTodayString & "|" & minutesInt & "|" & secondsInt & "|" & errorsInt
        
        'creo la directory
        File.MakeDir(File.DirRootExternal, "mathtest")
        
        'salvo la array nel file di testo
        File.WriteList(File.DirRootExternal, "mathtest/ListResult.txt",ListResult)
        
        
        
    End If
    
    
    
End Sub


'questa invece e la lista dei risultati
Sub LoadTest
    
    'prima pulisco la listview
    ListView1.Clear
    
    'carico i dati dal file di testo
    
    'conrtrollo se il file esiste
    
    Dim List1 As List
    
    If File.Exists(File.DirRootExternal, "mathtest/ListResult.txt") Then
        Else
        Log("file does not exists")
        'carico i dati dal file di testo
        List1 = File.ReadList(File.DirRootExternal, "mathtest/ListResult.txt")
        
        Dim Bitmap1 As Bitmap
        
        For i = 0 To 99
            ListResult(i) = List1.Get(i)
            
            'creo un mini array con tutte le parti della riga esaminata
            Dim stringArray() As String = Regex.Split("\|",ListResult(i))
            
            If ListResult(i) <>"0" Then
                
                Dim lvd As ListViewData
                lvd.Initialize
                
                
                If stringArray(5) < 3 Then
                    Bitmap1.Initialize(File.DirAssets,"smile.png")
                    Else
                    Bitmap1.Initialize(File.DirAssets,"nosmile.png")
                End If
                
                
                
                lvd.FirstRow = stringArray(0) & "/" &  stringArray(1) & "/" & stringArray(2)
                
                lvd.SecondRow = "MathTest"
                lvd.Picture = Bitmap1
                
                ListView1.ScrollingBackgroundColor = Colors.Transparent
                
                ListView1.AddTwoLinesAndBitmap2(lvd.FirstRow,lvd.SecondRow,lvd.Picture, lvd)
                
                'imposto colore prima label
                ListView1.TwoLinesAndBitmap.Label.TextColor = Colors.RGB(0,0,0)
                ListView1.TwoLinesAndBitmap.SecondLabel.TextColor = Colors.RGB(254,0,0)
                
            ListView1.TwoLinesAndBitmap.ItemHeight = 80dip
            
            End If
                
                Next
            
    End If
End Sub
 

udg

Expert
Licensed User
Longtime User
quindi dovrei solo modificare il targetSDK da 26 a 27 per esempio ? in più aggiungere quel codice nella activity_create
No. Target 26 va bene e ti obbliga (da Target = 23) ad usare i permessi.

READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE

This is the most common dangerous permission. It is added automatically when you use File.DirDefaultExternal or File.DirRootExternal.
However there is a simple workaround for this.

1. Use RuntimePermissions.GetSafeDirDefaultExternal("") instead of File.DirDefaultExternal. The parameter passed is an optional subfolder that will be created under the default folder.

2. Add this code to the manifest editor:
Code:
AddManifestText(
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
)

Quindi se non hai assoluta necessità di riferirti a DirRootExternal, puoi copiare quelle poche righe nel Manifest, spuntare la libreria RuntimePermissions, ed inserire la riga
RuntimePermissions.GetSafeDirDefaultExternal("mathtest") per ricavare la dir su cui scrivere/leggere.

Se invece ti occorre proprio DirRootExternal, nel Manifest non metti nulla, in Process_Gobals metti
Private rp As RuntimePermissions
e in Activity_Create metti:
rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)

Sistemata la questione permessi, prova qualcosa del tipo:
If File.Exists(File.Combine(File.Combine(File.DirRootExternal, "mathtest"),"ListResult.txt")) Then
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Usa solo e sempre la DirInternal, per due motivi:

1) non hai bisogno di autorizzazioni da parte dell'utente;
2) i tuoi file saranno accessibili solo alla tua app (a meno che non si sia utente root)

Prova in questo modo:
B4X:
File.MakeDir(File.DirInternal, "MathTest")
Dim Dir As String = File.Combine(File.DirInternal, "MathTest")

File.WriteList(Dir, "ListResult.txt", List1)


List1 = File.ReadList(Dir, "ListResult.txt")
 

Antonio Costa

Member
Licensed User
Usa solo e sempre la DirInternal, per due motivi:

1) non hai bisogno di autorizzazioni da parte dell'utente;
2) i tuoi file saranno accessibili solo alla tua app (a meno che non si sia utente root)

Prova in questo modo:
B4X:
File.MakeDir(File.DirInternal, "MathTest")
Dim Dir As String = File.Combine(File.DirInternal, "MathTest")

File.WriteList(Dir, "ListResult.txt", List1)


List1 = File.ReadList(Dir, "ListResult.txt")
grazie , vedo cosa riesco a combinare :(
 

Antonio Costa

Member
Licensed User
No. Target 26 va bene e ti obbliga (da Target = 23) ad usare i permessi.

READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE

This is the most common dangerous permission. It is added automatically when you use File.DirDefaultExternal or File.DirRootExternal.
However there is a simple workaround for this.

1. Use RuntimePermissions.GetSafeDirDefaultExternal("") instead of File.DirDefaultExternal. The parameter passed is an optional subfolder that will be created under the default folder.

2. Add this code to the manifest editor:
Code:
AddManifestText(
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="18" />
)

Quindi se non hai assoluta necessità di riferirti a DirRootExternal, puoi copiare quelle poche righe nel Manifest, spuntare la libreria RuntimePermissions, ed inserire la riga
RuntimePermissions.GetSafeDirDefaultExternal("mathtest") per ricavare la dir su cui scrivere/leggere.

Se invece ti occorre proprio DirRootExternal, nel Manifest non metti nulla, in Process_Gobals metti
Private rp As RuntimePermissions
e in Activity_Create metti:
rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)

Sistemata la questione permessi, prova qualcosa del tipo:
If File.Exists(File.Combine(File.Combine(File.DirRootExternal, "mathtest"),"ListResult.txt")) Then

ok grazie , ci provo e vedo cosa esce anche con il consiglio di Lucas
 

udg

Expert
Licensed User
Longtime User
DirInternal è da preferire se l'app non interagisce con altre app o se i dati non devono sopravvivere alla rimozione dell'app stessa.

Il consiglio di Mario è sempre perfetto..
AKA Mario = accà sta Mario ? :) E' inutile, tanto ormai siamo abituati a chiamarti LucaMs!
AKA = Attenzione Ke Arriva (lo so che adori ke al posto di che, ti fa gggiovane..eheh)
AKA = Al Karo Amico
AKA = Ancora Karta, Amigo (quando gioca a Zynga poker..)
 
Last edited:

Antonio Costa

Member
Licensed User
ho provato ad inserire questi codici sostituendoli con quelli che avevo io , ho messo sia il codice di Lucas che il codice nel Manifest , per meno di un secondo riesco a vedere in panel con i risultati ma va cmq in crash su questa riga di codice

B4X:
        File.WriteList(Dir, "ListResult.txt", List1)
 

Attachments

  • Screenshot_2.png
    Screenshot_2.png
    10.8 KB · Views: 142
Top