Probleme mit SharedPreferences auf einem Service (getPreferences existiert nicht auf einem Dienst)

Ich habe einige gemeinsame Vorlieben (Breitengrad, Längengrad), die ich von einem Dienst zugreifen möchte, der nicht von der Aktivität untergeordnet ist.

Insbesondere wenn ich versuche, auf getPreferences zuzugreifen, existiert diese Funktion nicht bei einem Dienst. Mein Code ist unten gepostet

  • Multi Selektion Spinner in Android ohne AlertDialog
  • Gleichmäßig beabstandete Menüpunkte auf der Symbolleiste
  • Verwenden von surfaceView, um ein Video zu erfassen
  • Kann ich meine Android App als Debug bauen, aber unterschreiben mit Release Keystore
  • OSMDroid PathOverlay
  • Android Studio 2.3 Beta 1 + Support 25.1.0 = Vorschau gebrochen
  • Mein Ziel hier ist, WRITE diese geteilten Vorlieben mit meinem Service zu erlauben. Irgendwelche Vorschläge / Beispiele, die mir helfen können?

    public class MyService extends Service implements Runnable { LocationManager mLocationManager; Location mLocation; MyLocationListener mLocationListener; Location currentLocation = null; static SharedPreferences settings; static SharedPreferences.Editor configEditor; public IBinder onBind(Intent intent) { return null; } public void onCreate() { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); writeSignalGPS(); } private void setCurrentLocation(Location loc) { currentLocation = loc; } private void writeSignalGPS() { Thread thread = new Thread(this); thread.start(); } @Override public void run() { mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Looper.prepare(); mLocationListener = new MyLocationListener(); mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 0, mLocationListener); Looper.loop(); //Looper.myLooper().quit(); } else { Toast.makeText(getBaseContext(), getResources().getString(R.string.gps_signal_not_found), Toast.LENGTH_LONG).show(); } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (currentLocation!=null) { configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); configEditor.commit(); } } }; private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { if (loc != null) { Toast.makeText(getBaseContext(), getResources().getString(R.string.gps_signal_found), Toast.LENGTH_LONG).show(); setCurrentLocation(loc); handler.sendEmptyMessage(0); } } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} } 

    Ich bekomme den Fehler auf der Zeile settings = this.getPreferences(MODE_WORLD_WRITEABLE);

  • Alle Zeilen aus einer Tabelle löschen, nullpointer auslöst
  • Wie integriere ich Matlab-Code-Bibliothek mit Android?
  • Erkennung, ob ein VideoVIew puffert
  • Wrapping Langtext auf einem Android Canvas
  • Checkbox auto call onCheckedChange wenn Listenansicht scrollen?
  • Unterschied zwischen Admob-Anzeigen und Firebase-Anzeigen
  • 5 Solutions collect form web for “Probleme mit SharedPreferences auf einem Service (getPreferences existiert nicht auf einem Dienst)”

    Wenn Sie nur eine SharedPreferences für Ihre Anwendung verwenden, haben Sie alle Ihren Code über PreferenceManager.getDefaultSharedPreferences() .

    Tatsächlich können die meisten von euch in das Problem laufen, dass bei Geräten mit API> = 11 die gemeinsamen Einstellungen für die Multi-Prozess-Nutzung standardmäßig nicht mehr festgelegt sind.

    Lösung:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS); } else { prefs = getSharedPreferences(PREFS, 0); } 

    Wenig spät, um dir zu helfen, aber ich hoffe das hilft jemand in der Zukunft. Hier ist dein Problem:

      public void onCreate() { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); writeSignalGPS(); } 

    Da Sie die freigegebene Präferenzdatei nur abrufen, wenn der Dienst erstellt wird, wird die Datei vom Service nie ordnungsgemäß aktualisiert und somit werden die Daten niemals mit der Anwendung geteilt. Bevor Sie auf Freigegebene Einstellungen schreiben oder alle Daten abrufen, die sich möglicherweise geändert haben, stellen Sie sicher, dass Sie die freigegebene Voreinstellungsdatei (neu laden) erneut abrufen:

      private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (currentLocation!=null) { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); configEditor.commit(); } } 

    Dann in deiner Anwendung:

      settings = this.getPreferences(MODE_WORLD_WRITEABLE); String myLat = setttings.getString("mylatitude",""); 

    Auch alles auf Android 3.0, die ein Szenario, wo ein Dienst und eine Aktivität teilen Shared Prefs, sollten Sie verwenden:

      settings = this.getPreferences(MODE_MULTI_PROCESS); 

    Wenn Sie SharedPreferences als:

     private static final String PREFS_NAME = "UserData"; private static final String PREFS_VALUE1 = "value1"; 

    Dann verwenden Sie den untenstehenden Code, um Werte zu holen:

     SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); value1 = preferences.getString(PREFS_VALUE1, "0"); 

    In gleicher Weise können Sie sogar Werte in SharedPreferences speichern.

    Für Leute, die in dieses stoßen … Ich hatte ein ähnliches Problem … Die wahre Ursache des Problems ist, dass wir versuchen, einen Kontext zu bekommen / verwenden, der nicht vollständig initialisiert ist. Ich war in der Lage, sharedPreferences normalerweise außerhalb von mir zu benutzen Konstruktor für meinen IntentService.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.