Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

389
Visualizações
Deshabilite mediante programación el sensor magnético de encendido/apagado de la pantalla en Android

Varios dispositivos Android, como la serie Nexus, tienen un sensor magnético que NO es el android.hardware.Sensor.TYPE_MAGNETIC_FIELD que se usa exclusivamente para encender/apagar la pantalla automáticamente usando fundas de teléfono que tienen un pequeño imán en su interior.

En mi aplicación, estoy usando la detección de imanes usando android.hardware.Sensor.TYPE_MAGNETIC_FIELD y SensorManager para detectar que el usuario toca el teléfono en un estuche con algunos imanes adentro.

El código funciona sin problemas, el problema es que es extremadamente fácil en esos dispositivos activar accidentalmente el sensor de encendido/apagado de la pantalla, apagando la pantalla.

He intentado:

  • android:keepScreenOn="true" en el XML
  • usando el permiso android.permission.WAKE_LOCK y adquiriendo un wake-lock a través de PowerManager .

Ambos sin éxito.

¿Hay alguna forma de desactivar temporalmente este sensor mientras se reanuda mi actividad?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

KeepScreenOn = true en el manifiesto tampoco funciona aquí, ya que la acción del sensor de efecto Hall es la misma que presionar el botón de encendido.

Aquí, ofrezco una solución alternativa que he probado. En este enfoque, muestra su actividad independientemente de que el sensor de efecto Hall bloquee el dispositivo y apague la pantalla.

Antes de comenzar la acción de desbloqueo

 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

créditos por el código anterior: https://stackoverflow.com/a/45951927/9640177

También asegúrese de agregar Permisos

 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> <uses-permission android:name="android.permission.WAKE_LOCK" />

Establecer estas banderas asegurará que su ventana sea visible sobre la pantalla de bloqueo.

Ahora, escuche la intención ACTION_SCREEN_OFF. Para hacer esto, agregue un receptor de transmisión que escuche esta intención transmitida por el sistema. Debe registrar el receptor localmente. (stackoverflow.com/a/9478013/9640177) en el manifiesto

 <receiver android:name=".receiver"> <intent-filter> <action android:name="android.intent.action.SCREEN_OFF"/> </intent-filter> </receiver>

Clase de receptor

 public class receiver extends BroadcastReceiver { MyActivity activity; receiver(MyActivity activity){ this.activity = activity; } @Override public void onReceive(final Context context, Intent intent) { activity.turnOnScreen(); } }

actividad interior

 // register receiver ... IntentFilter screenStateFilter = new IntentFilter(); screenStateFilter.addAction(Intent.ACTION_SCREEN_OFF); receiver r = new receiver(MyActivity.this); registerReceiver(r, screenStateFilter); ... // function to turn on display public void turnOnScreen(){ PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "my:Tag"); wakeLock.acquire(); wakeLock.release(); }

crédito - https://stackoverflow.com/a/44706632/9640177 Esto encenderá la pantalla.

No olvide quitar estas banderas después de que su actividad haya hecho el trabajo y no requiera estar al frente.

 getWindow().removeFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

Esto hará que su ventana desaparezca de la pantalla de bloqueo y que la aplicación funcione normalmente.

Espero que esto ayude.

over 4 years ago · Santiago Trujillo Relatório

0

la solución más pragmática al problema podría ser...

para deshabilitar la función de cubierta inteligente físicamente en lugar de por software.

p.ej. tome una hoja de afeitar y unas pinzas y luego retire el imán.

... o simplemente consigue otra funda sin imán.

alternativamente, presente un error contra drivers/input/lid.c .

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda