Problèmes d'utilisation SharedPreferences sur un service (getPreferences n'existe pas sur un service)

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

Question

J'ai des préférences partagées (latitude, longitude) que je veux accéder à partir d'un service, qui ne sont pas sous-classé de l'activité.

En particulier, lorsque je tente d'accéder getPreferences, cette fonction n'existe pas de sur un service. Mon code est affiché ci-dessous

Mon but ici est de permettre ECRITURE ces préférences partagées avec mon service. Toutes les suggestions / exemples qui peuvent me aider le long?

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

Je reçois l'erreur sur la settings = this.getPreferences(MODE_WORLD_WRITEABLE); ligne

Était-ce utile?

La solution

Si vous utilisez uniquement un SharedPreferences pour votre application, ont tous votre code obtenir via PreferenceManager.getDefaultSharedPreferences().

Autres conseils

En fait, la plupart d'entre vous être en cours d'exécution dans le problème, que sur les appareils avec API> = 11, les préférences partagées ne sont pas définies pour le processus multi-usages par défaut plus.

Solution:

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

un peu tard pour vous aider à ce sujet, mais j'espère que cela aide quelqu'un à l'avenir. Voici votre problème:

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

Puisque vous récupérer uniquement le fichier de préférences partagé lorsque le service est créé, le fichier est correctement mis à jour jamais par le service et donc les données ne sont jamais partagées avec l'application. Avant d'écrire à Préférences partagées ou récupérer toutes les données qui peuvent avoir changé, assurez-vous de récupérer le fichier de préférences partagé (reload) à nouveau comme:

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

puis dans votre application:

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

En outre, quoi que ce soit sur Android 3.0 qui a un scénario où un service et une part d'activité partagée Prefs, vous devez utiliser:

     settings = this.getPreferences(MODE_MULTI_PROCESS);

Si vous avez déclaré SharedPreferences comme:

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

puis utilisez le code ci-dessous pour chercher des valeurs:

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

De la même façon, vous pouvez même enregistrer des valeurs à SharedPreferences.

Pour les personnes qui bosse dans ce ... J'ai eu un problème similaire ... La vraie cause du problème est que nous essayons d'obtenir / utiliser un contexte qui n'est pas complètement initialisé .. j'ai pu utiliser sharedPreferences normalement en dehors de mon constructeur pour mon IntentService.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top