Gestor de actividades entre otras cosas gestionar Fijación de la pantalla . Puede invocar el am
para fijar una aplicación independientemente de que la fijación de la pantalla esté activada en Ajustes .
Sin embargo, hay que saber que el anclaje no estaría totalmente automatizado de esta manera, es decir, todavía tendría que confirmar en la pantalla si quiere anclar la aplicación o no, aunque proporcioné una manera de interactuar con la pantalla sólo la primera vez.
Google mencionó aquí :
(El énfasis es mío)
Si la aplicación solicitante no es propietaria de un dispositivo, se pide confirmación al usuario . Una aplicación propietaria de un dispositivo puede llamar al setLockTaskPackages()
para permitir que las aplicaciones se puedan pinchar sin el paso de confirmación del usuario.
También hay que tener en cuenta que una aplicación no puede convertirse en propietaria de un dispositivo simplemente utilizando un conjunto de comandos, a menos que cumpla los criterios establecidos para ello, es decir, debe ser candidata a la Administración de Dispositivos (las aplicaciones que se ven en Configuración → Seguridad → Administradores de dispositivos ), que está codificado en el manifiesto de la aplicación. Google ha mencionado aquí qué debe incluirse en el manifiesto de una aplicación para utilizar la API de administración de dispositivos.
Aun así, hay que hacer que la aplicación sea la Propietario del dispositivo -- un tipo especializado de administrador de dispositivos que, una vez activado, no puede ser desactivado a menos que tengas acceso Root o hagas un restablecimiento de fábrica en el dispositivo. A diferencia del modo quiosco simple, que se activa fijando una aplicación de la lista de tareas recientes, una aplicación del propietario del dispositivo puede hacer que sea extremadamente difícil evadir el modo quiosco, lo que significa que la técnica normal de evasión, como mantener pulsado el botón de información general o el botón de retroceso, o ambos, podría resultar inútil.
Usted debe elegir un método para que tu aplicación favorita sea la propietaria del dispositivo.
Eso era sólo un poco de contexto para explicar por qué necesitas interactuar con la pantalla, y por qué no hay una forma completa de línea de comandos para fijar la pantalla de una aplicación.
Cosas que hacer
Configurar adb Conecta el teléfono al PC, activar la depuración USB en el teléfono, inicie la aplicación que desea fijar en la pantalla, inicie un shell en el PC y entre:
NOTA: Me he dado cuenta de que en Android 6.0 lock-task
ha sido sustituido por task lock
. Por lo tanto, haga los cambios apropiados en cualquier comando antes de usar este último.
-
adb shell
task_id=$(dumpsys activity | grep -A2 "(dumpsys activity recents)"| grep '#'| cut -d ' ' -f 7| cut -c 2-); am lock-task $task_id
-
Como alternativa: Este comando funcionaría si la aplicación se lanza desde cero, es decir, no se reanuda desde la lista de tareas recientes:
adb shell
cur_act=($(dumpsys activity | grep mFocusedActivity | rev)); task_id=$(echo ${cur_act[0]} | head -c -2 | cut -c 2-| rev); am lock-task $task_id;
Se obtendría una salida Activity manager is not in lockTaskMode
. Ignóralo, y si has leído los enlaces que mencioné en el contexto sabrás por qué se ha emitido.
Pulse Inicie en la pantalla del dispositivo para confirmar la fijación de la pantalla.
(Haga clic en la imagen para ampliarla)
He subido la grabación de la pantalla aquí (5.62MB de tamaño) que le mostrará que el comando también puede fijar la pantalla de la aplicación del lanzador.
Como alternativa a ir a la pantalla y tocar el diálogo de confirmación, puede utilizar cualquiera de los siguientes enfoques:
-
Emitir eventos clave para ir hacia abajo, ir a la derecha, y simular entrar en el diálogo de confirmación.
adb shell input keyevent 20
adb shell input keyevent 22
adb shell input keyevent 66
( <a href="https://stackoverflow.com/questions/7789826/adb-shell-input-events">Aquí </a>se enumeran algunos eventos clave comunes)
-
-
Activar Ubicación del puntero en las opciones de desarrollador, ancle una aplicación y mantenga pulsado Inicie en el diálogo de confirmación, y localice las coordenadas X e Y.
-
Como alternativa, utilice adb shell getevent -l
para obtener las coordenadas X e Y. He aquí una buena solución por Tomás.
Una vez que los tengas, utiliza este comando:
adb shell input touchscreen tap <x> <y>
donde <x>
y <y>
son las coordenadas respectivas que has anotado.
Dado que las coordenadas X e Y serán siempre las mismas cuando se muestre la confirmación (siempre que no se trate de coordenadas de modo apaisado en modo vertical), se puede utilizar para la fijación completa de la pantalla utilizando la línea de comandos.
En cuanto al comando que hace la fijación de la pantalla, es muy sencillo. La parte responsable de activar el pin de pantalla es am lock-task
, y su uso va como:
Tipo adb shell am
y fíjate en esta línea:
am lock-task: bring <TASK_ID> to the front and don't allow other tasks to run
Traiga <TASK_ID>
(que es el ID de la tarea de una aplicación en uso) al frente mientras no permite que otras tareas se ejecuten simplemente significa el modo kiosco.
No he podido llegar a saber qué son STACK_ID y TASK_ID en general, pero sé cómo encontrarlos. Utilice cualquiera de los siguientes enfoques para obtener el TASK_ID de la aplicación en foco o lanzada por un usuario:
-
dumpsys activity | grep -A20 "(dumpsys activity recents)"
o introduzca dumpsys activity recents
para obtener información detallada sobre todas las actividades recientes, pero sería excesivo para nuestro objetivo. La salida del primero sería como:
* Recent #0: TaskRecord{68f58f6 #1441 A=com.slovoed.oald U=0 sz=1}
* Recent #1: TaskRecord{9888887 #1415 A=com.cyanogenmod.trebuchet U=0 sz=1}
* Recent #2: TaskRecord{29c6fe30 #1438 A=com.icecoldapps.serversultimatepro U=0 sz=2}
El valor numérico antes de A=
y después #
es el TASK_ID de la aplicación. En el ejemplo, sería: 1441
, 1415
, 1438
. Estos TASK_IDs se encontrarían en la salida del siguiente comando.
-
am stack list
Enumeraría todas las pilas de actividades de las que forma parte TASK_ID.
Stack id=1 bounds=[0,0][1080,1920] displayId=0
taskId=1438: com.icecoldapps.serversultimatepro/com.icecoldapps.serversultimatepro.viewStart1
taskId=1441: com.slovoed.oald/com.slovoed.oald.SlovoEdTabActivity
Stack id=0 bounds=[0,0][1080,1920] displayId=0
taskId=1415: com.cyanogenmod.trebuchet/com.android.launcher3.Launcher
-
dumpsys activity | grep mFocusedActivity
Daría el nombre del paquete de la aplicación que está en foco (simplemente, la aplicación que se muestra en la pantalla de forma dominante), su ID de tarea y algunos otros detalles:
mFocusedActivity: ActivityRecord{30672d7f u0 com.slovoed.oald/.OALDTabActivity t1441}
El valor después de t
y antes }
es el TASK_ID de la aplicación.
-
También puede obtener TASK_ID de:
Puede haber más formas, pero las que he mencionado deberían ser suficientes.
¡Salud!