¿Otorgar permisos a un servicio lanzado con ADB?

Estoy tratando de obtener un servicio de accesibilidad simple, como Voice Access o Button Mapper de Google para que funcione en un LG Exalt LTE, ejecutando una versión simplificada de Marshmellow. Al stock le faltan muchos componentes de la interfaz de usuario, incluida la configuración de accesibilidad del sistema, que normalmente se usa para activar o desactivar los servicios de accesibilidad. Me gustaría saber si es posible compensar la falta de interfaz de usuario con ADB. Intenté lo siguiente: Instale la aplicación (Tome Button Mapper, por ejemplo), Su manifiesto declara algunos permisos, que he otorgado, digamos:

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

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

incluso lo diandroid.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, se declara en el manifiesto aquí sin embargo:

<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 sea para todo el paquete, BIND_ACCESSIBILITY_SERVICE.

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

me sale un errorError: Requires permission android.permission.BIND_ACCESSIBILITY_SERVICE

a pesar de que ya concedí el permiso al paquete.

Incluso lo he intentado adb shell settings put secure enabled_accessibility_services package.name.here/.a.i, pero sigo teniendo el mismo error.

Línea de fondo:

¿Cómo inicio un servicio y otorgo permisos a ese servicio con ADB? Para ser claro. Ya sé que puedo usar adb shell pm grantpara otorgar un permiso a todo el paquete, pero en este caso es un permiso que no requiere todo el paquete, está declarado en un componente específico y no sé cómo iniciar el componente con los permisos que requiere a través de ADB.

obviamente, usé el nombre real del paquete en lugar de paquete.nombre.aquí... lol
BIND_ACCESSIBILITY_SERVICE es un permiso con nivel de protección de firma, lo que significa que no se puede otorgar utilizando pmpermisos similares con un nivel de protección peligroso. Pero se puede otorgar a paquetes que lo soliciten usando: appops set <pkg> BIND_ACCESSIBILITY_SERVICE allow. Si solo lo solicita un componente (servicio), lo que mencionó debería funcionar: settings put secure enabled_accessibility_services <pkg1>/<service 1>:<pkg2>/<service2>:.... Eso es lo que sucede cuando permite aplicaciones desde la configuración de la GUI.
Intente eliminar el proceso de la aplicación después de otorgar el permiso. Además, el servicio AFAIK debe exportarse en Manifest para iniciarlo desde ADB o mediante otras aplicaciones.
@IrfanLatif aquí está la salida 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

Respuestas (1)

Creo que lo descubrí. 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

Próximo

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

Luego, finalmente, 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, deja un comentario si lo hay.

Si desea habilitar otro servicio de accesibilidad, simplemente vuelva a escribir el paso 2 en una lista de todos los servicios, con dos puntos entre ellos. Al igual queadb shell settings put secure enabled_accessibility_services pkg1/serv1:pkg2/serv2