Italian Il file ... non esiste !

AlpVir

Well-Known Member
Licensed User
Longtime User
Ho una app, scritta 3 o 4 anni fa (ed aggiornata ogni tanto) che presenta un grave problema.
Probabilmente solo con Android 9 l'app non riesce a scaricare da un mio sito web un file xml e salvarlo sul device. Semplicemente appare un messaggio: "il file .... non esiste".
Con Android 8 e precedenti tutto OK
La versione 3.2.1 non aveva la libreria Runtime permission e probabilmente funzionava solo con Android 6 ed inferiori.
La versione 3.2.2 ha inglobata la libreria Runtime permission e funziona con Android 8 e Android.jar uguale a C:\Android\platforms\android-28\android.jar
B4X:
Sub Activity_PermissionResult (Permission As String, Result As Boolean)
    Log("+++ ACTIVITY PERMISSION RESULT")
    LogColor("Activity_PermissionResult " & Result,Colors.Green)
    If Permission = (rp.PERMISSION_WRITE_EXTERNAL_STORAGE) Then
        If Result=False Then
            Msgbox ("Impossibile proseguire","STOP")
             Activity.Finish
            ExitApplication
        Else
            Crea(PV)  
        End If
    End If
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Log ("+++ ACTIVITY CREATE")
    If rp.Check(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) = False Then
        PV=FirstTime
        rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
        Log ("+++ HO CONCESSO I PERMESSI")
    End If
    Crea(FirstTime)
End Sub
Inutile dire che viceversa il file esiste eccome.
Quale potrebbe essere la causa di questo malfunzionamento che, come già detto, sembra accadere solo con Android 9 ?
Forse utilizzare C:\Android\platforms\android-29\android.jar ?
Grazie per l'attenzione
P.S.: L'app in questione è ORARIO SCOLASTICO
 

Sagenut

Expert
Licensed User
Longtime User
Che il problema possa essere per il modo in cui vengono richiesti i permessi?
Vedo che usi un sistema differente da quello mostrato nel video tutorial.
Però dici anche che funziona con Android 8 quindi non saprei.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
@LucaMs
Il messaggio compare nella sub JobDone

B4X:
Sub JobDone(job As HttpJob)
    Dim NomeFile     As String
If job.Success Then
        Select job.JobName
            Case "JobDownload"   
                Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, Main.FileXML, False)
                File.Copy2(job.GetInputStream, out)
                out.Close
                ...................
Else
       Select job.JobName
           Case "JobDownload"
               Msgbox ("Il file " & Main.URLProvenienza & " non esiste !","ERRORE")
               Activity.Finish
               StartActivity(Main)
.......

Il fatto che l'errore capita con Android 9 è una mia ipotesi poichè gli unici 2 casi a me noti si riferiscono appunto a smartphone con Android 9.

@Sagenut
Dovrei modificare secondo quanto mi dici la modalità di richiesta dei permessi ? All'atto dell'installazione (con Android 8; non ho la possibilità di provare con Android 9) appare il messaggio "Consentire a ORARIO SCOLASTICO di di (sic !) accedere a foto, contenuti multimediali e file sul dispositivo ? - NEGA - CONSENTI"

Aggiungo che nel manifest c'è

<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="29"/>
e
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
AddPermission(android.permission.READ_EXTERNAL_STORAGE)
 
Last edited:

sirjo66

Well-Known Member
Licensed User
Longtime User
per essere sicuro che sia un problema di permessi prova a sostituire momentaneamente File.DirRootExternal con File.DirInternal

Va in errore la riga File.OpenOutput o la File.Copy2 ???
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Potrei anche sostituire File.DirRootExternal con File.DirInternal ma non ho la possibilità di verificare che l'app nei 3 smartphone dei 3 utenti che hanno segnalato il problema (ora sono diventati 3 !) funzioni correttamente. Come già detto sembrerebbe (sembrerebbe !) che il responsabile sia Android 9; su Android 8 è tutto OK ed io posso solo sperimentare su Android 8 (e 5 e 3: vecchi smartphone)
A meno che dipenda dalla versione di B4A che proprio recentemente ho aggiornato alla 9.5.

Se interpreto bene il codice l'errore capita prima. Non in File.OpenOutput o la File.Copy2 ma prima.

B4X:
UrlX=UrlX & "/oraedt.xml"
        Main.URLProvenienza=UrlX
        Dim JobDownload As HttpJob
        JobDownload.Initialize("JobDownload", Me)
        JobDownload.Download(UrlX)

Il file esiste eccome. Eccolo :
www.liceocuneo.it/orario/oraedt.xml

Aggiungo - se serve a qualcosa - che l'app può essere installata secondo questa istruzione
#CanInstallToExternalStorage: True
Si tratta dell'app ORARIO SCOLASTICO creata per la mia ex-scuola e che viene principalmente utilizzata in questo inizio di anno scolastico. Avrei quindi piacere che il problema fosse risolto velocemente. L'app è gratuita.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Sempre tentando di risolvere il mio problema riporto qui sotto qualche elemento della mia configurazione.
a) nel manifest ho :
<uses-sdk android:minSdkVersion="4" android:targetSdkVersion="29"/>
e
AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)
AddPermission(android.permission.READ_EXTERNAL_STORAGE)

b) android.jar è nella versione 29 (l'ultima disponibile, credo)
C:\Android\platforms\android-29\android.jar
Con ciò credo di aver applicato quanto scritto in :
https://www.b4x.com/android/forum/threads/android-jar-targetsdkversion-minsdkversion.87610/

c) ho trovato questo indicazioni che forse fanno il caso mio, ma non riesco a capirle; qualcuno mi può aiutare ?
https://www.b4x.com/android/forum/threads/android-jar-targetsdkversion-minsdkversion.87610/page-2

Grazie per l'attenzione.
 

LucaMs

Expert
Licensed User
Longtime User
Sto rileggendo i vari post. Nel tuo, @AlpVir, il #4 (non ho ancora letto i successivi, magari questo lo hai già risolto), vedo che il messaggio che il file non esista sta nella parte condizionale in cui job.Success sia False. Questo fa pensare che non abbia alcuna importanza dove tu tenti di salvare il file ma che il file non venga scaricato.
 

AlpVir

Well-Known Member
Licensed User
Longtime User

LucaMs

Expert
Licensed User
Longtime User
Adesso mi è tutto chiaro... come in una notte in una zona senza lampioni e senza Luna :D:(

Mi pare di capire che da Android 9 (API 28) per connessioni non criptate (non https) siano necessari vari accorgimenti e, temo, le risposte che finora ho trovato riguardino solo chi abbia B4A 9+. Non ho né questo né un device/emulatore Android 9, quindi per il momento non posso far altro che cercare e leggere.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Neanch'io ho un device con Android 9 nè sono riuscito ad avere un emulatore di tal sistema operativo per cui ... vado a naso e mi fido di chi, forse, ha avuto il mio stesso problema e lo ha risolto. Non ho neanche la possibilità di avere un riscontro diretto che le eventuali mie modifiche sortiscono il risultato voluto.
Purtroppo il file oraedt.xml risiede, a seconda delle scuole, in vari siti e qualcuno di essi è http, qualcun'altro hpps. Bisognerebbe trovare una soluzione valida per tutto.
 

LucaMs

Expert
Licensed User
Longtime User
upload_2019-9-18_17-9-40.png


Questo "dovrebbe" risolvere; ma vedo quel Core.NetworkClearText che quasi certamente si trova appunto solo in b4a 9+ (e noi poveri arretrati? Dovrò chiedere)
 

LucaMs

Expert
Licensed User
Longtime User
Quindi quella riga, nel Manifest, dovrebbe risolverti i problemi (non so se da sola, mi pare di aver letto altro, di sfuggita, ricontrollo).

Il guaio è non poter eseguire un test, senza un device. Prova a creare un emulatore (magari GenyMotion).
 

LucaMs

Expert
Licensed User
Longtime User
Chiaramente se tu potessi fornire una comunicazione sicura (SSL-https) non avresti problemi, non dovresti modificare minimamente la tua app.
Sbagliato, dovresti fornire le "credenziali".


Sto installando l'emulatore per Google Pixel 3. 409 MB, con connessione... non trovo un aggettivo non volgare :D, ergo tra un paio d'ore forse sarà pronto.
 
Top