/ / एसडी कार्ड के लिए पथ प्राप्त करना

एसडी कार्ड के लिए रास्ता प्राप्त करना - एंड्रॉइड, एंड्रॉइड-एसडीकार्ड, एसडी कार्ड, एंड्रॉइड-7.0-नौगेट, एंड्रॉइड-बाहरी-स्टोरेज

कृपया नीचे दिए गए मतदान और / या इसे डुप्लिकेट के रूप में चिह्नित करने से पहले पूरी पोस्ट पढ़ें!

मैं एक ऐसे ऐप पर काम कर रहा हूं, जिसमें से फाइलें पढ़ी जाती हैंउपयोगकर्ता के फोन पर एक विशिष्ट फ़ोल्डर के भीतर - या तो एसडी कार्ड से (यदि वहाँ एक है) या अंतर्निहित भंडारण से। हां, "READ_EXTERNAL_STORAGE" का उल्लेख प्रकट में किया गया है और मैं API> 23 के लिए अनुमति पॉपअप को संभाल रहा हूं।

मैं बस इस्तेमाल करता था

File folder = new File(Environment.getExternalStorageDirectory(), "myfolder");

में संग्रहीत फ़ोल्डर का पथ प्राप्त करने के लिएबिल्ट इन स्टोरेज (एक S7 के लिए 32 जीबी) लेकिन अब मैं एसडी कार्ड का रास्ता निकालना चाहता हूं। बहुत ज्यादा हर परिणाम के अनुसार google ने मुझे दिया, "Environment.getExternalStorageDirectory ()" आपको SD कार्ड का रास्ता देना है, लेकिन मेरे लिए यह t (और कभी नहीं) है।

मैंने दो अलग-अलग सैमसंग गैलेक्सी S7s के साथ निम्नलिखित का परीक्षण किया, दोनों एंड्रॉइड 7.0 के साथ, एक एसडी कार्ड (+ फ़ोल्डर) के साथ, दूसरा बिना (+ फ़ोल्डर):

Log.d(tag, System.getenv("EXTERNAL_STORAGE"));
Log.d(tag, System.getenv("SECONDARY_STORAGE"));
Log.d(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+"myfolder").isDirectory());
Log.e(tag, ""+new File(System.getenv("EXTERNAL_STORAGE")+File.separator+ordner).getAbsolutePath());
Log.d(tag, Environment.isExternalStorageRemovable());
Log.d(tag, Environment.getExternalStorageDirectory());
Log.d(tag, Environment.getExternalStorageDirectory().getAbsolutePath());

मेरे आश्चर्य के लिए दोनों फोन एक ही infos उत्पादन:

/sdcard
null
true
/sdcard/myfolder
false
/storage/emulated/0
/storage/emulated/0

फाइल मैनेजर ऐप ("माई फाइल्स") के अनुसार, स्टोरेज में निर्मित "इंटरनल स्टोरेज" कहलाता है, जो और भी कम मायने रखता है (मुझे एंड्रॉइड में इंटरनल और एक्सटर्नल स्टोरेज के बीच का अंतर पता है)।

मुझे वास्तविक एसडी कार्ड का रास्ता कैसे मिलेगा (इसे हार्डकोड किए बिना)?

उत्तर:

उत्तर № 1 के लिए 1

आपको अपने आवेदन की घोषणा फ़ाइल में निम्नलिखित अनुमति देनी होगी:

<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android" >

<!-- Add this -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

</manifest>

उत्तर № 2 के लिए 1

एकमात्र तरीका जो मैंने पाया है वह है सेमी-हार्डकोड:

File[] folders = myappcontext.getExternalCacheDirs();

आपको "कैश" फ़ोल्डरों के लिए रास्ता देता है जो आपके ऐप की पहुंच है (लेकिन जब आप अपने ऐप को अनइंस्टॉल कर देते हैं तो वे डिलीट हो जाते हैं)।

यदि फोन एक हटाने योग्य एसडी कार्ड का उपयोग करता है (जो वर्तमान में घुड़सवार है), तो सरणी की लंबाई "2" होनी चाहिए।

  1. बाह्य (हटाने योग्य नहीं) संग्रहण में "कैश" फ़ोल्डर का पथ
  2. आपके SD कार्ड पर "कैश" फ़ोल्डर का पथ

वे कुछ इस तरह दिखते हैं:

/storage/emulated/0/Android/data/com.mycompany.myapp/cache
/storage/xxxx-xxxx/Android/data/com.mycompany.myapp/cache

... जहाँ "x" आपके sd कार्ड का नंबर (id?) है। मैं केवल 2 अलग एसडी कार्ड के साथ यह परीक्षण करने में सक्षम था और दोनों की अपनी संख्या थी।

Environment.getExternalStorageDirectory();

आपको भी देना चाहिए

/storage/emulated/0/

बाहरी संग्रहण तक पहुँच प्राप्त करने का गैर-कठिन तरीका है। ;)

यदि आप अपने पीसी पर अपने एसडी कार्ड के पहले स्तर पर एक नया फ़ोल्डर बनाते हैं, तो इसका पथ निम्न होगा:

/storage/xxxx-xxxx/myfolder

मुझे भी आपको चेतावनी देनी है: जब आप "myfolder" फ़ोल्डर को पढ़ सकते हैं, तो आप इसे "t लिख सकते हैं (केवल एंड्रॉइड 7 के साथ एक" एक्सेस अस्वीकृत "अपवाद फेंकेंगे) किटकैट के साथ आए पूरे सिस्टम में परिवर्तन के कारण। लेकिन यह" एक अलग समस्या है। मैं एक नए प्रश्न में संबोधित करने जा रहा हूं।