2010-11-30 12 views
7

दो ऐप्स समान साझा उपयोगकर्ता हैं। जब मैं ऐप 1किसी अन्य ऐप की फ़ाइलों निर्देशिका में एक निजी एक्सेस फ़ाइल लिखें

context.openFileOutput("/data/data/org.me.app2/files/shared-data.dat", MODE_PRIVATE) 

में मुझे इस कोड का उपयोग करता है तो मुझे एक अपवाद मिलता है कि फ़ाइल में पथ विभाजक होता है।

मैं ऐप 1 से ऐप 2 के स्टोरेज में एक फाइल लिखने की कोशिश कर रहा हूं। मैं बजाय एक ऐप्लिकेशन विशिष्ट निर्देशिका का एक उपयोगकर्ता खास डायरेक्टरी में लिखते थे

आदर्श रूप में (मैं निश्चित रूप से ऐसा लगता है कि APP2 की फाइलें निर्देशिका पहले से मौजूद है बनाने की जरूरत है), है, लेकिन मैं नहीं जानता कि अगर वह किया जा सकता है

उत्तर

6

सबसे पहले, कभी भी /data/data जैसे आंतरिक संग्रहण के लिए पूर्ण पथ का उपयोग न करें। ऑपरेटिंग सिस्टम आपको पथ दें (उदाहरण के लिए, Context.getFilesDir() या Environment.getExternalStorageState() के माध्यम से)। डेटा कहां पर धारणा मत बनो।

दूसरा - आप पहले से ही ऐसा कर रहे हैं! File के विपरीत, Context.openFileOutput पहले से ही आपके पथ पर /data/data/[package] तैयार करता है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है। बस फ़ाइल का नाम निर्दिष्ट करें।

यदि आप वास्तव में लगता है कि यह सुरक्षित है और आवश्यक है, और दोनों क्षुधा एंड्रॉयड का उपयोग कर एक ही उपयोगकर्ता ID को साझा करते हैं: प्रकट में sharedUserId, आप Context.createPackageContext() का उपयोग करके अन्य एप्लिकेशन के संदर्भ मिलता है और CONTEXT_RESTRICTED उपयोग कर सकते हैं, तो openFileOutput का उपयोग केवल फ़ाइल नाम के साथ।

+1

लेकिन मैं कैसे कहूं कि एप 1 को एप 2 में फाइल लिखनी चाहिए? –

+1

यह आमतौर पर निराश होता है। आपको कभी भी किसी अन्य ऐप के निजी संग्रहण में लिखना नहीं चाहिए! MODE_PRIVATE विशेष रूप से आपको बहुत अच्छा नहीं करेगा - डेटा अन्य ऐप द्वारा भी पठनीय नहीं होगा! यदि आपको वास्तव में वास्तव में करना है, तो पूर्ण पथ निर्दिष्ट करने के लिए 'फ़ाइल' का उपयोग करें। लेकिन ऐसा लगता है कि आप शुरू करने के लिए गलत दृष्टिकोण का उपयोग कर रहे हैं। – EboMike

+1

सबसे पहले (मुझे लगता है) MODE_PRIVATE काम करेगा क्योंकि मैं एक ही साझा यूज़र आईडी का उपयोग कर रहा हूं। दूसरा, मैं दोनों ऐप्स को साझा डेटा लिखने की योजना बना रहा था। यह महत्वपूर्ण है कि अज्ञात ऐप्स के पास साझा डेटा तक पहुंच न हो। –

2

आपको अन्य एप्लिकेशन फ़ाइलों को ओवरराइट नहीं करना चाहिए। यही कारण है कि कहा कि तुम दो समाधान

(एसडी कार्ड की तरह)
  1. उपयोग सार्वजनिक बाह्य भंडारण क्षुधा के बीच फ़ाइल साझा करने के लिए।
  2. यदि अन्य ऐप आपका नहीं है तो आप रूट के बिना इसकी/डेटा निर्देशिका में नहीं लिख सकते हैं। रूट के साथ कुछ भी संभव है, बस अपने उपयोगकर्ताओं को रूट पहुंच के लिए उम्मीद नहीं है।

संपादित करें: डेवलपर दोनों अनुप्रयोगों इस ओर इशारा करते हुए के लिए रोमन Kurik के लिए

धन्यवाद का मालिक है। SO

पर अपने पद का एक लिंक एंड्रॉयड docs

एंड्रॉयड से:

एक लिनक्स उपयोगकर्ता ID कि अन्य अनुप्रयोगों के साथ साझा किया जा का नाम sharedUserId। डिफ़ॉल्ट रूप से, एंड्रॉइड प्रत्येक एप्लिकेशन को अपनी अनूठी उपयोगकर्ता आईडी निर्दिष्ट करता है। हालांकि, यदि यह विशेषता पर दो या दो से अधिक अनुप्रयोगों के लिए समान मान पर सेट है, तो वे सभी समान आईडी साझा करेंगे - बशर्ते वे उसी प्रमाणपत्र द्वारा हस्ताक्षरित भी हों। उसी उपयोगकर्ता आईडी के साथ आवेदन एक-दूसरे के डेटा तक पहुंच सकता है और यदि वांछित है, तो उसी प्रक्रिया में चलाएं।

तो यह वास्तव में लिनक्स में उपयोगकर्ता आईडी का काम है, अनिवार्य रूप से आप दोनों के मालिक हैं और दोनों को पढ़ने/लिखने के लिए उपयोग है।

+0

दो ऐप्स में एक ही साझा यूज़र आईडी है। मैं दोनों एप्स को नियंत्रित करता हूं। यह भी महत्वपूर्ण है कि असंबंधित ऐप्स के पास मेरे डेटा तक पहुंच न हो। इसलिए मुझे नहीं लगता कि इनमें से दो विकल्प काम करेंगे ... लेकिन रूट के बारे में क्या है। क्या आप कह रहे हैं कि मैं अपना ऐप रूट के रूप में चला सकता हूं? –

+0

अधिकांश फोन पर रूट पहुंच हासिल करना संभव है, इस प्रकार कस्टम रोम स्थापित किए जा सकते हैं। वहां से एप्लिकेशन 'सुपरसुर' एप्लिकेशन के माध्यम से रूट का अनुरोध कर सकते हैं। लेकिन चूंकि आप दोनों को नियंत्रित करते हैं, वहां एक आसान समाधान होना चाहिए, मैं थोड़ी देर में आपके पास वापस आऊंगा। – smith324

+0

उपरोक्त मेरी पोस्ट में संपादन को देखें। – smith324

5

ओपन जरूरत फ़ाइल की एक FileOutputStream, इस पथ के सापेक्ष:

String filePath = getPackageManager(). 
    getPackageInfo("com.your2ndApp.package", 0). 
    applicationInfo.dataDir; 
+0

+1: मैं पूर्ण पथ का उपयोग किए बिना संशोधन समय/अन्य ऐप पर मौजूद होने के लिए इसका उपयोग करने में सक्षम था .. धन्यवाद। –

+1

वास्तव में मैं 'createPackageContent' –

5

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

डेटा साझा करना क्या ContentProviders के लिए कर रहे हैं। यह मानते हुए कि आप ContentProvider को लिखने और इसे एक्सेस करने के बारे में जानते हैं, आप ParcelFileDescriptor के माध्यम से फ़ाइलों तक पहुंच सकते हैं, जिसमें मोड बनाने के लिए स्थिरता शामिल है जिसमें आप फ़ाइलें बनाते हैं।

क्या तुम अब जरूरत है ताकि नहीं हर कोई सामग्री प्रदाता के माध्यम से फ़ाइलों को पढ़ सकता पहुँच को सीमित करने के लिए है, और आप कर एंड्रॉयड अनुमतियों के माध्यम से है। एक अपने ऐप्स में से प्रकट, एक है कि फ़ाइलों और सामग्री प्रदाता की मेजबानी करेगा, कुछ इस तरह लिखने में: का उपयोग करके ProtectionLevel =

<uses-permission android:name="com.example.android.provider.ACCESS" /> 

:

<permission android:name="com.example.android.provider.ACCESS" android:protectionLevel="signature"/> 

और दोनों ऐप्लिकेशन में इस ऐड "हस्ताक्षर", केवल आपके द्वारा हस्ताक्षरित ऐप्स आपके सामग्री प्रदाता, और इस प्रकार आपकी फाइलों तक पहुंच सकते हैं।

+0

का उपयोग करके समाप्त हुआ बहुत दिलचस्प। हालांकि, मैं इसे आजमाने की कोशिश नहीं कर पाऊंगा, क्योंकि समाधान पहले ही लागू हो चुका है, और किसी भी/सभी अतिरिक्त ऐप्स/अपग्रेड शायद मौजूदा सिस्टम का पुन: उपयोग करेंगे। वैसे भी +1। मुझे लगता है कि आपका समाधान मान्य है भले ही मैं इसका परीक्षण नहीं कर पा रहा हूं। –

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