Spanish [SOLUCIONADO} Desbloquear pantalla en smartwatch 4.4.2

Heppy

Active Member
Licensed User
Longtime User
Hola.

He leido y he visto una respuesta de bgsoft sobre el desbloqueo de pantalla.

La pantalla en si, es un reloj que hay que deslizarlo para que se active el smartwatch.

B4X:
Sub DesbloquearPantallaBloqueo
 
    r.Target = r.GetActivity
    r.Target = r.RunMethod("getWindow")
    r.RunMethod2("addFlags", 6815872, "java.lang.int")
     
End Sub

Esto me produce un error:
B4X:
** Service (starter) Create **
false
** Service (starter) Start **
Conectando
0
starter_desbloquearpantallabloqueo (java line: 231)
java.lang.NullPointerException
    at anywheresoftware.b4a.agraham.reflection.Reflection.GetActivity(Reflection.java:661)
    at b4a.example.starter._desbloquearpantallabloqueo(starter.java:231)
    at b4a.example.starter._service_start(starter.java:353)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at anywheresoftware.b4a.BA.raiseEvent2(BA.java:169)
    at anywheresoftware.b4a.BA.raiseEvent(BA.java:153)
    at b4a.example.starter.handleStart(starter.java:93)
    at b4a.example.starter.onStartCommand(starter.java:68)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2868)
    at android.app.ActivityThread.access$2100(ActivityThread.java:151)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1418)
    at android.os.Handler.dispatchMessage(Handler.java:110)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:5299)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:825)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:641)
    at dalvik.system.NativeStart.main(Native Method)

¿No tendrá que estar rooteado?

Gracias
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Angel:

Yo esa rutina la empleo desde cualquier tipo de dispositivo root o no root.
Creo que estas llamando al sub desde un servicio, y por eso te da error, se tiene que hacer desde un formulario activo, no se puede desde un servicio o módulo de clase.

Si me dices donde esta mi respuesta le añado este comentario para que no vuelva a pasar.

Tambien hay que tener en cuenta que si el dispositivo está apagado y tiene contraseña no lo despertará (tiene su lógica)

Saludos
 

Heppy

Active Member
Licensed User
Longtime User
Gracias Jesús.

Sí, lo estoy ejecutando en un servicio.

Lo haré con CallSubDelayed.

PD: Como el post es tan viejo, no deja editarlo ni contestar en el hilo.
 

Heppy

Active Member
Licensed User
Longtime User

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Angel:

Me alegro que te funcione.

Si que me ha dejado editarlo, asi que le he añadido ese comentario .

Gracias

Saludos
 

Heppy

Active Member
Licensed User
Longtime User
Hola de nuevo.

El desbloqueo me funciona perfectamente, pero el bloqueo no me funciona.

B4X:
    r.Target = r.GetActivity
    r.Target = r.RunMethod("getWindow")
    r.RunMethod2("clearFlags",0, "java.lang.int")

No se que hacer.
B4X:
#Region  Service Attributes
    #StartAtBoot: True
    #ExcludeFromLibrary: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim r As Reflector

End Sub

Sub Service_Create
    'This is the program entry point.
    'This is a good place to load resources that are not specific to a single activity.
  'StartActivity(Main)
 
End Sub

Sub Service_Start (StartingIntent As Intent)
   StartServiceAt("", DateTime.Now + 5 * DateTime.TicksPerSecond, True) 'schedule the next task to run in 30 seconds.
   If ComprobarBloqueoPantalla=True Then
     Log("Bloqueada")   
     StartActivity(Pantalla)
     CallSubDelayed(Pantalla,"DesbloquearPantallaBloqueo")
   Else
        Log("Bloquear")
     StartActivity(Pantalla)
        CallSub(Pantalla,"BloquearPantallaBloqueo")    
   End If
End Sub

'Return true to allow the OS default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
    Return True
End Sub

Sub Service_Destroy

End Sub

Sub ComprobarBloqueoPantalla As Boolean
   r.Target = r.GetContext
   r.Target = r.RunMethod2("getSystemService", "keyguard", "java.lang.String")
   Return  r.RunMethod("inKeyguardRestrictedInputMode")
End Sub
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Angel:

Prueba a NO poner el StartActivity(Pantalla) antes de las llamadas , cuando tu haces una llamada a un sub de un formulario este ya se carga.
Luego, al final del bloqueo, haz un Activity.Finish, a mi con esto me funciona.

Saludos
 

Heppy

Active Member
Licensed User
Longtime User
B4X:
** Activity (pantalla) Pause, UserClosed = true **~i:** Service (starter) Create **
** Service (starter) Start **
Bloquear
** Activity (main) Create, isFirst = true **
** Activity (main) Resume **
** Activity (pantalla) Create, isFirst = true **
** Activity (pantalla) Resume **
** Activity (pantalla) Pause, UserClosed = false **
** Activity (pantalla) Resume **
** Service (starter) Start **
Bloquear
Intentando bloquear
** Activity (pantalla) Pause, UserClosed = true **
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloqueada
** Activity (pantalla) Create, isFirst = false **
** Activity (pantalla) Resume **
** Service (starter) Start **
Bloqueada
Desbloqueo
** Activity (pantalla) Resume **
** Service (starter) Start **
Bloquear
Intentando bloquear
** Activity (pantalla) Pause, UserClosed = true **
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloqueada
** Activity (pantalla) Create, isFirst = false **
** Activity (pantalla) Resume **
** Service (starter) Start **
Bloqueada
Desbloqueo
** Activity (pantalla) Resume **
** Service (starter) Start **
Bloquear
Intentando bloquear
** Activity (pantalla) Pause, UserClosed = true **
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloquear
** Service (starter) Start **
Bloqueada
** Activity (pantalla) Create, isFirst = false **
** Activity (pantalla) Resume **
Hola Jesús.

No me va nada fino el asunto.

Si le pongo CallsubDelayed se queja de sending queue, por eso le pongo callSub

Y la primera vez para bloquear no me entra en la rutina de Pantalla.

Puedes echarle un vistazo.
 

Attachments

  • Bloqueo.zip
    9.3 KB · Views: 238

Heppy

Active Member
Licensed User
Longtime User
Lo único que necesito es encender y apagar la pantalla, para ahorrar batería

Da igual que tener la seguridad desactivada.

Pero es que hay veces que no me entra en las rutinas de otra activity
 

bgsoft

Well-Known Member
Licensed User
Longtime User
Hola Angel

Desgraciadamente nos volvemos a encontrar con la "politica de seguridad de Google" :D, que por lo visto va "capando" cosas cuando le parece. He probado tu programa, y si, depende de que dispositvo y de que versión de Android no va el bloqueo.

Para lo que dices que a veces te bloquea o no, yo haria una cosa, crearia una variable global en el starter, y la cambiaria dependiendo de la consulta :

B4X:
' ----------------------- esto es como está ----------------------------
Sub Service_Start (StartingIntent As Intent)
   If ComprobarBloqueoPantalla=True Then
     Log("Bloqueada") 
     If IsPaused(Pantalla) Then StartActivity(Pantalla)
     CallSub2(Pantalla,"DesbloquearPantallaBloqueo","")
  
   Else
        Log("Bloquear")
     'If IsPaused(Pantalla) Then StartActivity(Pantalla)
        CallSub2(Pantalla,"BloquearPantallaBloqueo","")
   End If
   StartServiceAt("", DateTime.Now + 10 * DateTime.TicksPerSecond, True) 'schedule the next task to run in 30 seconds.
End Sub



' ----------------------------- lo cambias por esto: --------------------------

Sub Process_Globals
dim Bloquear as Boolean
.................
.................
.................
.................

Sub Service_Start (StartingIntent As Intent)
   If ComprobarBloqueoPantalla Then
     Log("Bloqueada>desbloquear") 
     Bloquear = false
   Else
     Log("Desbloqueada>Bloquear")
     Bloquear = True   
   End If

   StartActivity(Pantalla)

   StartServiceAt("", DateTime.Now + 10 * DateTime.TicksPerSecond, True) 'schedule the next task to run in 30 seconds.

End Sub

' en pantalla quitas el (s As String) de las llamadas y pones esto en el Resume:
Sub Activity_Resume
  If Starter.Bloquear Then
    BloquearPantallaBloqueo
   Else
     DesbloquearPantallaBloqueo 
  End If
End Sub

Si con eso no te funciona, tienes dos opciones, si el dispositivo es root hacer esto:

B4X:
Dim OS As OperatingSystem   ' libreria OSLibrary
OS.goToSleep(1000)

y en un segundo se apaga el movil (funciona con milisegundos)
tendrás que añadir al manifest esto:

AddPermission
(android.permission.DEVICE_POWER)

Y la otra es bajar el brillo a la pantalla:

B4X:
Dim p As Phone                  ' libreria Phone
p.SetScreenBrightness(0)

Pero aunque esté a 0 (cero) no estará completamente apagada, y por otro lado a la que salgas de la aplicación se recupera el brillo, puedes poner un formulario en negro y cuando activen la aplicación restaurar el brillo.



Siento no poder darte una mejor solución, pero creo que no existe, siempre puedes preguntarle al Sr. Erel :rolleyes:

Saludos
 

Heppy

Active Member
Licensed User
Longtime User
Me he dado cuenta que depende del dispositivo.

Le he quitado la seguridad y le hago un keepalive(true) para mostrar la activitie y un removekeepalive para que se apague la pantalla pasado el tiempo de inactividad que lo tengo a 15 segundos..

Como es una aplicación interna de mensajería de avisos, me da igual que esté bloqueado o no.

Si pierden el smartwatch pues le vendemos otro. (son baratitos, jaja)

Muchas gracias por tu tiempo
 
Last edited:

Heppy

Active Member
Licensed User
Longtime User
De esta forma me funciona correctamente.

Cuando necesite seguridad completa, tengo este post muy bien archivado.

Muchas gracias Jesús por tu magnífica explicación.
 
Top