android homescreen android-homebutton screen-lock

¿Cómo deshabilitar el botón de inicio en Android como las aplicaciones de pantalla de bloqueo?



homescreen android-homebutton (6)

He investigado mucho para diseñar una pantalla de bloqueo y, finalmente, he encontrado una solución. Android deshabilitó la función para anular las barras del sistema, excepto el botón Atrás. Pero hay un poco de trabajo para hacer que esto funcione:

Comprenda e implemente la fijación de pantalla con paciencia y tendrá éxito.

Puede crear una aplicación para controlar en qué todas las aplicaciones desea implementar el anclaje de pantalla o puede implementar el anclaje de pantalla directamente en la misma aplicación que desea anclar.

Les mostraré la implementación posterior en este artículo:

1. En primer lugar, su aplicación debe ser el propietario del dispositivo.

Puedes hacerlo de varias maneras y lo más fácil es ejecutar el comando:

adb shell dpm set-device-owner [yourPackageName] /. [MyDeviceAdminReceiver]

Cree un receptor (MyDeviceAdminReceiver) que amplíe DeviceAdminReceiver. No necesitas tener ningún código aquí. Para obtener más información sobre la implementación del propietario del dispositivo, consulte este enlace
http://florent-dupont.blogspot.com/2015/02/10-things-to-know-about-device-owner.html

Registre el receptor en el archivo AndroidManifest.xml de esta manera:

<receiver android:name=".MyDeviceAdminReceiver" android:label="@string/app_name" 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>

2. Tu método onCreate debería verse así:

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_lock_screen); ComponentName deviceAdmin = new ComponentName(this, MyDeviceAdminReceiver.class); DevicePolicyManager mDpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE); if (mDpm.isDeviceOwnerApp(getPackageName())) { mDpm.setLockTaskPackages(deviceAdmin, new String[]{getPackageName()}); } if (mDpm.isLockTaskPermitted(this.getPackageName())) startLockTask();

3. Para liberar la pantalla y hacer que la barra de navegación funcione :

Llame a la función stopLockTask () en un lugar de su código en el que desee desasignar. Por ejemplo, en mi aplicación, en cuanto verifico que el usuario ha ingresado el código de acceso correcto, llamo a esta función:

if (userInput.length() == 4) { if (userInput.equals(passcode)) { userInput = ""; etxtPasscodeDisplay.setText(""); stopLockTask(); // this is what you need unlockHomeButton(); // A method to show home screen when passcode is correct finishAffinity(); //kill other activities }

Información adicional que generalmente se requiere para las pantallas de bloqueo:

1. Si su aplicación es lo primero que aparece después del arranque :

Necesita un servicio (StartAtBootService) y un receptor (BootCompletedReceiver) para esto.

2. Si desea que su aplicación se muestre después de bloquear y desbloquear la pantalla (el botón de encendido se presiona para bloquear y desbloquear):

Cree AEScreenOnOffService que amplíe el servicio y AEScreenOnOffReceiver que extienda BroadcastReceiver para iniciar su actividad cuando la pantalla está encendida.

Para obtener información detallada sobre todo lo que mencioné aquí, consulte http://www.sureshjoshi.com/mobile/android-kiosk-mode-without-root/
Este es un excelente artículo que me ayudó mucho. Un agradecimiento especial al autor.

Necesito al menos 10 reputación para publicar más de dos enlaces. Como soy nuevo en stackoverflow, no tengo suficiente reputación, así que lamento no haber podido compartir todos los enlaces a los que me he referido. Seguramente actualizaré el post una vez que tenga acceso.

Sé que esta pregunta se hace muchas veces, pero descubrí que ninguna de las soluciones funciona. Intenté el código dado abajo ...

protected void onPause() { super.onPause(); Intent intent = new Intent(this,LockActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT |Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }

Lo que hace es llevar la actividad actual nuevamente al frente cuando se lanza la pantalla de inicio de Android, pero toma casi 3-4 segundos para que la actividad vuelva a aparecer cuando se lanza la pantalla de inicio.

He usado algunas aplicaciones de pantalla de bloqueo que ni siquiera inician la pantalla de inicio cuando se hace clic en el botón de inicio. Quiero lograr algo así.

También he usado el método onUserLeavesHint, el método onKeyDown y el método onKeyDispatch, pero ninguno de ellos funcionó para mí.

Y, por favor, no responda ni comente, ya que no es posible deshabilitar el botón de inicio en Android. Para tales respuestas o comentarios, le sugiero que revise algunas aplicaciones de la pantalla de bloqueo en PlayStore. También encontré una aplicación de trabajo en github junto con el código fuente. Estaba funcionando en mi teléfono y la aplicación usó disableKeyguard, pero cuando hago lo mismo en mi aplicación, no funciona (disableKeyguard está en desuso pero uso advertencias de @supress ("desprecation")).


La forma segura de proporcionar una funcionalidad de pantalla de bloqueo no root impecable es mediante la combinación de su idea de aplicación "locker" con una aplicación de inicio.

Un simple cambio en el manifiesto permitirá que su aplicación se registre como pantalla de inicio / lanzador, lo que le dará a .apk el control total del botón de inicio:

<application android:launchMode="singleTask" android:clearTaskOnLaunch="true" android:stateNotNeeded="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="ch.arnab.simplelauncher.HomeScreen" android:label="@string/app_name" android:launchMode="singleTask" android:excludeFromRecents="true" android:screenOrientation="nosensor"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <!-- These 2 intent-filters identify a launcher: --> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> </application>

Sacado de este tutorial

Luego tendrá dos actividades, una para la pantalla de inicio y otra para la pantalla de bloqueo.

Tendrá que detectar cuándo se activa / desactiva la pantalla para mostrar la actividad de la pantalla de bloqueo:

public class MainActivity extends Activity { //Create a receiver for screen-on/screen-off BroadcastReceiver mybroadcast = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { //Show lock-screen } else if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { //Also show lock-screen, to remove flicker/delay when screen on? } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_ON)); registerReceiver(mybroadcast, new IntentFilter(Intent.ACTION_SCREEN_OFF)); } }

Tirado de esta respuesta

Para su información: ya que su "pantalla de bloqueo" todavía se considerará parte de su lanzador en este punto, las aplicaciones podrán iniciarse en la parte superior de su pantalla de bloqueo, lo cual es incorrecto si: el usuario tiene acceso al buzón de notificaciones para hacer clic en Mensajes / Tweets , etc. , pero también puede ser bueno para: poder contestar llamadas entrantes sin desbloquear el teléfono.

De cualquier manera, la actividad de la pantalla de bloqueo debe onPause , verifique si el usuario está "autenticado", si no lo está, asuma que el usuario abrió algo y debería volver a la pantalla de bloqueo:

@Override public void onPause() { super.onPause(); if(password!=storedPassword) { //Lockscreen activity shouldn''t ever be escaped without the right password! //Return to launcher without root! Intent homeIntent = new Intent(Intent.ACTION_MAIN); homeIntent.addCategory(Intent.CATEGORY_HOME); homeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(homeIntent); } }

Para una mejor experiencia de usuario, debe dar a su usuario la opción de permitir que algunas aplicaciones pasen por alto la pantalla de bloqueo (como Spotify), puede incluir eso en la declaración if (por ejemplo, if(password!=storedPassword||isForegroundAppSpotify) ) .

En cuanto a la carga de aplicaciones en su pantalla de inicio, puede consultar los tutoriales en Google para crear su propia actividad de inicio.

La combinación de launcher + lock-screen es la forma más fácil de evitar el acceso de root. Puede que le resulte más fácil usar la raíz, pero limitará su base de clientes.

¡Espero que esto ayude!


La respuesta simple a tu pregunta es que no puedes hacer eso.

La solución que ha mencionado fue sugerida por mí hace unos cuatro años [Link] .

onUserLeavesHint, onKeyDown y onKeyDispatch nunca "deshabilitarán" las claves de hardware.

Si realmente quiere "manejar" el botón de Inicio, tendrá que hacer su aplicación como pantalla de inicio. Mira this y this .

Si realmente desea deshabilitar su llave de hardware sin hacer una aplicación de pantalla de inicio, debe rootear su dispositivo y eliminar el archivo de dispositivo correspondiente del módulo del kernel. (¡Prueba a tu propio riesgo!)


Lo que podrías hacer es anular la función de la tecla de inicio de esta manera:

@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_HOME) { //The Code Want to Perform. } });

Entonces deberías poder evitar que el usuario regrese a la pantalla de inicio con este botón. Espero que eso te funcione.

EDITAR: El problema de anular el botón de inicio es que Google lo considera un agujero de seguridad, por lo que cada vez que alguien encuentra una forma de anularlo, Google parchea este "agujero".


Puedes usar la https://github.com/shaobin0604/Android-HomeKey-Locker para hacer esto. También deshabilitará el botón Atrás. Tu actividad se verá así:

public class MainActivity extends Activity {

HomeKeyLocker homeKeyLocker; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); homeKeyLocker = new HomeKeyLocker(); homeKeyLocker.lock(this); }

}


fuente - https://github.com/shaobin0604/Android-HomeKey-Locker

//Copy this class public class HomeKeyLocker { private OverlayDialog mOverlayDialog; public void lock(Activity activity) { if (mOverlayDialog == null) { mOverlayDialog = new OverlayDialog(activity); mOverlayDialog.show(); } } public void unlock() { if (mOverlayDialog != null) { mOverlayDialog.dismiss(); mOverlayDialog = null; } } private static class OverlayDialog extends AlertDialog { public OverlayDialog(Activity activity) { super(activity, R.style.OverlayDialog); WindowManager.LayoutParams params = getWindow().getAttributes(); params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ERROR; params.dimAmount = 0.0F; // transparent params.width = 0; params.height = 0; params.gravity = Gravity.BOTTOM; getWindow().setAttributes(params); getWindow().setFlags( WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, 0xffffff); setOwnerActivity(activity); setCancelable(false); } public final boolean dispatchTouchEvent(MotionEvent motionevent) { return true; } protected final void onCreate(Bundle bundle) { super.onCreate(bundle); FrameLayout framelayout = new FrameLayout(getContext()); framelayout.setBackgroundColor(0); setContentView(framelayout); } } } //Paste this in your activity mHomeKeyLocker = new HomeKeyLocker(); mHomeKeyLocker.lock(this);