Comment puis-je partager un SharedPreferences fichier à travers deux applications android?
J'ai eu du mal avec ça pendant un moment. En gros, je veux avoir deux applications (qui sera toujours installé) partager les préférences, avec l'un d'eux étant simplement un service qui s'exécute en arrière-plan et les besoins d'utiliser les préférences (devrait propres préférences, mais seulement vraiment besoin de les lire) et l'application d'autres cours d'un front-end de l'INTERFACE utilisateur d'application qui doit être en mesure d'écrire dans le fichier de préférences de la propriété par l'application d'autres. Le service sera de faire les choses dans l'arrière-plan (ce qui peut être déterminé par les préférences) et l'INTERFACE utilisateur permet à l'utilisateur de modifier les préférences et afficher des informations à partir du service. Cependant, ils seront différents packages/apps.
J'ai essayé de suivre ce tutoriel qui m'a donné une assez bonne idée de comment avoir des préférences dans une application qui peut être lu par un autre. Essentiellement, je crée un nouveau contexte à travers myContext = createPackageContext("com.example.package",Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
et ensuite appeler myContext.getSharedPreferences("pref_name", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
Cependant, je ne peux pas écrire dans les préférences avec succès à partir de l'extérieur de l'app - (SharedPreferences.De l'éditeur).commit() renvoie la valeur false et je reçois un avertissement dans le logcat au sujet d'être dans l'impossibilité de modifier pref_name.xml.bak.
Comment puis-je configurer correctement mon applications de sorte que les deux d'entre eux peuvent lire et écrire dans le même fichier de préférences (qui est stocké dans le dossier de données de l'un d'eux)?
- Pourquoi, lorsque vous dites que ce sont toujours installé, faut-il être deux applications différentes? Semble que beaucoup de maux de tête, donc je suppose que vous êtes représenter un avantage, mais je me demande si il pourrait y avoir une façon d'y parvenir sans avoir d'autres applications.
- Je voulais être en mesure d'installer des applications, définir les préférences, puis désinstaller l'interface de l'INTERFACE utilisateur, mais laissez-le service de continuer à aller dans le fond. Cela me permet aussi de mettre à niveau une application sans avoir à ré-installer les deux. Ce n'est certainement pas nécessaire (et je peut même pas l'utiliser), mais c'était une de mes idées pour la mise en œuvre de ce la façon dont je l'ai conçu.
Vous devez vous connecter pour publier un commentaire.
Il est préférable de définir le mode privé pour le fichier. Application doit être signé avec le même ensemble de certificats de partager ce fichier.
Ensemble sharedUserId dans les deux applications à la même.
Obtenir Contexte de autre paquet:
Obtenir des articles comme d'habitude à partir de SharedPreference. Vous pouvez accéder à maintenant.
Context.MODE_PRIVATE
avecContext.CONTEXT_RESTRICTED
.sharedUserId
une fois qu'une application a été publié: stackoverflow.com/questions/3254157/...Tout d'abord, je tiens à souligner que ce n'est pas officiellement pris en charge, même s'il peut être une façon de le faire (c'est à dire qu'il ne serait PAS cette méthode) a été ajoutée à Android dans le futur (source pour les réclamations: voir le deuxième paragraphe de ce lien).
Encore une fois, ce n'est pas pris en charge et est très probablement instable. J'ai d'abord fait ceci comme une expérience pour voir si c'était possible; prendre une extrême prudence si vous êtes planification à fait d'intégrer cette méthode dans une application.
Toutefois, il semble possible de partager entre les préférences des applications si certaines conditions sont remplies. Tout d'abord, si vous souhaitez que l'Application B pour être en mesure d'accéder à Une Application de préférences le nom du package de l'Application B doit être un enfant de l'App, du nom du paquet (par exemple, l'Application A:
com.example.pkg
l'Application B:com.example.pkg.stuff
). En outre, ils ne peuvent pas être désireux d'accéder au fichier en même temps (je suppose que les mêmes règles s'appliquent que pour y accéder entre les activités, si vous voulez vous assurer atomique d'accès que vous aurez à utiliser des garanties supplémentaires telles que .wait() et .notify(), mais je n'entrerai pas ici).Remarque: il fonctionne sur l'émulateur sur 2.2 et 2.3.3 - je n'ai pas testé à travers les dispositifs ou les versions d'android.
Choses à faire dans l'application qui va propres préférences (App Un de ci-dessus):
1.) Déclarer les SharedPreferences fichier
C'est assez simple. Il suffit de déclarer quelques variables pour votre sharedpreferences fichier et l'éditeur de votre classe et de les instancier dans votre méthode onCreate. Vous pouvez mettre une chaîne dans les préférences maintenant que vous allez utiliser pour vous assurer que l'application d'autres peuvent le lire correctement.
2.) Configurer le fichier de sauvegarde
Le getSharedPreferences méthode apparaît à vérifier .bak fichier à charger les préférences de. C'est pourquoi il est dit dans la documentation que cela ne fonctionne pas à travers de multiples processus; de minimiser les I/O, il charge les prefs une FOIS lorsque vous les prenez, et ne les sauvegarde lorsque vous fermez votre application ou de l'activité. Toutefois, si vous appelez cela de l'extérieur de l'application, vous obtiendrez un avertissement de ne pas avoir le droit d'autorisations de fichier pour le dossier (qui est la première application du dossier de données). Pour corriger cela, nous allons créer la .bak fichier nous-mêmes et de les rendre publiquement accessible en lecture/écriture. La façon dont j'ai choisi de le faire a été de définir trois variables dans mon ensemble de la classe.
et de faire une fonction dans ma classe principale qui prendrait ces arguments et de les exécuter
Il n'est pas très joli, ou bon, mais il fonctionne.
Maintenant, dans votre méthode onCreate (juste après l'éditeur.commit())vous permettra d'appeler cette fonction avec chacune des trois chaînes de caractères.
Cela va copier le fichier et de le rendre à la fois le principal .xml et le .xml.bak fichiers accessibles à l'extérieur de programmes. Vous devez également appeler ces trois méthodes dans votre onDestroy() pour vérifier que la base de données est sauvegardée correctement lorsque votre application se ferme, et en outre les appeler, juste avant d'appeler getSharedPreferences ailleurs dans votre application (sinon il va charger la .bak fichier qui est probablement en dehors de la date si un autre processus a été l'édition de la principale .fichier xml). C'est tout ce que vous devez faire dans cette application, si, si. Vous pouvez appeler getSharedPreferences ailleurs dans cette activité et il se chargera de récupérer toutes les données de l' .fichier xml, vous permettant ensuite d'appeler la getdatatype("clé") les méthodes et les récupérer.
Choses à faire dans l'accès au fichier(s) (App B à partir de ci-dessus)
1.) Écrire dans le fichier
C'est encore plus simple. J'ai fait un bouton sur cette activité et à définir dans le code de la méthode onClick qui permettrait de sauver quelque chose du même fichier de préférences. Rappelez-vous que l'Application B paquet doit être un enfant de l'Application d'Un forfait. Nous allons créer un contexte basé sur l'Application d'Un contexte et d'appeler ensuite getSharedPreferences sur ce contexte.
Cet attrape la corde j'ai mis dans l'autre application et l'affiche (ou un message d'erreur) dans un textview dans cette application. En outre, elle définit une nouvelle chaîne de caractères dans le fichier de préférences et valide les modifications. Après ce court, si vos autres appels d'application getSharedPreferences de récupérer le fichier, y compris les modifications à partir de cette application.
ContentProvider
qui est soutenue par de votreSharedPreferences
.dd
ouchmod
. En fait, cela peut même être possible par le biais d'une autre technique - et si c'est j'espère que quelqu'un va poster une réponse. C'est juste la façon dont je l'ai eu à travailler.