Zum Hauptinhalt springen

SharedPreferences

SharedPreferences ist eine Möglichkeit in Android, um einfache Daten dauerhaft zu speichern. Es funktioniert ähnlich wie ein Schlüssel-Wert-Speicher. Du kannst verschiedene Einstellungen, Benutzerdaten oder andere Informationen in Form von Schlüssel-Wert-Paaren speichern und später abrufen.

Konstanten festlegen

Oft werden Shared Preferences verwendet um zwischenzuspeichern, damit Daten beim zurückkehren in die App erhalten bleiben. Dann empfiehlt es sich alle Schlüsselwerte in Konstanten zu speichern.

z.B.

private static final String PREFS_FILE = "MySettings";
private static final String PASSWORDINPUT = "passwordinput";
private static final String USERNAME = "username";
private static final String PIN = "pin";

Speichern von Shared Preferences

protected void onStop() {
super.onStop();

String username = "David";
boolean password = false;
int pin = 1234;

SharedPreferences preferences = getSharedPreferences(PREFS_FILE, MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(PASSWORDINPUT, password);
editor.putString(USERNAME, username);
editor.putInt(PIN, pin);
editor.commit();
}

Laden von Shared Preferences

protected void onResume() {
super.onResume();

SharedPreferences preferences = getEncrptedSharedPrefs();

Boolean password = preferences.getBoolean(PASSWORDINPUT, true);
String username = preferences.getString(USERNAME, null);
int pin = preferences.getInt(PIN, -1);

Toast.makeText(this, password + " " + username + " " + pin, Toast.LENGTH_SHORT).show();
}

Sicheres Speichern

Im obigen Beispiel wird ein Pin in den Shared Preferences gespeichert. Diese könnte einfach aus einer Datei ausgelesen werden, daher sollte eine Verschlüsselung erfolgen. Hierfür gibt es die Unterklasse EncryptedSharedPreferences

private SharedPreferences getEncrptedSharedPrefs() {
SharedPreferences preferences = null;
try {
preferences = EncryptedSharedPreferences.create(
"my_secure_prefs",
"my_master_key_alias",
this,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
return preferences;
}

Um das nun auf die sichere Methode zu wechseln muss nur noch in den Methoden onStop() und onResume() folgende Zeile ersetzt werden.

// alte Variante
// SharedPreferences preferences = getSharedPreferences(PREFS_FILE, MODE_PRIVATE);
// neue sichere Variante
SharedPreferences preferences = getEncrptedSharedPrefs();

Weiterhin muss in der build.gradle Datei die Abhängigkeit hinzugefügt werden.

dependencies {
implementation "androidx.security:security-crypto:1.0.0"
...

Kommentare