¿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(); } 
  • Ejecutar un pedazo de código sólo una vez cuando se instala una aplicación
  • Android: Recuperar int guardado en PreferenceManager getDefaultSharedPreferencias en otra actividad
  • Problemas con SharedPreferences en un servicio (getPreferences no existe en un servicio)
  • Qué es diferente entre OnPreferenceChangeListener y OnSharedPreferenceChangeListener
  • ¿Cuál es el punto de SharedPreferences.getFloat ()
  • Cambio de idioma dentro de la aplicación Android
  • ¿Cómo cambiar el estado de un elemento de preferencia de fuera de PreferenceActivity?
  • Android SharedPreferences putStringSet ordenar / ordenar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.