2012-09-19 12 views
9

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जो एक साझा प्रतिभा फ़ाइल के माध्यम से डिवाइस पर स्थापित अन्य अनुप्रयोगों के साथ इंटरैक्ट करता है।विभिन्न अनुप्रयोगों में एंड्रॉइड साझा प्राथमिकताएं

यह फ़ाइल MODE.WORLD_READABLE के रूप में बनाई गई थी और प्रत्येक स्थापित एप्लिकेशन की एक सामान्य परिभाषित नाम और संपत्ति (उस विशिष्ट संपत्ति के लिए मूल्य क्या है) के साथ अपनी फ़ाइल है।

उदाहरण के लिए, एपीए और एपबी में प्रत्येक व्यक्ति को "app_shared_file.xml" नामक एक साझा फ़ाइल होनी चाहिए जिसमें संपत्ति "property_shared_file" हो।

मेरे आवेदन से मैं पहले इस फ़ाइल तक पहुंचना चाहता हूं और उस संपत्ति मूल्य को पढ़ना चाहता हूं, और उस परिणाम के आधार पर मैं अपना निर्माण/अद्यतन करना चाहता हूं।

फिर भी, मुझे इसे प्राप्त करने में कुछ समस्याएं आ रही हैं। Android दस्तावेज़ पर मुझे लगता है कि:

पुन: प्राप्त करें और पकड़ वरीयताओं की सामग्री को फ़ाइल 'नाम', एक SharedPreferences जिसके माध्यम से आप प्राप्त कर सकते हैं और अपने मूल्यों को संशोधित लौटने। SharePreferences ऑब्जेक्ट का केवल एक उदाहरण ऑब्जेक्ट उसी नाम के लिए किसी भी कॉलर को पर वापस कर दिया गया है, जिसका अर्थ है कि वे जैसे ही वे बनाए जाते हैं, एक दूसरे के संपादन देखेंगे।

अन्य एप्लिकेशन साझा प्राथमिकता फ़ाइल पढ़ने के बाद, जब मैं अपनी संपादन को संपादित करने के बजाय सिस्टम को बनाने/अपडेट करने का प्रयास करता हूं, तो मैंने पिछले पढ़ने के लिए उपयोग किया है। यदि इसके विपरीत, मैं अपना अद्यतन करके शुरू करता हूं और बाद में अन्य ऐप पढ़ता हूं - दूसरे को पढ़ने के बजाय, जिस पर पहुंचा जा रहा है वह मेरा है।

कोई विचार?

कोड मैं साझा वरी पढ़ने के लिए उपयोग कर रहा हूँ है [जहां PackageName अन्य एप्लिकेशन pckg है]:

Context con = context.createPackageContext(packageName, Context.CONTEXT_IGNORE_SECURITY); 
SharedPreferences pref = con.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_WORLD_READABLE); 
pref.getBoolean(SHARED_PREF_PROP, false); 

कोड मैं एप्लिकेशन साझा वरी में लिखने के लिए उपयोग कर रहा हूँ है:

SharedPreferences prefs= getSharedPreferences(SHARED_PREF_NAME, context.MODE_WORLD_READABLE); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putBoolean(SHARED_PREF_PROP, value); 
editor.commit(); 

अग्रिम धन्यवाद।

उत्तर

3

SharedPreferences are stored local to the package name of your application. यह कैसा लगता है, आपके पास अलग-अलग पैकेज नामों के साथ दो पूरी तरह से अलग ऐप्स हैं। इसका मतलब है कि एक से पढ़ने के बजाय, आप एक ही नाम की दो फाइलें बना रहे हैं जो विभिन्न फ़ोल्डर्स में संग्रहीत हैं। SharedPreferences फ़ाइलों से अलग-अलग गतिविधियों को पढ़ने के लिए, आपको उन्हें उसी पैकेज नाम के तहत होना चाहिए जैसा कि AndroidManifest फ़ाइल द्वारा परिभाषित किया गया है।

दूसरा विकल्प, क्योंकि आप अन्य अनुप्रयोगों (मुझे लगता है) का पैकेज नाम पता है, यह मुख्य ऐप चुनना है जो इसे बनाएगा और इसे संभाल देगा। फिर सीधे यूआरआई का उपयोग कर फ़ाइल से सीधे पढ़ें। चूंकि आप MODE_WORLD_READABLE पर अनुमतियां सेट कर रहे हैं, इसलिए सिस्टम आपको ऐसा करने की अनुमति दे सकता है। हालांकि, यह आपको फ़ोल्डर को एक्सेस करने से रोक सकता है। मैंने व्यक्तिगत रूप से कभी कोशिश नहीं की है।

I believe I have found the answer you are looking for.

+0

हां, दो अलग-अलग एप्लिकेशन हैं और प्रत्येक एप्लिकेशन की अपनी साझा प्राथमिकता फ़ाइल को अपने साझा_prefs फ़ोल्डर में संग्रहीत किया जाता है। हां, मुझे पैकेजमैनेजर के माध्यम से अन्य एप्लिकेशन का पैकेज नाम पता है, लेकिन मेरे पास यह जानने का कोई विकल्प नहीं है कि कौन सी गतिविधि/कक्षा इसे संभालेगी। मैंने पहले से ही उस लिंक को देखा था, यहां समस्या एक ही नाम के साथ दो अलग-अलग साझा किए गए प्रीफ़्स तक पहुंच है - मेरा और दूसरा एप्लिकेशन। एक खोलने के बाद, जब मैं दूसरे को संदर्भ बिंदु को खोलने की कोशिश करता हूं, जिसे प्रारंभ में खोला जाता है और जिसे संदर्भ के रूप में नहीं भेजा जाता है। – user1683087

0

आप इस स्निपेट के साथ अन्य एप्लिकेशन से प्राथमिकताओं को पढ़ा जा सकता है।

String PACKAGE_NAME = "com.gr.iasi"; 
String PREFERENCE_NAME = "GlobalPrefsJorge"; 


try { 
     myContext = createPackageContext(PACKAGE_NAME,Context.MODE_WORLD_WRITEABLE);    
      SharedPreferences testPrefs = myContext.getSharedPreferences(PREFERENCE_NAME, Context.MODE_WORLD_READABLE); 

     Map<String, ?> items = testPrefs .getAll(); 
     for(String s : items.keySet()){ 
      //Print keys and values; 
      Log.i("***" +s.toString(), items.get(s).toString()); 
      } 

     } catch (NameNotFoundException e) {  
      e.printStackTrace(); 
     } 
संबंधित मुद्दे