¿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?

4 Solutions collect form web for “¿Cómo puedo copiar SharedPreferences a una tarjeta SD?”

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 en Android?
  • ¿Los elementos de preferencia se reajustan automáticamente?
  • Ejecutar un pedazo de código sólo una vez cuando se instala una aplicación
  • ¿Qué es una buena manera de almacenar un objeto de ubicación?
  • Página web del navegador web de Android
  • Problemas con SharedPreferences en un servicio (getPreferences no existe en un servicio)
  • Android: Recuperar int guardado en PreferenceManager getDefaultSharedPreferencias en otra actividad
  • Preferencias compartidas de Android Inicialización
  • android preferencias compartidas y paquete comparado con preferencias compartidas
  • Configuración de Android Widget con SharedPreferences
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.