Скопируйте общий XML-файл предпочтений из / данных на устройстве Samsung не удалось

В моем приложении есть функция экспорта. Это просто операция копирования, так как все мои настройки хранятся в общих предпочтениях.

Я просто скопирую файл xml из /data/data/package.name/shared_prefs/settings.xml на SD-карту. Он отлично работает на моем желании HTC. Тем не менее, это может не работать на устройствах Samsung, и я получаю следующую ошибку, пока я пытаюсь скопировать файл.

 I / System.out (3166): /data/data/package.name/shared_prefs/settings.xml (Нет такого файла или каталога) 
 В каталоге.

Кто-нибудь знает, как это исправить, или есть еще один простой способ сохранить общие предпочтения?

Благодарю.

Solutions Collecting From Web of "Скопируйте общий XML-файл предпочтений из / данных на устройстве Samsung не удалось"

Предложение CommonsWare было бы умным взломом, но, к сожалению, это не сработает.

Samsung не всегда ставит каталог shared_prefs в тот же родительский каталог, что и getFilesDir() .

Я бы рекомендовал проверить наличие (hardcode it, кроме имени пакета): /dbdata/databases/<package_name>/shared_prefs/package.name_preferences.xml и если он существует, используйте его, в противном случае вернитесь к предложению CommonsWare new File(getFilesDir(), "../shared_prefs") или просто /data/data/<package_name>/shared_prefs/package.name_preferences.xml .

Предупреждение, хотя этот метод потенциально может иметь проблемы, если пользователь переключился с Samsung rom на пользовательский rom без очистки, поскольку файл /dbdata/databases может быть неиспользуемым, но все еще существует.

Подробнее

На некоторых устройствах Samsung, таких как серия Galaxy S, работающая на froyo, настройка такова:

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

Иногда есть shared_prefs, но это просто попытка Samsung смутить вас! Не верьте! (Я думаю, что это может произойти, если вы перейдете от версии 2.1 до 2.2, но это может быть отключение от пользователей, которые переключают ромы. Я действительно не знаю, я просто включил в свой интерфейс отчета об ошибках приложение, а иногда вижу Оба файла).

А также:

/dbdata/databases/<package_name>/shared_prefs

Это реальный каталог shared_prefs.

Однако на Galaxy Tab на Froyo это странно. Как правило, у вас есть: /data/data/<package_name>/(lib|shared_prefs|files|databases)

Без /dbdata/databases/<package_name> , но, похоже, у системных приложений есть: /dbdata/databases/<package_name>/yourdatabase.db

Добавленный бонус – это то, что /dbdata/databases/<package_name> не удаляется, когда ваше приложение удалено. Удачи в использовании SharedPreferences, если пользователь когда-либо переустанавливает ваше приложение!

Никогда никогда никогда не никогда никогда никогда не никогда никогда не прокладывайте пути.

К сожалению, нет никакого getSharedPreferenceDir() любом месте, о котором я могу думать. Лучшее решение, о котором я могу думать, будет:

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

Таким образом, если производитель устройства выбирает изменения имен разделов, вы будете закрыты.

Попробуйте это и посмотрите, помогает ли это.

Лучший способ получить допустимый путь на всех устройствах – запустить метод Context.getSharedPrefsFile определенный как:

 /** * {@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); 

Из-за этого скрытая необходимость использования рефлексии и использования fallback при сбое:

 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; } 

На некоторых Samsung реализовано следующее:

 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; } } 

На других Android вроде этого:

 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"); } 

Я тестировал в Samsung P1010 с:

//I'm in a IntentService class

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

Я получил: "/data/data/package.name/app_shared_prefs"

Он отлично работает для меня. Я могу запустить ffmpeg в этой папке.

Посмотрите:

Context.getDir

Попробуйте использовать

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

Вам необходимо создать каталог 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()); } 

Также … пакет вашего приложения – package.name ? Убедитесь, что вы имеете в виду правильный пакет.