Android: Modificar las preferencias compartidas de otra aplicación

Estoy tratando de escribir una aplicación que debe leer, modificar y guardar algunas configuraciones en Preferencias compartidas de otra aplicación ( data/data/package_name/shared_prefs/file.xml ).

Esta aplicación no es mía, y tengo el dispositivo de raíz para las pruebas.

¿Qué permisos de Android debería agregar a manifiesto y cómo puedo acceder a este archivo y modificarlo? Sé que SharedPreferences es exclusivo para cada App / APK, pero necesito modificarlo en modo root.

Tengo código de trabajo para modificar el archivo xml en sdcard, pero cuando cambio la ruta a "data/data/package_name/shared_prefs/file.xml" me da una excepción y un mensaje

 android open failed eacces (permission denied) 

¿Hay alguna manera de lograrlo?

Echa un vistazo a esta respuesta:

https://stackoverflow.com/a/13139280/361230

Cuando utilices su, tendrás el permiso para modificar lo que quieras en el sistema de archivos.

Sin embargo, estoy de acuerdo con Chris en el hecho de que no es muy agradable hacer lo que quieras.

Para responder a su pregunta, si tiene raíz, puede hacerlo con reflexión. Lo he hecho en android 4.1, en otras plataformas puede funcionar de manera diferente. Lo bueno es que las preferencias compartidas no son accesibles sólo por los servicios del sistema, por lo que puede acceder a los métodos "ocultos" mediante la reflexión. Poner esto en un try-catch:

 Process proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs/package_name_preferences.xml" }); proc.waitFor(); proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name/shared_prefs" }); proc.waitFor(); proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "chmod 777 /data/data/package_name" }); proc.waitFor(); File preffile = new File("/data/data/package_name/shared_prefs/package_name_preferences.xml"); Class prefimplclass = Class.forName("android.app.SharedPreferencesImpl"); Constructor prefimplconstructor = prefimplclass.getDeclaredConstructor(File.class,int.class); prefimplconstructor.setAccessible(true); Object prefimpl = prefimplconstructor.newInstance(preffile,Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE); Editor editor = (Editor) prefimplclass.getMethod("edit").invoke(prefimpl); //put your settings here editor.commit(); 

No debes cambiar las preferencias de otra aplicación, con raíces o no.

A menos que seas el propietario de la otra aplicación, no deberías estar haciendo esto. La única forma sin raíz sería que fuera legible en el mundo, que se deprecia y casi nunca se utiliza.

Dudo que alguien le va a dar una respuesta que desea a menos que el estado por qué necesita acceso.

  • BackupManager no llama al servicio de transporte de copia de seguridad
  • Obtener todos los nombres SharedPreferences y todas sus claves?
  • Cómo guardar notificaciones push de analizar por SharedPreferences
  • Almacenamiento de una matriz String en SharedPreferences
  • ¿La aplicación de actualización borra las preferencias compartidas o elimina las alarmas establecidas por la aplicación?
  • Prueba de unidad de Android: cómo borrar SharedPreferences
  • Preferencias compartidas de Android con múltiples actividades
  • NullPointerException en PreferenceManager.getDefaultSharedPreferences en el inicio
  • No se puede acceder a las preferencias creadas por PreferenceActivity
  • ¿Por qué la variable estática de mi aplicación Android a veces se devuelve nula?
  • Arquitectura de la aplicación de Android: RxJava
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.