Copiar el archivo XML de preferencias compartidas de / datos en el dispositivo Samsung falló

Hay una función de exportación en mi aplicación. Es sólo una operación de copia ya que todas mis configuraciones se almacenan en preferencias compartidas.

Acabo de copiar el archivo xml de /data/data/package.name/shared_prefs/settings.xml a la tarjeta SD. Funciona bien en mi deseo de HTC. Sin embargo, puede que no funcione en los dispositivos Samsung, y tengo el siguiente error mientras intento copiar el archivo.

 I / System.out (3166): /data/data/package.name/shared_prefs/settings.xml (No existe ningún archivo ni directorio) 
 En el directorio.

Alguien sabe cómo solucionarlo, o hay otra manera sencilla de almacenar la preferencia compartida?

Gracias.

La sugerencia de CommonsWare sería un hack inteligente, pero por desgracia no funcionará.

Samsung no siempre pone el directorio shared_prefs en el mismo directorio padre que el getFilesDir() .

Yo recomendaría probar la existencia de (hardcode, excepto el nombre del paquete): /dbdata/databases/<package_name>/shared_prefs/package.name_preferences.xml y si existe, úselo, de lo contrario, vuelva a la sugerencia de CommonsWare de new File(getFilesDir(), "../shared_prefs") o simplemente /data/data/<package_name>/shared_prefs/package.name_preferences.xml .

Una advertencia de que este método podría tener problemas si un usuario pasó de una ROM de Samsung a una ROM personalizada sin borrar, ya que el /dbdata/databases podría no ser utilizado, pero todavía existe.

Más detalles

En algunos dispositivos de Samsung, como el Galaxy S series corriendo froyo, la configuración es la siguiente:

/data/data/<package_name>/(lib|files|databases)

A veces hay un shared_prefs allí también, pero es sólo el intento de Samsung para confundir! ¡No confíes en él! (Creo que puede suceder como una izquierda de una actualización 2.1 a 2.2, pero podría ser un sobrante de los usuarios de conmutación de roms. Realmente no sé, sólo tienen ambos incluidos en la interfaz de la aplicación de informes de errores y, a veces ver Ambos archivos).

Y:

/dbdata/databases/<package_name>/shared_prefs

Ese es el verdadero directorio shared_prefs.

Sin embargo, en el Galaxy Tab de Froyo, es raro. Generalmente tiene: /data/data/<package_name>/(lib|shared_prefs|files|databases)

Con el /dbdata/databases/<package_name> no /dbdata/databases/<package_name> , parece que las aplicaciones del sistema tienen: /dbdata/databases/<package_name>/yourdatabase.db

Y añadido es que /dbdata/databases/<package_name> no se elimina cuando se desinstala tu aplicación. ¡Buena suerte con SharedPreferences si el usuario vuelve a instalar su aplicación!

Nunca nunca nunca nunca nunca nunca nunca nunca nunca hardwire caminos.

Lamentablemente, no hay ningún getSharedPreferenceDir() cualquier lugar que pueda pensar. La mejor solución que puedo pensar será:

 new File(getFilesDir(), "../shared_prefs") 

De esta manera, si un fabricante de dispositivos decide cambiar los nombres de las particiones, está cubierto.

Pruebe esto y ver si ayuda.

La mejor manera de obtener la ruta válida en todos los dispositivos – ejecute el método Context.getSharedPrefsFile definido como:

 /** * {@hide} * Return the full path to the shared prefs file for the given prefs group name. * * <p>Note: this is not generally useful for applications, since they should * not be directly accessing the file system. */ public abstract File getSharedPrefsFile(String name); 

Debido a que la reflexión de uso ocultos uso y fallback de uso en el error:

 private File getSharedPrefsFile(String name) { Context context = ...; File file = null; try { Method m = context.getClass().getMethod("getSharedPrefsFile", new Class[] {String.class}); file = (File)m.invoke(context, new Object[]{name}); } catch (Throwable e) { Log.w("App TAG", "Failed call getSharedPrefsFile", e); file = new File(context.getFilesDir(), "../shared_prefs"); } return file; } 

En algunos implementos de Samsung como este:

 public File getSharedPrefsFile(String paramString) { return makeFilename(getPreferencesDir(), paramString + ".xml"); } private File getPreferencesDir() { synchronized (this.mSync) { if (this.mPreferencesDir == null) { this.mPreferencesDir = new File("/dbdata/databases/" + getPackageName() + "/", "shared_prefs"); } File localFile = this.mPreferencesDir; return localFile; } } 

En otro Android como este:

 public File getSharedPrefsFile(String name) { return makeFilename(getPreferencesDir(), name + ".xml"); } private File getPreferencesDir() { synchronized (mSync) { if (mPreferencesDir == null) { mPreferencesDir = new File(getDataDirFile(), "shared_prefs"); } return mPreferencesDir; } } private File getDataDirFile() { if (mPackageInfo != null) { return mPackageInfo.getDataDirFile(); } throw new RuntimeException("Not supported in system context"); } 

He probado en Samsung P1010 con:

//I'm in a IntentService class

File file = this.getDir("shared_prefs", MODE_PRIVATE);

Tengo: "/data/data/package.name/app_shared_prefs"

Funciona bien para mí. Puedo ejecutar ffmpeg en esta carpeta.

Mira:

Context.getDir

Intenta usar

 context.getFilesDir().getParentFile().getAbsolutePath() 

Tienes que crear el directorio shared_prefs :

 try{ String dir="/data/data/package.name/shared_prefs"; // Create one directory boolean success = (new File(dir)).mkdirs(); if (success) { // now copy the file } }catch (Exception e){//Catch exception if any System.err.println("Error: " + e.getMessage()); } 

También … el paquete de su aplicación es package.name ? Asegúrese de que se está refiriendo al paquete correcto.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.