Italian Problema con CheckPermission

AlpVir

Well-Known Member
Licensed User
Longtime User
Alla fine di Activity_Create ho :

B4X:
''    ---
    LogColor("Permessi ...",Colors.Blue)
    Wait For (CheckPermissions) Complete (Success As Boolean)
    If Success = False Then
        Msgbox2Async("Bisogna concedere alcuni permessi per poter installare l'app", "INSTALLAZIONE INTERROTTA", "OK", "", "", Null, False)
        Wait For Msgbox_Result (Result As Int)
        ExitApplication
    End If
End Sub

E questa è la sub sopra menzionata :

B4X:
Sub CheckPermissions As ResumableSub
    Dim xxx As Int
    xxx=0
    For Each permission As String In Array(rp.PERMISSION_READ_CONTACTS,rp.PERMISSION_ACCESS_FINE_LOCATION,rp.PERMISSION_WRITE_EXTERNAL_STORAGE,rp.PERMISSION_CAMERA,rp.PERMISSION_RECORD_AUDIO,rp.PERMISSION_RECEIVE_SMS,rp.PERMISSION_SEND_SMS)
        xxx=xxx+1
        Log("Sub CheckPermissions XXX=" & xxx)
        rp.CheckAndRequest(permission)
       '  Wait For Activity_Permission
        Wait For Activity_PermissionResult (permission As String, Result As Boolean)
        If Result = False Then Return False
    Next
    Return True
End Sub

Premettendo che non utilizzo le B4XPages i problemi sono essenzialmente due
1) in modalità debug tutto è ok
2) in modalità release appare, in certe condizioni, un errore (qui riportato sinteticissimamente)

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' on a null object reference

Inoltre il log riporta unicamente :
Sub CheckPermissions XXX=1
mentre dovrebbe riportare, se non erro :
Sub CheckPermissions XXX=1
Sub CheckPermissions XXX=2
Sub CheckPermissions XXX=3
ecc. ecc.
Aggiungo che compilando per la prima volta l'app appaiono solo 2 dei messaggi di Google che chiedono di autorizzare l'installazione dell'app e precisamente quello che chiede di "accedere alla posizione" e quello che chiede di "accedere ai contatti".
Avviando l'app per la seconda volta appare l'errore.
Ricompilando nuovamente l'app l'errore non compare più.
E' forse sbagliata la posizione in cui richiamo la sub CheckPermissions ?

Dove agire per rimediare al malfunzionamento ?
Grazie per l'attenzione.
 

LucaMs

Expert
Licensed User
Longtime User
Dove agire per rimediare al malfunzionamento ?
Credo che il problema sia avere un "Wait For" nella routine-evento Activity_Create.
In quest'ultima, scrivi qualcosa come:

B4X:
If FirstTime Then
    CallSubDelayed(Me, "RichiediPermesso")
End If
e sposta il codice che attualmente sta nella Create nella Sub RichiediPermesso.


[Nota che le B4XPages hanno MOLTI vantaggi, rispetto ai progetti "tradizionali" e sono MOLTO più semplici da creare e gestire di quanto si possa immaginare]
 

AlpVir

Well-Known Member
Licensed User
Longtime User
No, stesso errore.

B4X:
'.......
    If FirstTime Then
        CallSubDelayed(Me, "RichiediPermessi")
    End If
End Sub

Sub RichiediPErmessi
    ''    ---
    LogColor("Permessi ...",Colors.Blue)
    Wait For (CheckPermissions) Complete (Success As Boolean)
    If Success = False Then
        Msgbox2Async("Bisogna concedere alcuni permessi per poter installare l'app", "INSTALLAZIONE INTERROTTA", "OK", "", "", Null, False)
        Wait For Msgbox_Result (Result As Int)
        ExitApplication
    End If
End Sub


Sub CheckPermissions As ResumableSub
    Dim xxx As Int
    xxx=0
    For Each permission As String In Array(rp.PERMISSION_READ_CONTACTS,rp.PERMISSION_ACCESS_FINE_LOCATION,rp.PERMISSION_WRITE_EXTERNAL_STORAGE,rp.PERMISSION_CAMERA,rp.PERMISSION_RECORD_AUDIO,rp.PERMISSION_RECEIVE_SMS,rp.PERMISSION_SEND_SMS)
        xxx=xxx+1
        Log("Sub CheckPermissions XXX=" & xxx)
        rp.CheckAndRequest(permission)
       '  Wait For Activity_Permission
        Wait For Activity_PermissionResult (permission As String, Result As Boolean)
        If Result = False Then Return False
    Next
    Return True
End Sub

Grazie. Sono convinto anch'io che usare le B4XPages sarebbe decisamente meglio ma il mio è un vecchio (2017) progetto che si è ampliato via via e che ha dovuto tener conto, con fatica, delle continue richieste di Google in termini di adeguamento ai vari SDK (adesso siamo al 35, domani chissà)
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Io fisserei l'attenzione sul fatto che appare una sola volta il log "Sub CheckPermissions XXX=1"
Inoltre che ci fa la riga in REM ' Wait For Activity_Permission ?
Ancora: qual'è il posto giusto per richiamare la sub CheckPermission ? Io l'ho fatto alla fine di Activity_Create. Sarà giusto ?
 

Sagenut

Expert
Licensed User
Longtime User
In effetti puoi mettere il codice nella Resume; lo avrei evitato perché questo evento scatterà spesso, ma non è un problema, perché se i permessi saranno già stati dati, le dialog per la richiesta del permesso non verranno mostrate.
Ma infatti in quel posto dice chiaramente di NON mettere quel codice nella Resume.
 

Sagenut

Expert
Licensed User
Longtime User
Ancora: qual'è il posto giusto per richiamare la sub CheckPermission ?
Sarebbe meglio mettere la richiesta dei singoli permessi giusto prima che venga richiamata la funzione che ne avrà bisogno.
Però anche richiederli subito tutti all'inizio non dovrebbe essere un problema.
 

LucaMs

Expert
Licensed User
Longtime User
Ma infatti in quel posto dice chiaramente di NON mettere quel codice nella Resume.
Sì ma non credo sia esatto; potrebbe andare male solo se, mentre l'utente abbia appena dato UN permesso, l'app andasse in pausa (o ce la mettesse l'utente stesso) per poi essere riattivata.

Credo che la mia prima "proposta" sia quella giusta, ovvero usare CallSubDelayed nella Create, condizionata dal FirstTime.
Se non ha funzionato, dev'essere perché imperfetta la routine "RichiediPermessi" creata O PERCHE' DOPO LA CHIAMATA, NELLA CREATE, CI SIA ALTRO CODICE per il quale siano necessari i permessi.
 

Sagenut

Expert
Licensed User
Longtime User
Io credo che il problema sia questo
B4X:
rp.PERMISSION_WRITE_EXTERNAL_STORAGE
Questo permesso ormai (già da un pò a dire il vero) và evitato e ci sono altri metodi (più rognosi) per accedere alle cartelle del telefono.
Con TargetSDK impostato a 30 non ho problemi e richiede tutti i permessi in fila, anche il WRITE EXTERNAL.
Con TargetSDK superiori (provato solo 33 e 34) è come che dia un FALSE automatico alla richiesta di quel permesso.
Se lo metti in fondo nell'array vedrai che ti chiede tutti gli altri senza problemi.
Ho creato un progetto con il tuo stesso codice.
 

Attachments

  • Perms.zip
    9.5 KB · Views: 181

AlpVir

Well-Known Member
Licensed User
Longtime User
@Sagenut : Grazie del progettino ma, dopo aver chiesto una dopo l'altra ordinatamente le prime 5 autorizzazioni, l'app termina nel richiedere l'ultima (PERMISSION_WRITE_EXTERNAL_STORAGE) con il messaggio "Bisogna concedere alcuni permessi ...."
Utilizzo l'SDK 35.
Continuo ad esaminare il problema, magari facendo tesoro del fatto che l'ordine con cui si specificano i vari permetti è importante ...
 

Sagenut

Expert
Licensed User
Longtime User

Sagenut

Expert
Licensed User
Longtime User
Continuo ad esaminare il problema, magari facendo tesoro del fatto che l'ordine con cui si specificano i vari permetti è importante ...
Il problema sono i paletti e i nuovi requisiti di Google.
 

AlpVir

Well-Known Member
Licensed User
Longtime User
Usando il 35 io pensavo di portarmi un po' avanti. Prima ero fermo al 33 e tutto era OK.
Potrei passare al 34 ma poi cosa succede quando Google immancabilmente richiederà il 35 ?
In realtà provando con il 33 capita lo stesso errore. Evidentemente le modifiche al codice hanno toccato qualcosa di importante.
Nel frattempo ho fatto in modo che la richiesta all'utente di un permesso avviene solo quando viene effettivamente richiamato l'hardware (o il servizio) specifico (AUDIO, CAMERA, SMS)
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
Usando il 35 io pensavo di portarmi un po' avanti. Prima ero fermo al 33 e tutto era OK.
Potrei passare al 34 ma poi cosa succede quando Google immancabilmente richiederà il 35 ?
Intanto ci sarà il tempo di scoprire quali nuove nefandezze si saranno inventati.
E nel frattempo si suppone che saranno uscite nuove versioni di B4A con gli strumenti per supportare quelle cose.
Impostando già ora a 35 ti auto imponi nuovi limiti che nemmeno sappiamo quali siano.
Anzi, che io non sò.
Poi basta andare a cercare in giro e saranno già scritti.
Ma B4A potrebbe non avere ancora gli strumenti per gestirli.
E' già dura stare dietro al minimo richiesto.......... ;)
 
Top