Italian Richiesta permessi runtime

GaNdAlF89

Active Member
Licensed User
I Wait For servono proprio ad attendere il completamento di una Sub senza bloccare l'app per evitare che vada in errore di "App Not Responding".
Se la chiamata ad una Sub esterna fosse stata già bloccante non ci sarebbe stato bisogno di inventare il Wait For. ;)
Chiaro, grazie ;)

Activity_Create chiama la Check_Permissions.....e deve essere fatta con un Wait For se vuoi che attenda il risultato di questa prima di proseguire.
A sua volta la Check_Permissions deve fare diverse cose e ha dei Wait For per eseguirle una alla volta.
Tutto il mio dubbio sta nella Resumabilità in cascata 😅
Nel senso, il mio flusso è Activity_Create -> Check_Permissions ->Request_Permissions. Inizialmente ho una Wait For dentro Request_Permissions per attendere l'interazione dell'utente, quindi dentro Check_Permissions ho messo una Wait For (Request_Permissions) Complete, il che, pensavo, bastasse. Invece fatto questo mi diventa Resumable anche
Check_Permissions, e quindi dovrei mettere una Wait For Complete anche su questa, dentro la sub che la chiama.
Praticamente mi diventa resumable qualsiasi cosa. Io invece pensavo, ignorantemente, che bastasse solo nel diretto chiamante...
 

GaNdAlF89

Active Member
Licensed User
Giusto. La versione con Complete(...) si deve usare quanto la routine mandata in esecuzione contenga a sua volta uno o più Sleep o Wait For, ovvero sia una routine di "tipo resumable".
Chiaro, ma mettendo la versione con Complete fa diventare comunque Resumable la sub stessa, quindi il problema si sposta nel "passo" più indietro, e così via
 

GaNdAlF89

Active Member
Licensed User
Anzi, mettere un Wait For (Complete o no) nell'Activity_Create consente l'esecuzione della Resume PRIMA che la Create stessa venga completata.

All'interno della Create, meglio usare una CallSubDelayed che mandi in esecuzione la routine di tipo resumable (ovvero contenga Sleep o Wait) e che vada eseguita prima dell'esecuzione della Resume.
In realtà era così:
B4X:
Sub Activity_Create (FirstTime As Boolean)
    
    Activity_Start(FirstTime)
    
End Sub

Sub Activity_Start (FirstTime As Boolean) 'ho creato il mio start
    
    Check_Permissions
    '...
End Sub
A questo punto in Activity_Create mi conviene chiamare Activity_Start tramite CallSubDelayed?
 

LucaMs

Expert
Licensed User
Chiaro, ma mettendo la versione con Complete fa diventare comunque Resumable la sub stessa, quindi il problema si sposta nel "passo" più indietro, e così via
No, una routine "diventa una resumable" nel momento in cui, al suo interno, scrivi una delle due istruzioni: Sleep o Wait For, tanto è vero che compare un simbolo che lo indica, alla fine della sua definizione.

Resumable significa: una routine nella quale si tornerà automaticamente, diciamo.

La "clausola" Complete è necessaria per attendere il completamento di una routine che NON sia una normale routine ma una "routine resumable", ovvero che abbia al proprio interno Sleep o Wait For.

Esempio:
B4X:
Wait For (DeveEssereEseguitaTutta) Complete(NomeVariabileQualunque As Boolean)
' le istruzioni scritte da qui in poi saranno eseguite solo al completamento della routine DeveEssereEseguitaTutta


Sub DeveEssereEseguitaTutta As Resumable ' <--- Questo non significa che la routine è una Resumable, anche se lo è, è soltanto per farla diventare una funzione, ovvero una routine che restituisce un valore

' alcune istruzioni qui
Wait For Qualcosa
' altre istruzioni qui
Sleep(200)
' altre istruzioni qui
Wait For AltraRoutine

Return True ' o false, non ha importanza
End Sub

Sub Qualcosa
'
End Sub

Sub AltraRoutine
'
End Sub
 
Last edited:

LucaMs

Expert
Licensed User
A questo punto in Activity_Create mi conviene chiamare Activity_Start tramite CallSubDelayed?
Ripetendo che sarebbe MOLTO meglio usare le B4XPages e dimenticare che l'Activity Main esista...

B4X:
Sub Activity_Start (FirstTime As Boolean) 'ho creato il mio start
   
   CallSubDelayed(Me, "Check_Permissions")
End Sub
 

GaNdAlF89

Active Member
Licensed User
No, una routine "diventa una resumable" nel momento in cui, al suo interno, scrivi una delle due istruzioni: Sleep o Wait For, tanto è vero che compare un simbolo che lo indica, alla fine della sua definizione.
Chiaro, quindi mettendo questo:
B4X:
Wait For (DeveEssereEseguitaTutta) Complete(NomeVariabileQualunque As Boolean)
' le istruzioni scritte da qui in poi saranno eseguite solo al completamento della routine DeveEssereEseguitaTutta
End Sub
... diventa Resumable anche la Sub in cui si trova la Wait For (DeveEssereEseguitaTutta) Complete. E se questa Sub a sua volta viene chiamata (l'equivalente della mia Check_Permissions), si deve mettere una Wait For-Complete anche su questa Sub. E' questo ciò che ho capito da quanto dite, sbaglio?
 

GaNdAlF89

Active Member
Licensed User
Hai capito perfettamente.
Perfetto, mi fa piacere il fatto di aver chiara la logica, ma un po' meno tutto ciò che comporta 😅
Pensavo che il flusso passasse solo alla sub chiamante e bastasse mettere una Complete in questa, per renderla bloccante. Vi ringrazio per tutti i chiarimenti e i preziosi consigli che mi avete dato, purtroppo si tratta di un vecchissimo progetto, dove molte sub sono in comune (da cui i Wait For in "cascata", come dicevo in precedenza), e motivo per cui non mi viene facile ragionare con le B4XPages (anche perchè mi dovrei documentare su di esse, non le conosco bene). Pazienza, a poco a poco ci riuscirò 😁

Grazie ancora a tutti, vi voglio "informaticamente" bene! 😆
 

nonno

Active Member
Licensed User
Mi sembra una complicazione non necessaria.
Per richiedere più permessi puoi fare così:
Ciao continuo a provare il tuo esempi , dovrei attivare i permessi della camera, ho modificato l'array l'app continua bloccarsi, ho provato ad aggiungere i permessi nei manifest , nulla da fare potresti darmi qualche consiglio ?

For Each permission As String In Array(rp.PERMISSION_CAMERA)
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="29"/>
 

LucaMs

Expert
Licensed User
Ciao continuo a provare il tuo esempi , dovrei attivare i permessi della camera, ho modificato l'array l'app continua bloccarsi, ho provato ad aggiungere i permessi nei manifest , nulla da fare potresti darmi qualche consiglio ?

For Each permission As String In Array(rp.PERMISSION_CAMERA)
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="29"/>
Non è che per caso stai usando le B4XPages? In questo caso il Wait For dovrebbe essere:
B4X:
 Wait For B4XPage_PermissionResult (permission As String, Result As Boolean)
[Nota che se il permesso è uno solo, non serve che tu metta un array, basterebbe rp.CheckAndRequest(rp.PERMISSION_CAMERA)]
 

nonno

Active Member
Licensed User
Non è che per caso stai usando le B4XPages? In questo caso il Wait For dovrebbe essere:
B4X:
 Wait For B4XPage_PermissionResult (permission As String, Result As Boolean)
[Nota che se il permesso è uno solo, non serve che tu metta un array, basterebbe rp.CheckAndRequest(rp.PERMISSION_CAMERA)]
Grazie Luca si uso B4xPages appena rientro provo
 

nonno

Active Member
Licensed User
Ciao, ho fatto molte prove e guardato diversi post senza riuscire ad attivare i permessi, ho letto post di Erel il quale scrive che i permessi devono essere inserite nei manifest e poi richiamati nel codice, niente da fare .
allego un progetto di erel che usa la camera, vorrei capire dove sbaglio.
 

Attachments

LucaMs

Expert
Licensed User
Ciao, ho fatto molte prove e guardato diversi post senza riuscire ad attivare i permessi, ho letto post di Erel il quale scrive che i permessi devono essere inserite nei manifest e poi richiamati nel codice, niente da fare .
allego un progetto di erel che usa la camera, vorrei capire dove sbaglio.
Esporta il progetto facendo click sulla riga di commento:

'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip

altrimenti mancano dei file.
 

LucaMs

Expert
Licensed User
ma la vedo dura
Non ho potuto avviare il progetto per il motivo di cui al mio post preDecente, ma probabilmente già così dovrebbe funzionare:
B4X:
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
    toast.Initialize(Root)
    
    rp.CheckAndRequest(rp.PERMISSION_CAMERA)
    Wait For B4XPage_PermissionResult (permission As String, Result As Boolean)
    If Result Then
        B4XPages.SetTitle(Me," ok Permessi")
    Else
        B4XPages.SetTitle(Me,"nessun permesso")
    End If

        
    StopCamera
    B4XPages.SetTitle(Me, "-----")
    #if B4A
    CreateDetector (Array("CODE_128", "CODE_93", "QR_CODE"))
    #Else if B4i
    scanner.Initialize2("scanner", pnlPreview, Array(scanner.TYPE_93, scanner.TYPE_128, scanner.TYPE_QR))
    Wait For Scanner_Ready (Success As Boolean)
    If Success = False Then
        btnStartStop.Enabled = False
        toast.Show("Failed to initialize the scanner.")
    End If
    #end if   
    
End Sub
 

LucaMs

Expert
Licensed User
Potresti mettere la richiesta del permesso anche (invece che nella B4XPage_Created) qui:
B4X:
Sub btnStartStop_Click
    If Capturing = False Then
        rp.CheckAndRequest(rp.PERMISSION_CAMERA)
        Wait For B4XPage_PermissionResult (permission As String, Result As Boolean)
        If Result Then
            B4XPages.SetTitle(Me," ok Permessi")
            StartCamera
        Else
            B4XPages.SetTitle(Me,"nessun permesso")
        End If
    Else
        StopCamera
    End If
End Sub
ovvero nel momento in cui l'utente dovrebbe usare la camera. Ovviamente una volta che lo abbia concesso, non gli verrà chiesto di nuovo, la cosa verrà automaticamente "bypassata".
 

nonno

Active Member
Licensed User
☹
Esporta il progetto facendo click sulla riga di commento:

'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip
Scusa Luca forse il caldo delle colline, l'umidità del lago o la cena no digerita ma non ho capito
 

LucaMs

Expert
Licensed User
☹
Scusa Luca forse il caldo delle colline, l'umidità del lago o la cena no digerita ma non ho capito
Come "zippi" il progetto per allegarlo qui? Quando è un progetto B4XPages, per farlo devi fare click su quella riga di commento, nel progetto, tenendo premuto il tasto CTRL della tastiera.
La riga di commento sta nella B4XMainPage.
Clipboard02.jpg


Comunque, se prendi quella routine Sub btnStartStop_Click scritta nel post #37 e togli le altre righe nella B4XPage_Created (quelle relative al permesso) già dovrebbe funzionare.
 
Top