Problemi nell'utilizzo SharedPreferences su un servizio (getPreferences non esiste su un servizio)

StackOverflow https://stackoverflow.com/questions/4214939

Domanda

ho alcune preferenze condivise (latitudine, longitudine) che voglio l'accesso da un servizio, che non è una sottoclasse di attività.

In particolare, quando si tenta di getPreferences di accesso, questa funzione non esiste di un servizio. Il mio codice è pubblicato sotto

Il mio obiettivo qui è quello di permettere scrivere queste preferenze in comune con il mio servizio. Eventuali suggerimenti / esempi che mi può aiutare a lungo?

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) {}
}

ottengo l'errore sulla linea settings = this.getPreferences(MODE_WORLD_WRITEABLE);

È stato utile?

Soluzione

Se si utilizza un solo SharedPreferences per la vostra applicazione, hanno tutti il codice di farlo tramite PreferenceManager.getDefaultSharedPreferences().

Altri suggerimenti

In realtà, la maggior parte di voi potrebbe essere in esecuzione nel problema, che su dispositivi con API> = 11, le preferenze condivise non sono impostate per l'uso a più processi per default più.

Soluzione:

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

Un po 'tardi per aiutarti su questo, ma spero che questo aiuta qualcuno in futuro. Ecco il problema:

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

Dal momento che si recupera solo il file Preferenza condiviso quando viene creato il servizio, il file non viene mai aggiornato correttamente dal servizio e, quindi, i dati vengono mai condivisi con l'applicazione. Prima di scrivere a Preferenze condivise o il recupero di tutti i dati che possono essere modificate, assicurarsi di recuperare il file Preferenza condivisa (reload) di nuovo tipo:

    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();
        }
    }

quindi nella vostra applicazione:

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

Inoltre, qualsiasi cosa su Android 3.0 che dispone di uno scenario in cui un servizio e una quota di attività Preferenze condivise, è necessario utilizzare:

     settings = this.getPreferences(MODE_MULTI_PROCESS);

Se avete dichiarato SharedPreferences come:

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

quindi utilizzare il codice qui sotto per andare a prendere i valori:

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

In stesso modo è anche possibile salvare i valori di SharedPreferences.

Per le persone che urtano questo ... Ho avuto un problema simile ... La vera causa del problema è che stiamo cercando di ottenere / utilizzare un contesto che non è completamente inizializzato .. Ero in grado di utilizzare normalmente sharedPreferences al di fuori della mia costruttore per la mia IntentService.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top