सवाल एसडी कार्ड को लिखने की अनुमति


मैं चाहता हूं कि मेरा ऐप एसडी कार्ड में एप्लीकेशन डीबी को संग्रहीत करे। मेरे कोड में मैं जांचता हूं कि निर्देशिका क्या है canWrite() मौजूद है, और यदि नहीं, तो एक फेंक दें IOException। इस विशेष उदाहरण में, मैं एसडी कार्ड पर रूट निर्देशिका में डीबी फ़ाइल की प्रतिलिपि बनाने की कोशिश कर रहा हूं, लेकिन यह एक फेंक रहा है IOException। मैं इसे लिखने में सक्षम होने के लिए फ़ोल्डर / फ़ाइल पर अनुमति कैसे बदल सकता हूं?


76
2018-01-23 02:29


मूल




जवाब:


आप सही हैं कि एसडी कार्ड निर्देशिका है /sdcard लेकिन आपको इसे कड़ी मेहनत नहीं करनी चाहिए। इसके बजाय, कॉल करें Environment.getExternalStorageDirectory() निर्देशिका प्राप्त करने के लिए:

File sdDir = Environment.getExternalStorageDirectory();

यदि आपने पहले से ऐसा नहीं किया है, तो आपको अपने ऐप को नीचे दिए गए लाइन को जोड़कर एसडी कार्ड को लिखने के लिए सही अनुमति देनी होगी:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

203
2018-01-23 05:56



धन्यवाद ... मैं आपके सुझाव के अनुसार अपना कोड बदल दूंगा। हालांकि वर्तमान में मेरे पास हार्ड कोड है, और मैनिफेस्ट फ़ाइल में अनुमति सेट नहीं है लेकिन यह मुझे इसे एसडी कार्ड में सहेजने की अनुमति देता है। मैं अनुमति सेट रखने के दौरान इसे कैसे बचा सकता हूं? - bugzy
@ user244190 - मेरा अनुमान होगा कि आपका फोन एंड्रॉइड 1.5 चला रहा है। WRITE_EXTERNAL_STORAGE 1.6 में पेश किया गया था, इसलिए यदि आप इसे आगे-संगत होना चाहते हैं तो आपको इसे अपने एप्लिकेशन में शामिल करना होगा। - Dave Webb
पकड़ लिया। धन्यवाद... - bugzy
@ डेववेब: कृपया मेरा प्रश्न यहां देखें:stackoverflow.com/questions/9351904/... - Saher Ahwal
किसी ने जवाब नहीं दिया है और मुझे नहीं पता कि यह क्यों काम नहीं कर रहा है। - Saher Ahwal


डेव के उत्तर में उपर्युक्त सुझाई गई तकनीक निश्चित रूप से एक अच्छी डिजाइन प्रैक्टिस है, और आखिरकार बाहरी संग्रहण तक पहुंचने के लिए एंड्रॉइडमैनीफेस्ट.एक्सएमएल फ़ाइल में आवश्यक अनुमति सेट की जानी चाहिए।

हालांकि, अधिकतर जोड़ने के लिए मोनो-एस्क्यू तरीका (यदि सभी नहीं, निश्चित नहीं हैं) "मैनिफेस्ट विकल्प" गतिविधि (या सेवा) को लागू करने वाले वर्ग के गुणों के माध्यम से है।

विजुअल स्टूडियो मोनो प्लगइन स्वचालित रूप से मैनिफेस्ट उत्पन्न करता है, इसलिए इसका सर्वोत्तम नहीं है मैन्युअल रूप से इसके साथ छेड़छाड़ (मुझे यकीन है कि ऐसे मामले हैं जहां कोई अन्य विकल्प नहीं है)।

उदाहरण के लिए:

[Activity(Label="MonoDroid App", MainLauncher=true, Permission="android.permission.WRITE_EXTERNAL_STORAGE")]
public class MonoActivity : Activity
{
  protected override void OnCreate(Bundle bindle)
  {
    base.OnCreate(bindle);
  }
}

1
2017-08-22 18:46



दरअसल, अब मैं देखता हूं कि यह WRITE_EXTERNAL_STORAGE सेटिंग उपयोगकर्ता-अनुमति है, और अगर यह ऊपर है, तो सेटिंग सेटिंग (एंड्रॉइड: अनुमति) के रूप में दिखाई देगी और मैनिफेस्ट फ़ाइल में उपयोगकर्ता-अनुमति नहीं होगी। ओह, मुझे बस याद आया, आप यूजर-अनुमति उपयोगकर्ता को वीएस में प्रोजेक्ट गुण सेट करते हैं (यह सभी अनुमतियों की एक चेकबॉक्स सूची है)। - samsara
वे वास्तव में "उपयोग-अनुमति" टैग हैं, न कि "उपयोगकर्ता-अनुमति", लेकिन इसके अलावा सबकुछ सत्य है। - samsara
एक चीज जो बिल्कुल जरूरी है, कॉल करना है (Build.VERSION.SDK_INT> = 19) {MainActivity.get ()। GetExternalFilesDirs (शून्य); } // एसडी / एंड्रॉइड / डेटा / your.package.name // तक पहुंच प्राप्त करने के लिए // पैकेज को स्वयं बनाने का प्रयास न करें। इस कॉल को mkdir या mkdirs में काम करने में असफल होने के परिणाम नहीं दे रहे हैं। - pstorli