9
votes

Obtenez toutes les noms SharedPreferences et toutes leurs clés?

Je fais un programme de sauvegarde, qui a sauvegardé le téléphone SharedPreferences dans un fichier de ma propre structure. Mais je ne sais pas comment les énumérer tous, que j'ai besoin:

Par exemple, 2 programme ont enregistré leurs préférences partagées avec des noms "Programme A" et "Programme B" . J'ai besoin d'obtenir une matrice de chaîne Thay contenir ces 2 noms. Ensuite, j'utilise getSharedpreferences avec "Programme A", j'ai besoin d'obtenir toutes les clés que le programme a sauvegardé.

est-ce vraiment possible?

EDIT1: Je ne sais pas quels programmes / activités au téléphone. Je veux obtenir toutes les touches que chaque programme enregistré. Cela vous permet de sauvegarder toutes vos données de téléphone, mais seules les valeurs SharedPreferences.

Par exemple: votre téléphone dispose de 10 programmes, chacun crée une SharedPreferences nommée Programme 1 à Programme 10 (mais bien sûr, quel que soit le nom qu'ils veulent) . Et j'aimerais obtenir tous ces programme 1 à Programme 10 String. Ensuite, si programme 1 a 5 touches appelées Key 1 à Key 5 , je veux obtenir ces clés Nom.

EDIT2: Selon NIKOLAMKD Guide, c'est ce que j'ai fait jusqu'à présent, mais la liste renvoie tous les programmes, avec "Aucune préférence" de toutes les lignes, même au premier, j'ai sauvé les préférences partagées Avec mon activité: xxx


5 commentaires

Votre application sonne comme si elle aura besoin de privilèges root.


@Tom Dignan: Je l'ai déjà enraciné!


@Tom DIGNAN: ERR, que vous voulez dire? Racissez le téléphone ou les privilèges root pour le logiciel? Pourrais-je résoudre ce problème par quand même?


Les préférences sont généralement privées à une application, de sorte que si le périphérique n'est enraciné, vous ne pourrez pas lire les magasins de préférence d'applications arbitraires.


Cela ne suce pas .. c'est ce qu'on appelle la sécurité ....


6 Réponses :


0
votes

C'est une bonne question, et je ne pense pas qu'il y ait une façon directe de le faire. La meilleure façon de le faire serait de stocker ces noms dans une partie defaultharedPreferences ou une sorte de tableau global, ou strong> Vous pouvez récupérer les préférences partagées de l'activité elle-même si vous connaissez l'ID de ressource de préférence:

String packageName = String packageName = context.getPackageName(); 
Resources resources = context.getResources(); 
String sharedPrefName = resources.getResourceEntryName(R.id.PREFERENCES_RESOURCE_ID); 
sharedPrefName = packageName+"_"+sharedPrefName;


1 commentaires

Non, je veux dire tout le programme sur le téléphone, ce qui signifie que je ne sais pas quels programmes / activités les a sauvés. J'ai édité mon poste pour plus d'informations.



12
votes

Obtenez toutes les transférences.xml de

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

Anse Paysez le XML, dans le XML, il y a un nom pour chaque touche. Je pourrais mal comprendre votre question


9 commentaires

Où est le dossier de données? Comment puis-je le lire? Ai-je besoin d'une permission? Je ne peux même pas voir ce dossier dans IO File Manager ou de mon PC.


C'est dans votre perspective DDMS de votre IDE, puis dans l'explorateur de fichiers, vous pouvez trouver des annuaires téléphoniques. Vous pouvez le savoir avec l'assetmanager. Les autorisations sont basées sur vos répertoires, -D - XWR --- Quelque chose comme ça, mais surtout tous les annuaires permettent de lire, car c'est ce dont vous avez besoin.


Qu'en est-il du paquet? Je ne sais pas quels programmes sont sur l'appareil, je veux les énumérer tous? BTW, le dossier de données est lu à partir de DDMS est un dossier vide.


Peut-être que le programme n'a pas enregistré de préférences. context.getpackaganager (). QueryIntenctivités (intention, 0); Voici comment vous répertoriez toutes les applications installées. Ensuite, utilisez la liste des noms, à itérer. Le reste est logique ..


Bonjour, j'ai édité ma question. S'il vous plaît donnez-moi des conseils. Merci.


Quelle est la sortie que vous obtenez de la liste temp = getpackagemanager (). QueryIntentaillyCivités (nouvelle intention (intention.action_main, null) .Addcategory (intention.category_launcher), 0); Connectez-vous les éléments de cette liste. Voir ce que vous obtenez, comparez-le ce que vous voyez dans l'explorateur de fichiers DDMS. Essayez également de itération dans tous les types de catégories d'intention, comme s'il s'agit de défaut, car il existe de nombreuses activités qui l'utilisent et qui pourraient sauver des préfs.


Hey, ai-je besoin de privilège? Mon téléphone est enraciné, mais quand j'utilise DDMS , l'ensemble du dossier data est toujours vide!


Essayez-le sur l'émulateur, l'émulateur a un accès root aux données système. Si vous réussissez sur l'émulateur, vous allez également sur votre téléphone enraciné. Je n'ai jamais essayé sur le périphérique actuel .. :)


Le plaisir est pour moi. Je suis content de vous aider.



4
votes

Ne pensez pas que cela soit possible, vous ne pouvez pas lire d'autres applications / données / données / dossiers. Sur l'émulateur, vous pouvez les lire car vous avez un accès root.


4 commentaires

Puis-je faire cela si mon application a un privilège root?


Oui, ça devrait. La racine a accès au dossier / dossier de données / données et sous-dossiers. Complete Chemin sur les préférences partagées Le fichier est / Data / Data / [Nom du paquet] / Shared_PRefS / [Nom de fichier] .xml


lecteur = nouveau filereader ("/ Data / Data /" + app [i] + "/ Shared_PRefs /" + app [i] + "_preferences.xml"); ne fonctionnera pas parce que le XML Le fichier peut être nommé autre chose que le nom du package. Vous devriez analyser tous les fichiers dans le cadre du dossier / Shared_PRefS.


Merci pour vos informations utiles! J'ai terminé le programme.



4
votes

Utilisez le SharedPreference.getall (); qui renvoie une carte .


0 commentaires

4
votes

Essayez ceci:

    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 commentaires

0
votes

Vous pouvez faire boucler tous les fichiers XML de votre répertoire de préférence partagé et obtenir le nom de tous les fichiers qui sont les noms de préférence partagés dans votre application.

File src = new File("/data/data/" + BuildConfig.APPLICATION_ID + "/shared_prefs");
if (src.isDirectory()) {
    String files[] = src.list();
    for (int i = 0; i < files.length; i++) {
        if (files[i].contains(".xml")) {
            reloadSharedPreference(context, files[i].replace(".xml", ""));
        }
    }
}


0 commentaires