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.
- Alternativa a addPreferencesFromResource ya que está obsoleta
- Android: Mantenga el nombre de usuario en sesión hasta que se cierre la sesión
- SharedPrefs se restablece después de configurar la configuración regional de la aplicación de Android
- SharedPreferences Borrar / Guardar
- Android, sharedferencias o almacenamiento interno?
¿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?
- ¿Copiar / compartir configuraciones entre versiones pagadas / gratuitas de la aplicación para Android?
- ¿Cómo acceder a la preferencia compartida entre las actividades de android?
- Expectativa de puntero nulo al obtener valores de preferencia compartida
- Preferencias compartidas dentro de broadcastreceiver
- Preferencia y comprobación de la casilla de verificación si está activada o desactivada
- Botón Inicio de la barra de acciones no funcional con PreferredScreen anidado
- Editar las preferencias compartidas de DDMS
- Unidad de Google para realizar copias de seguridad y restaurar la base de datos y las preferencias compartidas de la aplicación de Android
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.
- Android webview setDatabasePath obsoleta
- Vista ScrollView con niños, cómo interceptar desplazamiento condicional