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.
0 votos
@IrfanLatif aquí está la salida de cmd:
$ adb shell am kill flar2.homebutton $ adb shell appops set flar2.homebutton BIND_ACCESSIBILITY_SERVICE allow Error: Unknown operation string: BIND_ACCESSIBILITY_SERVICE $ adb shell settings put secure enabled_accessibility_services flar2.homebutton/a.i $ adb shell am startservice -n flar2.homebutton/a.i Starting service: Intent { cmp=flar2.homebutton/a.i } Error: Requires permission android.permission.BIND_ACCESSIBILITY_SERVICE