4 votos

¿Conceder permisos a un servicio lanzado con ADB?

Estoy tratando de conseguir un servicio de accesibilidad simple, como Voice Access de Google o Button Mapper para trabajar en un LG Exalt LTE, que ejecuta una versión despojada de Marshmellow. El stock carece de muchos componentes de la interfaz de usuario, incluyendo la configuración de accesibilidad del sistema, que normalmente se utiliza para activar o desactivar los servicios de accesibilidad. Me gustaría saber si es posible compensar la falta de UI con ADB. He probado lo siguiente: Instalar la aplicación (por ejemplo, Button Mapper), Su manifiesto declara algunos permisos, que he concedido, por ejemplo:

<uses-permission name="android.permission.WRITE_SECURE_SETTINGS" />

se concedió adb shell pm grant package.name.here android.permission.WRITE_SECURE_SETTINGS

Incluso le di android.permission.WRITE_SECURE_SETTINGS

aunque no está declarado en la lista de permisos en la parte superior del manifiesto. Me sale este error: Operation not allowed: java.lang.SecurityException: Package package.name.here has not requested permission android.permission.BIND_ACCESSIBILITY_SERVICE

Sin embargo, aquí se declara en el manifiesto:

<service name="a.i" permission="android.permission.BIND_ACCESSIBILITY_SERVICE" stopWithTask="true">
  <meta-data name="android.accessibilityservice" resource="res/xml/accessibility.xml" />
  <intent-filter>
    <action name="android.accessibilityservice.AccessibilityService" />
  </intent-filter>
</service>

y ahí es donde está el problema. este es el servicio en sí mismo, y requiere un permiso que no es para todo el paquete, BIND_ACCESSIBILITY_SERVICE .

si lo inicio con ADB así adb shell am startservice -n package.name.here/a.i

Obtengo un error Error: Requires permission android.permission.BIND_ACCESSIBILITY_SERVICE

aunque ya haya concedido el permiso al paquete.

Incluso he intentado adb shell settings put secure enabled_accessibility_services package.name.here/.a.i pero sigue dando el mismo error.

El resultado final:

¿Cómo puedo iniciar un servicio y conceder permisos a ese servicio con ADB? Para que quede claro. Ya sé que puedo usar adb shell pm grant para conceder un permiso a todo el paquete, pero en este caso es un permiso que no requiere todo el paquete sino que está declarado en un componente específico y estoy perdido en cuanto a cómo lanzar el componente con los permisos que requiere a través de ADB.

0 votos

Obviamente, he utilizado el nombre real del paquete en lugar de package.name.here... lol

0 votos

BIND_ACCESSIBILITY_SERVICE es un permiso con nivel de protección de firma, lo que significa que no se puede conceder mediante pm como los permisos con un nivel de protección peligroso. Pero se puede conceder a los paquetes que lo soliciten utilizando: appops set <pkg> BIND_ACCESSIBILITY_SERVICE allow . Si sólo lo pide un componente (servicio), lo que mencionas debería funcionar: settings put secure enabled_accessibility_services <pkg1>/<service 1>:<pkg2>/<service2>:... . Eso es lo que pasa cuando permites las aplicaciones desde la configuración de la GUI.

0 votos

Intenta matar el proceso de la aplicación después de conceder el permiso. También AFAIK servicio debe ser exportado en el Manifiesto para lanzarlo desde ADB o por otras aplicaciones.

2voto

Exosylver Puntos 16

Creo que lo he resuelto. Usaré Voice Access como aplicación de ejemplo.

adb shell am startservice com.android.cts.apps.accessibility.voiceaccess/com.google.android.apps.accessibility.voiceaccess.JustSpeakService

Siguiente

adb shell settings put secure enabled_accessibility_services com.android.cts.apps.accessibility.voiceaccess/com.google.android.apps.accessibility.voiceaccess.JustSpeakService

Entonces

adb shell settings put secure accessibility_enabled 1

Por último, elimine la aplicación de lectura, para evitar que se sobrescriban las funciones de accesibilidad

adb shell pm uninstall -k --user 0 com.lge.voicecommand

No creo que deba haber ningún error después de eso, pero deja un comentario si lo hay.

2 votos

Si quieres habilitar otro servicio de accesibilidad, sólo tienes que reescribir el paso 2 con una lista de todos los servicios, con dos puntos entre ellos. Así adb shell settings put secure enabled_accessibility_services pkg1/serv1:pkg2/serv2

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