2012-03-15 11 views
5

Estoy tratando de implementar una especie de vnc (basado en el servidor droid-vnc de oNaiPs) en mi aplicación. Dado que los eventos del mouse no funcionan con mi dispositivo, intento lo siguiente: enviar datagramas desde el servidor de framebuffer vnc nativo, capturarlos en un Service y usar del Instrumentation. Y aquí es donde se necesita el permiso. Escuché que puede obtener todos los permisos necesarios si presiona la .apk a /system/app con Root Exploter, chmod y reset, pero eso no funcionó en mi caso, y sigo teniendo SecurityException. También intenté editar manualmente el archivo /data/system/packages.xml.INJECT_EVENTS permiso en un dispositivo rooteado

¿Hay alguna otra forma de obtener el permiso (tal vez sea menor su nivel de seguridad? Ya que solo necesito que esta aplicación funcione en mi dispositivo), ¿o quizás una forma diferente de hacer lo que intento?

Gracias!

Respuesta

0

¿Ha agregado INJECT_EVENTS permiso de uso en su manifiesto?

+1

Por supuesto. Comprobé que, después de presionar en el sistema/aplicación y reiniciar, en el inicio todavía me rechaza el permiso: ' W/PackageManager (115): no otorga permiso android.permission.INJECT_EVENTS al paquete com.vnc.test (protectionLevel = 2 flags = 0xbe47) ' – alchemiss

+2

este permiso no es del tipo normal, por lo que agregarlo al manifiesto tiene poco efecto. Para que este permiso funcione, la apk debe estar firmada con el certificado del sistema. No para desarrolladores regulares, solo para creadores de plataformas. – radhoo

2

Así que, después de un par de días de buscar en Google e investigar, no encontré la manera de hacerlo (bueno, excepto por cosas obviamente imposibles como crear mi propia versión de Android para obtener la firma del sistema) y diseñé una especie de solución: el servidor vnc (tomado de droid-vnc-server v.0.72) abre un socket y escribe todos los eventos de puntero (tipo y coordenadas); luego hay un servicio que lee desde este socket e inyecta eventos a través de múltiples comandos sendevent (probablemente también podría hacerlo desde el código nativo, pero como no me gusta en C++, decidí no molestar :)).

Esto funciona bien (¡sorprendentemente!), Pero no estoy totalmente satisfecho, porque en diferentes dispositivos hay diferentes constantes (como, tipos de eventos, valores mínimo y máximo, etc.), y tendré que o los analiza desde getevent -p, o especifica un archivo de configuración.

3

Entonces probablemente no buscó lo suficiente. Sí, es una pena que Android no lo ofrezca por defecto, pero esto no significa que no sea factible.

La única pega es que necesitarás root. Entonces, si tiene root, entonces puede cambiar el permiso de los archivos/dev/input/eventX para poder escribir.

Si los archivos son escribibles, puede inyectar una clave personalizada y tocar eventos, a cualquier aplicación, escribiendo directamente en los nodos de eventos de entrada.

He escrito una pequeña biblioteca, disponible como código abierto aquí: http://code.google.com/p/android-event-injector/

Lo hace precisamente eso: chmod automática para ajustar los permisos en los desarrolladores de entrada, y utiliza JNI para interconectar los archivos nativos. A continuación, expone una interfaz Java simple para usar en su proyecto Android.

Cuestiones relacionadas