2010-11-18 14 views
27

मेरे पास कुछ साझा वरीयताएं (अक्षांश, देशांतर) है जो मैं किसी सेवा से एक्सेस करना चाहता हूं, जो गतिविधि से उप-वर्गीकृत नहीं है।किसी सेवा पर साझा किए गए संदर्भों का उपयोग करने में समस्याएं (GetPreferences किसी सेवा पर मौजूद नहीं है)

विशेष रूप से, जब मैं getPreferences तक पहुंचने का प्रयास करता हूं, तो यह फ़ंक्शन किसी सेवा पर मौजूद नहीं होता है। मेरा कोड नीचे पोस्ट किया गया है

मेरा लक्ष्य यहां मेरी साझा प्राथमिकताओं को मेरी सेवा के साथ लिखने की अनुमति देना है। कोई सुझाव/उदाहरण जो मुझे मदद कर सकता है?

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

मैं आप केवल अपने आवेदन के लिए एक SharedPreferences उपयोग कर रहे हैं पंक्ति settings = this.getPreferences(MODE_WORLD_WRITEABLE);

उत्तर

43

पर त्रुटि मिलती है, सभी अपने कोड PreferenceManager.getDefaultSharedPreferences() के माध्यम से इसे प्राप्त कर सकते है।

+0

क्या आप मुझे थोड़ा और बता सकते हैं कि मुझे वरीयता प्रबंधक का उपयोग करने के लिए मेरे कोडोड पर क्या बदलना है? मैं google पर खोज रहा हूं लेकिन मुझे – NullPointerException

+1

@ AndroidUser99 के लिए मान्य जानकारी नहीं मिल रही है: आप 'PrepectManager.getDefaultSharedPreferences()' पर कॉल के साथ 'getPreferences()' पर कॉल को प्रतिस्थापित करते हैं। – CommonsWare

+0

मैंने इसके साथ प्रयास किया: सेटिंग्स = प्राथमिकता प्रबंधक .getDefaultSharedPreferences (MODE_WORLD_WRITEABLE); लेकिन मुझे एक त्रुटि देता है, मैं क्या गलत कर रहा हूं? – NullPointerException

1

आप घोषित किया है, तो 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 को मान बचा सकता है।

2

इस पर आपकी सहायता करने में बहुत देर हो चुकी है, लेकिन मुझे उम्मीद है कि यह भविष्य में किसी की मदद करेगा।

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 पर कुछ भी है, जहां एक सेवा और एक गतिविधि शेयर साझा Prefs, आप का उपयोग करना चाहिए:

 settings = this.getPreferences(MODE_MULTI_PROCESS); 
19

असल में, आप का सबसे पी में चल रहा हो सकता है रॉबलेम, कि एपीआई> = 11 के साथ उपकरणों पर, साझा प्राथमिकताओं को अब डिफ़ॉल्ट रूप से बहु प्रक्रिया उपयोग के लिए सेट नहीं किया गया है।

समाधान:

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

@CommonsWare उत्तर पर टिप्पणी के अनुसार, आप इसे 'PreferencesManager.getDefaultSharedPreferences()' 'के साथ कैसे कर सकते हैं? मैं एक सेवा में हूं और मुझे अपनी डिफ़ॉल्ट साझा प्राथमिकताओं का नाम नहीं पता है। – gozzilli

+0

वास्तव में आप मुझे बचाओ। Thanx a lotttttttttttttttttt –

+0

'MODE_MULTI_PROCESS' को एपीआई 23 में बहिष्कृत कर दिया गया है। Http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS –

1

लोग हैं जो इस टक्कर के लिए ... मैं एक ऐसी ही समस्या थी ... समस्या का असली कारण हम पाते हैं/एक संदर्भ है कि पूरी तरह से नहीं है का उपयोग करने के कोशिश कर रहे हैं प्रारंभ किया गया .. मैं अपने इरादे सेवा के लिए सामान्य रूप से मेरे कन्स्ट्रक्टर के बाहर साझा किए गए साझाकरण का उपयोग करने में सक्षम था।

संबंधित मुद्दे