4 votos

¿Cómo puedo fijar la pantalla de una aplicación en Android Lollipop utilizando la línea de comandos?

Soy consciente de que puedo ir a Ajustes → Seguridad → Fijación de la pantalla → Activar y, a continuación, pulse Visión general → toque el icono de anclaje en la aplicación que aparece allí y se anclará, poniendo efectivamente la aplicación en modo quiosco .

(Haga clic en la imagen para ampliarla; pase el ratón para conocer los detalles)

IMG: An app in focus IMG: Pin icon to pin the app IMG: Screen pinned app

Pero, ¿cómo puedo anclar una aplicación utilizando la línea de comandos? He intentado input pero sin éxito.

Estoy usando OnePlus One rooteado corriendo CM12.

11voto

Firelord Puntos 161

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)

IMG: Confirmation

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:

    • dumpsys window displays

    • dumpsys window tokens

    • dumpsys window | grep mFocusedApp

Puede haber más formas, pero las que he mencionado deberían ser suficientes.

¡Salud!

0 votos

Sospecho que TASK_ID se asigna a un componente de una aplicación y no a toda la aplicación en sí, pero no tengo una fuente que apoye mi afirmación.

0 votos

@Firelord.....gran detalle y documentación +1

0 votos

Lectores: Ahora me he dado cuenta de que he utilizado cut en algunos de mis comandos que no está disponible de forma nativa en las versiones de Android anteriores a MarshMallow. Considere añadir el busybox en su sistema para ocuparse de cut not found y hacer los cambios apropiados en los comandos.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X