Получить все имена SharedPreferences и все их ключи? - PullRequest
6 голосов
/ 13 июля 2011

Я создаю программу резервного копирования, которая сохранила данные телефона SharedPreferences в файл моей собственной структуры. Но я не знаю, как перечислить их все, что мне нужно:

Например, 2 программы сохранили свои SharedPreferences с именами "Program A" и "Program B". Мне нужно получить массив String, содержащий эти 2 имени. Затем я использую getSharedPreferences с «Программой А», мне нужно получить все ключи, которые сохранила программа.

Это действительно возможно?

РЕДАКТИРОВАТЬ1: Я не знаю, какие программы / действия по телефону. Я хочу получить ВСЕ keys, которое сохранили все программы. Это похоже на резервное копирование всех данных телефона, но только значений SharedPreferences.

Например: в вашем телефоне 10 программ, каждая из которых создает SharedPreferences с именами от Program 1 до Program 10 (но, разумеется, любое имя, которое они хотят). И я хотел бы получить все эти строки от Program 1 до Program 10. Затем, если Program 1 имеет 5 ключей от Key 1 до Key 5, я хочу получить имя этих ключей.

EDIT2: Согласно руководству NikolaMKD, это то, что я сделал до сих пор, но в списке возвращаются все программы, с "No Preferences" во всех строках, даже в первом я сохранил SharedPreferences со своей активностью :

public class Test extends ListActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences preferences = getSharedPreferences("Test", 1);
        // No matter what name is: Test or the package name
        Editor editor = preferences.edit();
        editor.putInt("TestKey", 0);
        editor.commit();

        List<ResolveInfo> Temp = 
            getPackageManager().queryIntentActivities(
                    new Intent(Intent.ACTION_MAIN, null)
                    .addCategory(Intent.CATEGORY_LAUNCHER), 0);
        String[] App = new String[Temp.size()];
        for (int i = 0; i < Temp.size(); i++) {
            App[i] = Temp.get(i).activityInfo.name;
            FileReader reader = null;
            try {
                reader = new FileReader("/data/data/"
                        + App[i] + "/shared_prefs/" + App[i] + "_preferences.xml");
            } catch (FileNotFoundException e) {
                reader = null;
            }
            if (reader != null)
                App[i] += " (Have Prefereces)";
            else
                App[i] += " (No Prefereces)";
        }
        setListAdapter(new ArrayAdapter<String>(this, R.layout.main, App));
    }



}

Ответы [ 5 ]

10 голосов
/ 16 июля 2011

Получить все _preferences.xml из

/data/data/(package)/shared_prefs/(package)_preferences.xml

Разобрать XML, в XML есть имя для каждого ключа.Я мог бы неправильно понять ваш вопрос

3 голосов
/ 26 июля 2013

Используйте sharedPreference.getAll();, который возвращает Map.

3 голосов
/ 18 июля 2011

Не думайте, что это возможно, Вы не можете читать другие приложения / данные / данные / папки.В эмуляторе вы можете прочитать их, потому что у вас есть root-доступ.

2 голосов
/ 07 октября 2015

Попробуйте это:

    Map<String, ?> allPrefs = prefs.getAll(); //your sharedPreference
    Set<String> set = allPrefs.keySet();
    for(String s : set){
        LOG.d(TAG, s + "<" + allPrefs.get(s).getClass().getSimpleName() +"> =  "
                + allPrefs.get(s).toString());
    }
0 голосов
/ 13 июля 2011

Это хороший вопрос, и я не думаю, что есть прямой способ сделать это.Лучший способ сделать это - сохранить эти имена в DefaultSharedPreferences или в каком-то глобальном массиве, или . Вы можете извлечь sharedPreferences из самого действия, если знаете идентификатор ресурса настроек:

String packageName = String packageName = context.getPackageName(); 
Resources resources = context.getResources(); 
String sharedPrefName = resources.getResourceEntryName(R.id.PREFERENCES_RESOURCE_ID); 
sharedPrefName = packageName+"_"+sharedPrefName;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...