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


80

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

जवाबों:


209

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

File sdDir = Environment.getExternalStorageDirectory();

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

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

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

4
@ user244190 - मेरा अनुमान होगा कि आपका फ़ोन Android 1.5 चला रहा है। WRITE_EXTERNAL_STORAGE1.6 में पेश किया गया था, इसलिए यदि आप इसे आगे-संगत करना चाहते हैं तो आपको इसे अपने आवेदन में शामिल करना होगा।
डेव वेब

: @DaveWebb: कृपया मेरे सवाल यहाँ देख stackoverflow.com/questions/9351904/...
Saher Ahwal

किसी ने जवाब नहीं दिया और मुझे नहीं पता कि वह काम क्यों नहीं कर रहा है।
साहेर अहवाल

@DaveWebb - सही विचार है, लेकिन यह शायद नहीं है कि फोन 1.5 चला रहा है, बल्कि यह भी कहता है कि ऐप निर्दिष्ट करता है कि इसे 1.5 के खिलाफ बनाया गया था (या अधिक सामान्यतः) एक संस्करण बिल्कुल भी निर्दिष्ट नहीं करता है, और जब एक और हालिया फोन देखता है कि यह जोड़ता है पश्चगामी संगतता के लिए अनुमति।
क्रिस स्ट्रैटन

1

डेव के जवाब में ऊपर सुझाई गई तकनीक निश्चित रूप से एक अच्छा डिजाइन अभ्यास है, और हां बाहरी स्टोरेज तक पहुंचने के लिए AndroidManifest.xml फ़ाइल में अंततः आवश्यक अनुमति निर्धारित की जानी चाहिए।

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

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

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

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

दरअसल, अब मैं देख रहा हूं कि यह WRITE_EXTERNAL_STORAGE सेटिंग एक उपयोगकर्ता-अनुमति है, और यदि यह ऊपर के तरीके को सेट करता है, तो गतिविधि सेटिंग (एंड्रॉइड: अनुमति) के रूप में प्रकट होगी और मैनिफ़ेस्ट फ़ाइल में उपयोगकर्ता-अनुमति नहीं। ओह, मुझे अभी याद आया है, आपने उपयोगकर्ता-अनुमतियों को उपयोगकर्ता के प्रोजेक्ट गुणों को वीएस में सेट किया है (इसकी सभी अनुमतियों की एक चेकबॉक्स सूची)।
समिस

1
वे वास्तव में "उपयोगकर्ता-अनुमति" टैग का उपयोग करते हैं, "उपयोगकर्ता-अनुमति" नहीं, लेकिन इसके अलावा बाकी सब कुछ सच है।
samis

एक बात जो पूरी तरह से आवश्यक है अगर कॉल करना है (Build.VERSION.SDK_INT> = 19) {MainActivity.get ()। GetExternalFilesDirs (नल); } // एसडी / एंड्रॉइड / डेटा / your.package.name // तक पहुंच प्राप्त करने के लिए खुद को पैकेज बनाने का प्रयास न करें। इस कॉल के न होने से mkdir या mkdirs काम करने में असफल हो जाते हैं।
pstorli
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.