¿Cómo puedo copiar SharedPreferences a una tarjeta SD?

He visto en muchos lugares que es un problema para copiar el archivo SharedPreferences a la tarjeta sd porque cada fabricante lo coloca en otro lugar.

Quiero hacer copia de seguridad en la tarjeta sd no importa dónde se encuentra el archivo. ¿Hay alguna manera de hacer esto?

La interfaz SharedPreferences contiene un método llamado getAll() que devuelve un mapa con los pares clave-valor. Así que en lugar de copiar el archivo en sí, sólo serializar el mapa que se devuelve de este método y, a continuación, recuperar de nuevo después.

Algún código:

 private boolean saveSharedPreferencesToFile(File dst) { boolean res = false; ObjectOutputStream output = null; try { output = new ObjectOutputStream(new FileOutputStream(dst)); SharedPreferences pref = getSharedPreferences(prefName, MODE_PRIVATE); output.writeObject(pref.getAll()); res = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { if (output != null) { output.flush(); output.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } @SuppressWarnings({ "unchecked" }) private boolean loadSharedPreferencesFromFile(File src) { boolean res = false; ObjectInputStream input = null; try { input = new ObjectInputStream(new FileInputStream(src)); Editor prefEdit = getSharedPreferences(prefName, MODE_PRIVATE).edit(); prefEdit.clear(); Map<String, ?> entries = (Map<String, ?>) input.readObject(); for (Entry<String, ?> entry : entries.entrySet()) { Object v = entry.getValue(); String key = entry.getKey(); if (v instanceof Boolean) prefEdit.putBoolean(key, ((Boolean) v).booleanValue()); else if (v instanceof Float) prefEdit.putFloat(key, ((Float) v).floatValue()); else if (v instanceof Integer) prefEdit.putInt(key, ((Integer) v).intValue()); else if (v instanceof Long) prefEdit.putLong(key, ((Long) v).longValue()); else if (v instanceof String) prefEdit.putString(key, ((String) v)); } prefEdit.commit(); res = true; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally { try { if (input != null) { input.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return res; } 

Espero que ayude a alguien, y si algo aquí está mal por favor dígame.

Elad

 File ff = new File("/data/data/" + MainActivity.this.getPackageName() + "/shared_prefs/pref file name.xml"); Log.i("ddddddddddddd", ff.getPath() + ""); copyFile(ff.getPath().toString(), sdcard path/save file name.xml"); private void copyFile(String filepath, String storefilepath) { try { File f1 = new File(filepath); File f2 = new File(storefilepath); InputStream in = new FileInputStream(f1); OutputStream out = new FileOutputStream(f2); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); System.out.println("File copied."); } catch (FileNotFoundException ex) { System.out.println(ex.getMessage()); } catch (IOException e) { System.out.println(e.getMessage()); } } 

Una alternativa al uso de ObjectOutputStream / ObjectInputStream es agregar los archivos XmlUtils.java y FastXmlSerializer.java de la fuente de Android a su proyecto y luego usar XmlUtils.writeMapXml () y XmlUtils.readMapXml ():

 boolean res = false; FileOutputStream output = null; try { output = new FileOutputStream(dst); SharedPreferences pref = getSharedPreferences(prefName, MODE_PRIVATE); XmlUtils.writeMapXml(pref.getAll(), output); res = true; } 

…..

 FileInputStream input = null; try { input = new FileInputStream(src); Editor prefEdit = getSharedPreferences(prefName, MODE_PRIVATE).edit(); prefEdit.clear(); Map<String, ?> entries = XmlUtils.readMapXml(input); for (Entry<String, ?> entry : entries.entrySet()) { putObject(prefEdit, entry.getKey(), entry.getValue()); } } 

…..

 static SharedPreferences.Editor putObject(final SharedPreferences.Editor edit, final String key, final Object val) { if (val instanceof Boolean) return edit.putBoolean(key, ((Boolean)val).booleanValue()); else if (val instanceof Float) return edit.putFloat(key, ((Float)val).floatValue()); else if (val instanceof Integer) return edit.putInt(key, ((Integer)val).intValue()); else if (val instanceof Long) return edit.putLong(key, ((Long)val).longValue()); else if (val instanceof String) return edit.putString(key, ((String)val)); return edit; } 

El formato de almacenamiento será entonces el mismo XML que se utiliza para almacenar SharedPreferences.

 try { input = new FileInputStream(src1); SharedPreferences.Editor prefEdit = getSharedPreferences("prueba100", MODE_PRIVATE).edit(); prefEdit.clear(); Map<String, ?> entries = XmlUtils.readMapXml(input); for (Map.Entry<String, ?> entry : entries.entrySet()) { putObject(prefEdit, entry.getKey(), entry.getValue()); } prefEdit.apply(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 
  • Preferencias compartidas de Android Inicialización
  • Seguridad de SharedPreference de Android
  • ¿Qué es una buena manera de almacenar un objeto de ubicación?
  • Configuración de Android Widget con SharedPreferences
  • android preferencias compartidas y paquete comparado con preferencias compartidas
  • SharedPreferences.getAll () no tiene claves de preferencia que sean falsas. ¿Cómo recuperar todas las claves?
  • Ejecutar un pedazo de código sólo una vez cuando se instala una aplicación
  • ¿Los elementos de preferencia se reajustan automáticamente?
  • Android SharedPreferences putStringSet ordenar / ordenar
  • Android: Estilo de preferencia
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.