サービスSharedPreferencesを使用して問題(getPreferencesがサービスに存在しません)

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

質問

私はActivityからサブクラス化されていないサービスからアクセスすることをいくつかの共有設定(緯度、経度)を有します。

私がアクセスgetPreferencesしようとすると、

特に、この機能は、サービス上の存在しません。私のコードは下に掲載されている。

ここでの私の目標は、WRITE私のサービスでこれらの共有設定をできるようにすることです。 ?

に沿って私を助けることができる任意の提案/例
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) {}
}

I入手ライン上のエラーsettings = this.getPreferences(MODE_WORLD_WRITEABLE);

役に立ちましたか?

解決

あなたが唯一持っている、あなたのアプリケーションのための1 SharedPreferencesを使用している場合の のすべてののあなたのコードPreferenceManager.getDefaultSharedPreferences()を経由してそれを取得します。

他のヒント

実際には、あなたのほとんどは、API> = 11を備えたデバイス上で、共有設定はもうデフォルトでは、マルチプロセスでの使用のために設定されていないこと。

、問題に実行している可能性があります

ソリューション:

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

リトル後半これにあなたを助けるために、私は、これは将来的に誰かに役立ちます願っています。 ここにあなたの問題があります:

    public void onCreate() {
       settings = this.getPreferences(MODE_WORLD_WRITEABLE);
       configEditor = settings.edit();
       writeSignalGPS();
    }
サービスが作成されたときにのみ、共有の設定ファイルを取得しているので、

、ファイルが適切にサービスによって更新されることはありませんので、データがアプリケーションで共有されることはありません。共有環境への書き込みまたは変更されている可能性のあるデータを取得する前に、共有の設定ファイル(リロード)を取得することを確認し、再びのような:

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

そして、あなたのアプリケーションでます:

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

また、サービスや活動を共有し、共有環境設定のシナリオを持っているアンドロイド3.0上で何か、あなたが使用する必要があります:

     settings = this.getPreferences(MODE_MULTI_PROCESS);

あなたが宣言した場合の SharedPreferences のように:

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

、値を取得するためにコードの下に使用します。

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

あなたもSharedPreferencesに値を保存することができ、同じようにしてます。

このにぶつかるの人々のために...私は同様の問題を抱えていた...問題の真の原因は、我々は/完全に初期化されていないコンテキストを使用取得しようとしているです..私は通常sharedPreferencesを使用することができました私のIntentServiceのための私のコンストラクタの外でます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top