Preferences von mehreren apps aus zugreifen

  • Antworten:9
  • Bentwortet
Jan Roessler
  • Forum-Beiträge: 22

20.04.2012, 14:32:02 via Website

Ich speichere in meiner cos.client.config app die zugangseinstellungen zum backend in der cos.xml.
alle weiteren apps sollen aus dieser die zugangsdaten holen und, wenn sich die sessionID (aus dem backend) aendert, diese auch wieder dort ablegen.
ich hatte irgendwo gelesen, das apps auf die sharedPrefs all der apps zugreifen koennen, die die selbe signierung haben. damit sollte es ja gehen da meine apps alle mit der selben signatur versehen werden sollen.
nun bin ich aktuell nur im emulator unterwegs, der wiederum soll ja eh nur die selbe dummysignatur verwenden.
also muesste ich auch auf die prefs zugreifen koennen.
aber geht nicht.

muss ich die prefs noch bekannt machen? wenn ja, wo?

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.04.2012, 14:53:24 via Website

Jan Roessler
ich hatte irgendwo gelesen, das apps auf die sharedPrefs all der apps zugreifen koennen, die die selbe signierung haben.
Wäre mir neu.

AFAIK sind die nur innerhalb einer App sichtbar per default, oder wenn man MODE_WORLD_READABLE nutzt für alle(!) anderen Apps sichtbar.

Hierzu folgendes auss der Doku:

public static final int MODE_PRIVATE
Since: API Level 1

File creation mode: the default mode, where the created file can only be accessed by the calling application (or all applications sharing the same user ID).

Was ist mit user ID gemeint?

Each Android package (.apk) file installed on the device is given its own unique Linux user ID, creating a sandbox for it and preventing it from touching other applications (or other applications from touching it). This user ID is assigned to it when the application is installed on the device, and remains constant for the duration of its life on that device.

Antworten
Jan Roessler
  • Forum-Beiträge: 22

20.04.2012, 15:19:08 via Website

mist!
was waere denn der regulaere weg, zugangsdaten fuer mehrere apps (halt alle von mir) abzulegen?
klar sollte keine andere app drauf zugreifen duerfen.
mir faellt da nur der weg ueber einen service ein. da der zugang ja ueber die permissions geht und diese vom benutzer bei der installation bestaetigt werden muessen. soweit ich weiss.
nur hab ich die variante mit dem service verworfen als ich merkte, das er beim bind nicht wirklich sofort gebunden ist und ich somit auf die nullpointerexception lief.

was die sessionID angeht, mein backend liefert nach einer authentifizierung eine sessionID unter der man ohne die login+passwort daten weitere kontakt durchfuehren kann. um diese halt nicht immer durchs netz zu jagen.
diese verfaellt irgendwann und soll dann automatisch von der app , bei der der sessionverfall bemerkt wird, wieder eingetragen werden.

ich hab ausser den prefs nix gefunden was so aussieht als obs meinen vorstellungen entspricht. aber kann mir nicht vorstellen das ich der einzige bin der sowas braucht.

Antworten
Ansgar M
  • Forum-Beiträge: 1.544

20.04.2012, 17:03:38 via App

Hey,
soweit ich weiß, laufen deine Apps (sofern sie alle mit dem selbem Key signiert sind) unter der selben ID.
Lg Ansgar

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

20.04.2012, 17:10:34 via Website

Ansgar M
Hey,
soweit ich weiß, laufen deine Apps (sofern sie alle mit dem selbem Key signiert sind) unter der selben ID.
Lg Ansgar
Hmmm...gibt es dazu was sicheres?
Sonst müsste ich mal in meinen Apps prüfen, ob sich keine Schlüssel überschneiden.

Antworten
Florian B.
  • Forum-Beiträge: 284

20.04.2012, 18:05:53 via Website

Die SharedUserId gibt man im Manifest an.

android:sharedUserId
The name of a Linux user ID that will be shared with other applications. By default, Android assigns each application its own unique user ID. However, if this attribute is set to the same value for two or more applications, they will all share the same ID — provided that they are also signed by the same certificate. Application with the same user ID can access each other's data and, if desired, run in the same process.

Antworten
Jan Roessler
  • Forum-Beiträge: 22

20.04.2012, 21:57:35 via Website

cool. also doch.
nun nurnoch, zu dem "wenn gewuenscht"
Application with the same user ID can access each other's data and, if desired, run in the same process.
ich haetts schon gerne das die apps NICHT im selben prozess laufen. die solln sich nicht stoeren.
wie kann ich das ein- bzw. ausschalten?

habs grad mit der sharedUserID ausprobiert. beide apps haben die selbe ... geht nicht.
aber evtl. muss ich die ja vorher mal komplett aus dem emulator deinstallieren.

nein, auch eine deinstallation der apps und neu aktivierung lassen keinen zugriff der zweiten app auf das pref file der ersten zu.
ist es richtig die android:sharedUserId="COS-CLIENT-APP" in <application> zu setzen?
NEIN, die gehoert ins <manifest> unter versionName.

aber es geht nicht.
die konsole liefert bei der installation :
[2012-04-20 21:56:55 - cos_config] Installing cos_config.apk...
[2012-04-20 21:56:59 - cos_config] Installation error: INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID
[2012-04-20 21:56:59 - cos_config] Please check logcat output for more details.
[2012-04-20 21:56:59 - cos_config] Launch canceled!

dabei ist sie so definiert :
1<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2 package="cos.client.config"
3 android:versionCode="1"
4 android:versionName="1.0"
5 android:sharedUserId="cosclientapp" >

auch wenn sie rein numerisch ist kommt dieser fehler.

format ist : android:sharedUserId="cos.client.app"

hilft aber auch noch nix, die zweite app kann nicht auf die prefs der ersten zugreifen ....

— geändert am 20.04.2012, 22:25:00

Antworten
Florian B.
  • Forum-Beiträge: 284

20.04.2012, 22:21:32 via Website

Also laut Doku muss das Attribut nicht in das <application> Tag sondern, direkt in das <manifest> Tag.

Ich hab das leider noch nie selbst ausprobiert, daher kann ich auch nur die Doku zu Rat ziehen. Allerdings würde ich mir keine Gedanken machen, mehrere Apps in einem Prozess laufen zu lassen, ich denke eigentlich nicht dass es dort zu Problemen kommen sollte.

Eine andere Möglichkeit wäre sonst vielleicht die Einstellungen normal pro App abzuspeichern und einen Service zum Synchronisieren der Einstellungen zu verwenden. Sodass der User einfach die Daten in die andere App übernehmen kann. Das könnte natürlich auch automatisch im Hintergrund ablaufen. Allerdings wirst du dann natürlich mit Nutzerkonten arbeiten müssen, damit man zwei Apps, die sich Daten teilen sollen, aneinander binden kann. Wenn du das nicht selber bauen willst, dann könntest du auch den Dienst von www.parse.com nutzen. Parse bietet dir ein Backend für deine Apps um dort Daten abzulegen. Es wird dafür eine API bereitgestellt, sodass es recht einfach ist Daten zu speichern oder wieder zu laden. Auch bietet Parse alles was nötige ist um eine User-Accounts in deine App zu integrieren.

Antworten
Jan Roessler
  • Forum-Beiträge: 22

20.04.2012, 22:33:23 via Website

ein backend hab ich selber.
um mit diesem zu kommunizieren will ich die zugangsdaten lokal im geraet speichern.
dazu hab ich zwei wege die ich verfolge.
1. eine app pflegt die konfigurationsdatei, alle anderen laden aus der nur die zugangsdaten und speichern die sich aendernde sessionID
2. eine app pflegt die konfigurationsdatei und stellt einen service zur verfuegung, der von den anderen apps direkt fuer den zugang zum backend genutz wird.

die zweite war die mir liebste, da ich dann nur in der app mit dem service die classen zur kommunikation mit dem backend habe und bei nem update nur die app mit dem service ausgetauscht werden muss. ausserdem ist damit sichergestellt das alle apps den selben softwarestatus der konnektivitaet haben. nur bin ich in probleme geraten mit dem bind zum service der ja asyncron laeuft und wenn ich zu schnell bin noch null ist und mir der zugang zum service um die ohren fliegt.

wenn das aber mit dem direkten zugriff auf das pref-file nix wird, werd ich die variante mit dem service umsetzen. muss da halt nurnoch rausbekommen wie ich das mit dem bind zum service zuverlaessig hinbekomme.

update:
hab nun die variante mit dem service umgesetz. hat sich also erledigt.
danke

— geändert am 27.04.2012, 22:39:10

Antworten