Italian Kiosk mode - come fare?

amorosik

Expert
Licensed User
Ogni tanto ritorna la necessita' di realizzare qualcosa su smartphone o tablet e bloccare todos de todos a parte l'avviamento in automatico della nostra applicazione
Vedo che ci sono gia' alcune indicazioni, ma magari e' saltato fuori qualcosa di nuovo
Qualche novita' ?
Voi come fareste ?
 

Lello1964

Well-Known Member
Licensed User
Longtime User
io uso queste due modalità :

modalità kiosk:
Sub setKiosk(on As Boolean)
    Dim Command, Runner As String
    Dim StdOut, StdErr As StringBuilder
    Dim Result As Int
    Dim Ph As Phone
    StdOut.Initialize
    StdErr.Initialize
    Runner = File.Combine(File.DirInternalCache, "runner")
    Command = File.Combine(File.DirInternalCache, "command")
    File.WriteString(File.DirInternalCache, "runner", "su < " & Command)
    If on Then
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    Else
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner com.android.launcher3/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    End If
    Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr)
End Sub

Sub setKiosk2(on As Boolean)
    Private p As Phone
    Private Out, Err As StringBuilder
    
    Out.Initialize
    Err.Initialize
    
    If on Then
        File.WriteString(File.DirRootExternal, "reboot.sh", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2")
    Else
        File.WriteString(File.DirRootExternal, "reboot.sh", "pm clear cloud.pagamico.boot")
    End If
    
    p.Shell("sh", Array As String(File.Combine(File.DirRootExternal, "reboot.sh")), Out, Err)
    
    Log(Err)
End Sub

Private Sub btn_SetKiosk_Click
    setKiosk(True)
    setKiosk2(True)
End Sub

Private Sub btn_SetKioskOff_Click
    setKiosk(False)    
    setKiosk2(False)    
End Sub
 

Xfood

Expert
Licensed User
io uso queste due modalità :

modalità kiosk:
Sub setKiosk(on As Boolean)
    Dim Command, Runner As String
    Dim StdOut, StdErr As StringBuilder
    Dim Result As Int
    Dim Ph As Phone
    StdOut.Initialize
    StdErr.Initialize
    Runner = File.Combine(File.DirInternalCache, "runner")
    Command = File.Combine(File.DirInternalCache, "command")
    File.WriteString(File.DirInternalCache, "runner", "su < " & Command)
    If on Then
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    Else
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner com.android.launcher3/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    End If
    Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr)
End Sub

Sub setKiosk2(on As Boolean)
    Private p As Phone
    Private Out, Err As StringBuilder
   
    Out.Initialize
    Err.Initialize
   
    If on Then
        File.WriteString(File.DirRootExternal, "reboot.sh", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2")
    Else
        File.WriteString(File.DirRootExternal, "reboot.sh", "pm clear cloud.pagamico.boot")
    End If
   
    p.Shell("sh", Array As String(File.Combine(File.DirRootExternal, "reboot.sh")), Out, Err)
   
    Log(Err)
End Sub

Private Sub btn_SetKiosk_Click
    setKiosk(True)
    setKiosk2(True)
End Sub

Private Sub btn_SetKioskOff_Click
    setKiosk(False)   
    setKiosk2(False)   
End Sub
ciao @Lello1964 ottima soluzione,
un chiarimento, quindi dipende dal dispositivo, vedi conoscrere il nome del launcer "samsung, Datalogic, ecc.?
File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner com.android.launcher3/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any
altra cosa , quindi nessun servizio, nessun ricevitore?
 

giannimaione

Well-Known Member
Licensed User
Longtime User
io uso queste due modalità :
ciao Lello,
hai modo di commentare il tutto e specialmente questo
B4X:
If on Then
        File.WriteString(File.DirRootExternal, "reboot.sh", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2")
    Else
        File.WriteString(File.DirRootExternal, "reboot.sh", "pm clear cloud.pagamico.boot")
    End If
    
    p.Shell("sh", Array As String(File.Combine(File.DirRootExternal, "reboot.sh")), Out, Err)
 

Lello1964

Well-Known Member
Licensed User
Longtime User
ciao,

questa è una funzione che uso per far partire direttamente la app di boot in fase di riavvio, non è fondamentale, avrei dovuto eliminarla.
 

amorosik

Expert
Licensed User
io uso queste due modalità :

modalità kiosk:
Sub setKiosk(on As Boolean)
    Dim Command, Runner As String
    Dim StdOut, StdErr As StringBuilder
    Dim Result As Int
    Dim Ph As Phone
    StdOut.Initialize
    StdErr.Initialize
    Runner = File.Combine(File.DirInternalCache, "runner")
    Command = File.Combine(File.DirInternalCache, "command")
    File.WriteString(File.DirInternalCache, "runner", "su < " & Command)
    If on Then
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    Else
        File.WriteString(File.DirInternalCache, "command", "dpm set-device-owner com.android.launcher3/anywheresoftware.b4a.objects.AdminReceiver2" & CRLF & "exit") 'Any commands via crlf, and exit at end
    End If
    Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr)
End Sub

Sub setKiosk2(on As Boolean)
    Private p As Phone
    Private Out, Err As StringBuilder
   
    Out.Initialize
    Err.Initialize
   
    If on Then
        File.WriteString(File.DirRootExternal, "reboot.sh", "dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2")
    Else
        File.WriteString(File.DirRootExternal, "reboot.sh", "pm clear cloud.pagamico.boot")
    End If
   
    p.Shell("sh", Array As String(File.Combine(File.DirRootExternal, "reboot.sh")), Out, Err)
   
    Log(Err)
End Sub

Private Sub btn_SetKiosk_Click
    setKiosk(True)
    setKiosk2(True)
End Sub

Private Sub btn_SetKioskOff_Click
    setKiosk(False)   
    setKiosk2(False)   
End Sub

Porta pazienza ma non ho capito, questo codice lo fai partire da dentro la tua app?
Ma prima di farla partire e' tutto libero, e quindi il device non entra in modalita' kiosk gia' quando lo avvii, e' cosi o sbaglio?
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Questo è un lavoro di un paio di anni fa, francamente non ricordo tutti i passaggi.
Ho rivisto il tutto, per attivare la funzione devi inviare al dispositivo questo comando via ADB :
adb shell dpm set-device-owner cloud.pagamico.boot/anywheresoftware.b4a.objects.AdminReceiver2, ovvimanete cloud.pagamico.boot è la app a cui deve tornare.

Attenzione che il comando non è reversibile, devi riformattare per tornare al normale, almeno io non sono riuscito a cambiarlo.

Io lo uso su dispositivi industriali.

Non so se funziona su smartphone
 

Lello1964

Well-Known Member
Licensed User
Longtime User
Ho guardato la app di boot, c'è questo nel mainifest :

manifest:
AddApplicationText(<receiver android:name="anywheresoftware.b4a.objects.AdminReceiver2"
  android:permission="android.permission.BIND_DEVICE_ADMIN">
  <meta-data android:name="android.app.device_admin"
  android:resource="@xml/device_admin" />
  <intent-filter>
  <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
  </intent-filter>
</receiver>)
 
Top