Android 4.0+ এর জন্য আমি কীভাবে বাহ্যিক এসডি কার্ডের পথ পেতে পারি?


94

স্যামসং গ্যালাক্সি এস 3 এর একটি বাহ্যিক এসডি কার্ড স্লট রয়েছে, যা এতে মাউন্ট করা হয়েছে /mnt/extSdCard

আমি কীভাবে এই পথটি পেতে পারি Environment.getExternalStorageDirectory()?

এটি ফিরে আসবে mnt/sdcard, এবং আমি বাহ্যিক এসডি কার্ডের জন্য API খুঁজে পাচ্ছি না। (বা কিছু ট্যাবলেটে অপসারণযোগ্য USB স্টোরেজ))


কেন আপনি এটি চান? এ জাতীয় জিনিসগুলি করা অ্যান্ড্রয়েডে খুব অনাকাঙ্ক্ষিত। সম্ভবত আপনি যদি আপনার অনুপ্রেরণা ভাগ করে নেন তবে আমরা আপনাকে এই ধরণের জিনিসটির জন্য সেরা অনুশীলনের দিকে নির্দেশ করতে পারি।
rharter

4
আপনার ব্যবহারকারী যখন তাদের ফোন পরিবর্তন করেন, এসডি কার্ডটি নতুন ফোনে প্লাগ করুন, এবং প্রথম ফোনে এটি / এসডিকার্ড, দ্বিতীয় ফোনে এটি / এমএনটি / এক্সট্র্যাসকার্ড, ফাইল পাথ ব্যবহার করে যে কোনও কিছু ক্র্যাশ হয়ে যায়। এর তুলনামূলক পথ থেকে আমার সত্যিকারের পথ তৈরি করা দরকার।
রোমুলাস উড়াকগি সি'সাই

আমি এখন এই বিষয়টি পুরানো তবে এটি সাহায্য করতে পারে। আপনার এই পদ্ধতিটি ব্যবহার করা উচিত। System.getenv (); আপনার ডিভাইসে সংযুক্ত সমস্ত স্টোরেজ অ্যাক্সেস করতে প্রকল্প পরিবেশ 3 দেখুন। github.com/omidfaraji/ পরিবেশ 3
ওমিদ


এখানে আমার সমাধান যা নওগাট পর্যন্ত কাজ করে: stackoverflow.com/a/40205116/5002496
গোকুল এনসি

উত্তর:


58

আমি এখানে যে সমাধান পেয়েছি তার মধ্যে আমার পার্থক্য রয়েছে

public static HashSet<String> getExternalMounts() {
    final HashSet<String> out = new HashSet<String>();
    String reg = "(?i).*vold.*(vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
    String s = "";
    try {
        final Process process = new ProcessBuilder().command("mount")
                .redirectErrorStream(true).start();
        process.waitFor();
        final InputStream is = process.getInputStream();
        final byte[] buffer = new byte[1024];
        while (is.read(buffer) != -1) {
            s = s + new String(buffer);
        }
        is.close();
    } catch (final Exception e) {
        e.printStackTrace();
    }

    // parse output
    final String[] lines = s.split("\n");
    for (String line : lines) {
        if (!line.toLowerCase(Locale.US).contains("asec")) {
            if (line.matches(reg)) {
                String[] parts = line.split(" ");
                for (String part : parts) {
                    if (part.startsWith("/"))
                        if (!part.toLowerCase(Locale.US).contains("vold"))
                            out.add(part);
                }
            }
        }
    }
    return out;
}

আসল পদ্ধতিটি পরীক্ষা করে কাজ করা হয়েছিল

  • হুয়াওয়ে এক্স 3 (স্টক)
  • গ্যালাক্সি এস 2 (স্টক)
  • গ্যালাক্সি এস 3 (স্টক)

আমি নিশ্চিত নই যে এগুলি অ্যান্ড্রয়েড সংস্করণগুলি যখন পরীক্ষা করা হয়েছিল তখন তাদের কী ছিল।

আমি আমার সংশোধিত সংস্করণটি দিয়ে পরীক্ষা করেছি

  • মোটো জুম ৪.১.২ (স্টক)
  • গ্যালাক্সি নেক্সাস (সায়ানোজেনমড 10) একটি ওটিজি কেবল ব্যবহার করে
  • এইচটিসি অবিশ্বাস্য (সায়ানোজেনমড 7.2) এটি অভ্যন্তরীণ এবং বাহ্যিক উভয়ই ফিরিয়ে দিয়েছে। এই ডিভাইসটি এমন এক অদ্ভুতরূপ যা এর অভ্যন্তরীণভাবে বৃহত্তরভাবে অব্যবহৃত হয়ে যায় কারণ getExternStorage () পরিবর্তে এসডকার্ডে কোনও পথ ফেরায়।

এবং কিছু একক স্টোরেজ ডিভাইস যা তাদের প্রধান স্টোরেজ হিসাবে একটি এসডকার্ড ব্যবহার করে

  • এইচটিসি জি 1 (সায়ানোজেন মডেল 6.1)
  • এইচটিসি জি 1 (স্টক)
  • এইচটিসি ভিশন / জি 2 (স্টক)

অবিশ্বাস্য বাদে এই সমস্ত ডিভাইস কেবল তাদের অপসারণযোগ্য সঞ্চয়স্থান ফিরিয়ে দিয়েছে। আমার করা উচিত অতিরিক্ত কিছু চেক রয়েছে, তবে এ পর্যন্ত পাওয়া কোনও সমাধানের চেয়ে এটি কমপক্ষে কিছুটা ভাল।


4
আমি মনে করি আপনি যদি সমাধানটিতে মাইন্ড / এসডিকার্ডের মতো মূল অক্ষরগুলি রেখে থাকেন তবে আপনার সমাধানটি অবৈধ ফোল্ডারের নাম দেবে
ইউজিন পপোভিচ

4
আমি কয়েকটি মোটোরোলা, স্যামসুং এবং এলজি ডিভাইসে পরীক্ষা করেছি এবং এটি নিখুঁতভাবে কাজ করেছে।
পেপিডিউটিকো

4
@ খাওয়াররাজা, এই পদ্ধতিটি কিটক্যাট হিসাবে কাজ বন্ধ করে দিয়েছে। যদি আপনি প্রি-আইসিএস ডিভাইসগুলি সমর্থন করে থাকেন তবে এটি ফ্যালব্যাক হিসাবে দিমিত্রি লোজেনকো পদ্ধতিটি ব্যবহার করুন।
গ্যাথোননিক

4
HUAWEI অনার 3 সি তে কাজ করে। ধন্যবাদ
li2

4
এই আমার জন্য 4.0+ উপর ফিরে আসছে / পরিবর্তে / স্টোরেজ mnt এবার একটি আকাশগঙ্গা উল্লেখ্য 3
Ono

54

আমি সিস্টেমে সমস্ত এসডি-কার্ডগুলিতে পাথ পাওয়ার আরও নির্ভরযোগ্য উপায় পেয়েছি। এটি সমস্ত অ্যান্ড্রয়েড সংস্করণে কাজ করে এবং সমস্ত স্টোরেজে পাথ ফেরায় (অনুকরণযুক্ত অন্তর্ভুক্ত)।

আমার সমস্ত ডিভাইসে সঠিকভাবে কাজ করে।

পিএস: এনভায়রনমেন্ট ক্লাসের সোর্স কোডের ভিত্তিতে।

private static final Pattern DIR_SEPORATOR = Pattern.compile("/");

/**
 * Raturns all available SD-Cards in the system (include emulated)
 *
 * Warning: Hack! Based on Android source code of version 4.3 (API 18)
 * Because there is no standart way to get it.
 * TODO: Test on future Android versions 4.4+
 *
 * @return paths to all available SD-Cards in the system (include emulated)
 */
public static String[] getStorageDirectories()
{
    // Final set of paths
    final Set<String> rv = new HashSet<String>();
    // Primary physical SD-CARD (not emulated)
    final String rawExternalStorage = System.getenv("EXTERNAL_STORAGE");
    // All Secondary SD-CARDs (all exclude primary) separated by ":"
    final String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
    // Primary emulated SD-CARD
    final String rawEmulatedStorageTarget = System.getenv("EMULATED_STORAGE_TARGET");
    if(TextUtils.isEmpty(rawEmulatedStorageTarget))
    {
        // Device has physical external storage; use plain paths.
        if(TextUtils.isEmpty(rawExternalStorage))
        {
            // EXTERNAL_STORAGE undefined; falling back to default.
            rv.add("/storage/sdcard0");
        }
        else
        {
            rv.add(rawExternalStorage);
        }
    }
    else
    {
        // Device has emulated storage; external storage paths should have
        // userId burned into them.
        final String rawUserId;
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1)
        {
            rawUserId = "";
        }
        else
        {
            final String path = Environment.getExternalStorageDirectory().getAbsolutePath();
            final String[] folders = DIR_SEPORATOR.split(path);
            final String lastFolder = folders[folders.length - 1];
            boolean isDigit = false;
            try
            {
                Integer.valueOf(lastFolder);
                isDigit = true;
            }
            catch(NumberFormatException ignored)
            {
            }
            rawUserId = isDigit ? lastFolder : "";
        }
        // /storage/emulated/0[1,2,...]
        if(TextUtils.isEmpty(rawUserId))
        {
            rv.add(rawEmulatedStorageTarget);
        }
        else
        {
            rv.add(rawEmulatedStorageTarget + File.separator + rawUserId);
        }
    }
    // Add all secondary storages
    if(!TextUtils.isEmpty(rawSecondaryStoragesStr))
    {
        // All Secondary SD-CARDs splited into array
        final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
        Collections.addAll(rv, rawSecondaryStorages);
    }
    return rv.toArray(new String[rv.size()]);
}

4
অনুমান করা কি DIR_SEPORATOR ছিল?
cYrixmorten ten

4
@ সিরিমিক্সমোর্টেন এটি কোডের শীর্ষে সরবরাহ করেছেন .. এটির Patternজন্য/
অঙ্কিত বানসাল

ললিপপ-এ কেউ এই সমাধানটি পরীক্ষা করেছে?
lenrok258

আমি লেनोভো P780 এ এই পদ্ধতিটি চেষ্টা করেছি t এটি কাজ করছে না।
সতীশ কুমার

4
ললিপপ অবধি কাজ করে; মার্শমেলোতে কাজ করছেন না (গ্যালাক্সি ট্যাব এ ডাব্লু / 6.0.1) যেখানে System.getenv("SECONDARY_STORAGE")ফিরে আসে /storage/sdcard1। এই অবস্থানটি বিদ্যমান নেই, তবে আসল অবস্থানটি /storage/42CE-FD0Aযেখানে 42CE-FD0A হ'ল ফর্ম্যাট করা পার্টিশনের ভলিউম ক্রমিক সংখ্যা।
ডেভএলডেন

32

আমার ধারণা বাহ্যিক এসডিকার্ডটি ব্যবহার করা আপনার এটি প্রয়োজন:

new File("/mnt/external_sd/")

বা

new File("/mnt/extSdCard/")

আপনার ক্ষেত্রে...

এর জায়গায় Environment.getExternalStorageDirectory()

আমার জন্য কাজ কর. আপনার প্রথমে ডিরেক্টরিতে কী আছে তা পরীক্ষা করা উচিত এবং সেখান থেকে কাজ করা উচিত ..


কোন এসডিকার্ড ব্যবহার করবেন তা চয়ন করতে আপনার কিছু ধরণের নির্বাচন পদ্ধতি ব্যবহার করা উচিত:

File storageDir = new File("/mnt/");
if(storageDir.isDirectory()){
    String[] dirList = storageDir.list();
    //TODO some type of selecton method?
}

4
আসলে আসলে আমি হার্ড-কোডের পথের চেয়ে একটি পদ্ধতি চাই, তবে / এমএনটি / তালিকাটি ভাল হওয়া উচিত। ধন্যবাদ.
রোমুলাস উরাকাগি স'সাই

সমস্যা নেই. সেটিংসে একটি বিকল্প রয়েছে যা থেকে আপনি পথটি বেছে নেন, তারপরে এটি পুনরুদ্ধার করার জন্য পদ্ধতিটি ব্যবহার করুন।
ফ্যাবিয়ানকুক

10
দুর্ভাগ্যক্রমে বাহ্যিক এসডি কার্ডটি / mnt এর চেয়ে আলাদা ফোল্ডারে থাকতে পারে। উদাহরণস্বরূপ স্যামসুং জিটি-আই 9305 এ এটি / স্টোরেজ / এক্সটএসডি কার্ড রয়েছে যখন অন্তর্নির্মিত এসডি কার্ডের পাথ / স্টোরেজ / এসডিকার্ড0 রয়েছে
ইশিয়াল 16'13

4
ঠিক আছে তবে আপনি sdcard অবস্থান পেতে হবে, তার পরে তার মূল ডিরেক্টরি পাবেন।
ফ্যাবিয়ানকুক

অ্যান্ড্রয়েড +.০+ এর জন্য এক্সটার্নাল এসডি কার্ডের (ওটিজি কেবলের মাধ্যমে ট্যাবলেটে সংযুক্ত পেনড্রাইভের) পথ কী হবে?
ওসিমার পোথে

15

সমস্ত বাহ্যিক স্টোরগুলি পুনরুদ্ধার করতে (সেগুলি এসডি কার্ড বা অভ্যন্তরীণ অপসারণযোগ্য স্টোরগুলি হোক না কেন ), আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

final String state = Environment.getExternalStorageState();

if ( Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state) ) {  // we can read the External Storage...           
    //Retrieve the primary External Storage:
    final File primaryExternalStorage = Environment.getExternalStorageDirectory();

    //Retrieve the External Storages root directory:
    final String externalStorageRootDir;
    if ( (externalStorageRootDir = primaryExternalStorage.getParent()) == null ) {  // no parent...
        Log.d(TAG, "External Storage: " + primaryExternalStorage + "\n");
    }
    else {
        final File externalStorageRoot = new File( externalStorageRootDir );
        final File[] files = externalStorageRoot.listFiles();

        for ( final File file : files ) {
            if ( file.isDirectory() && file.canRead() && (file.listFiles().length > 0) ) {  // it is a real directory (not a USB drive)...
                Log.d(TAG, "External Storage: " + file.getAbsolutePath() + "\n");
            }
        }
    }
}

বিকল্পভাবে, আপনি প্রাথমিক বাইরের স্টোরেজ ডিরেক্টরি (উদাহরণস্বরূপ "/ স্টোরেজ / sdcard0" ) এবং System.getenv ("SECONDARY_STORAGE") পুনরুদ্ধারের জন্য System.getenv ("EXTERNAL_STORAGE") ব্যবহার করতে পারেন (যেমন " / স্টোরেজ / এক্সটএসডিকার্ড: / স্টোরেজ / ইউএসবিড্রাইভা: / স্টোরেজ / ইউএসবিড্রাইভবি " )। মনে রাখবেন যে, এই ক্ষেত্রেও, আপনি ইউএসবি ড্রাইভগুলি বাদ দিতে সেকেন্ডারি ডিরেক্টরিগুলির তালিকাটি ফিল্টার করতে চাইতে পারেন।

যাইহোক, দয়া করে নোট করুন যে হার্ড-কোডেড পাথগুলি ব্যবহার করা সর্বদা একটি খারাপ দৃষ্টিভঙ্গি (স্পষ্টত যখন প্রতিটি নির্মাতাকে খুশি হিসাবে এটি পরিবর্তন করতে পারে)।


System.getenv ("SECONDARY_STORAGE") Nexus 5 এবং Nexus 7 এ OTG কেবলের মাধ্যমে সংযুক্ত USB ডিভাইসের জন্য কাজ করেনি
খয়ার রাজা

এখানে আমার সমাধান যা নওগাট পর্যন্ত কাজ করে: stackoverflow.com/a/40205116/5002496
গোকুল এনসি

14

আমি অসিত জেনফোন 2 , মার্শমেলো 6.0.1 এ পরীক্ষা না করা অবধি দিমিত্রি লোজেনকো এর সমাধানটি ব্যবহার করছিলাম এবং সমাধানটি কাজ করছে না। বিশেষত মাইক্রোএসডি পাথের জন্য, যেমন: / স্টোরেজ / F99C-10F4 / এর জন্য EMULATED_STORAGE_TARGET পাওয়ার সময় সমাধানটি ব্যর্থ হয়েছিল । আমি এমুলেটেড অ্যাপ্লিকেশন পাথগুলি থেকে সরাসরি এমুলেটেড রুট পাথগুলি পেতে এবং আরও পরিচিত ফোন-মডেল-নির্দিষ্ট শারীরিক পাথ যুক্ত করার জন্য কোডটি সম্পাদনা করেছি ।context.getExternalFilesDirs(null);

আমাদের জীবনকে আরও সহজ করার জন্য, আমি এখানে একটি পাঠাগার তৈরি করেছি । আপনি এটিকে গ্রেডেল, ম্যাভেন, এসবিটি এবং লিনেঞ্জেন বিল্ড সিস্টেমের মাধ্যমে ব্যবহার করতে পারেন।

আপনি সেকেলে উপায় মত, এছাড়াও আপনি থেকে সরাসরি ফাইল পেস্ট কপি করতে পারেন এখানে , কিন্তু যদি সেখানে নিজে চেক ছাড়া ভবিষ্যতে একটি আপডেট হয় আপনি জানেন না।

আপনার যদি কোনও প্রশ্ন বা পরামর্শ থাকে তবে দয়া করে আমাকে জানান


4
আমি এটি ব্যাপকভাবে ব্যবহার করি নি, তবে এটি আমার সমস্যার পক্ষে ভাল কাজ করে।
ডেভিড

4
দুর্দান্ত সমাধান! তবে একটি নোট - অ্যাপ্লিকেশন সক্রিয় থাকাকালীন যদি এসডি কার্ড সরিয়ে ফেলা হয় তবে ফাইলগুলির একটির জন্য context.getExternalFilesDirs(null)ফিরে আসবে nullএবং নিম্নলিখিত লুপটিতে ব্যতিক্রম থাকবে। আমি if (file == null) continue;লুপের প্রথম লাইন হিসাবে যুক্ত করার পরামর্শ দিই ।
কোগার

4
@ কুগার এই পরামর্শের জন্য আপনাকে ধন্যবাদ, আমি এটি যুক্ত করেছি এবং আমার উত্তরে একটি টাইপো স্থির করেছি
হেন্দ্রডাব্লুডি

13

ভাল খবর! কিটকেটে এখন এই মাধ্যমিক ভাগ করা স্টোরেজ ডিভাইসগুলির সাথে কথোপকথনের জন্য একটি সর্বজনীন এপিআই রয়েছে।

নতুন Context.getExternalFilesDirs()এবং Context.getExternalCacheDirs()পদ্ধতিগুলি প্রাথমিক এবং মাধ্যমিক উভয় ডিভাইস সহ একাধিক পাথ ফিরে আসতে পারে। এর পরে আপনি বারবার তাদের উপর এবং পরীক্ষা করতে পারবেন Environment.getStorageState()এবং File.getFreeSpace()ফাইল সঞ্চয় করার সবচেয়ে ভাল জায়গা নির্ধারণ। এই পদ্ধতিগুলি ContextCompatসমর্থন-ভি 4 লাইব্রেরিতে পাওয়া যায়।

এছাড়াও মনে রাখবেন যে আপনি যদি কেবলমাত্র ডিরেক্টরিগুলি দ্বারা ফিরে আসে সেগুলি ব্যবহার করতে আগ্রহী হন তবে আপনার Contextআর অনুমতি READ_বা WRITE_EXTERNAL_STORAGEঅনুমতি প্রয়োজন নেই । এগিয়ে যেতে, আপনার সবসময় এই অতিরিক্ত ডিরেক্টরিগুলির অতিরিক্ত অনুমতি ছাড়াই এই ডিরেক্টরিগুলিতে পড়া / লেখার অ্যাক্সেস থাকবে।

অ্যাপ্লিকেশনগুলি তাদের অনুমতির অনুরোধটির শেষে-শেষকালের মাধ্যমে পুরানো ডিভাইসে কাজ করা চালিয়ে যেতে পারে:

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

ধন্যবাদ. আমি এমন কিছু কোড তৈরি করেছি যা আপনি যা লিখেছেন তা অনুসরণ করে এবং আমি মনে করি এটি সমস্ত এসডি কার্ডের পাথ সন্ধানে ভাল কাজ করে। আপনি কি একবার দেখে নিতে পারেন? এখানে: স্ট্যাকওভারফ্লো.com/a/27197248/878126। বিটিডাব্লু, আপনার "গেটফ্রিস্পেস" ব্যবহার করা উচিত নয় কারণ তাত্ত্বিকভাবে, রানটাইম চলাকালীন মুক্ত স্থান পরিবর্তন করতে পারে।
অ্যান্ড্রয়েড বিকাশকারী

পূর্বে রেফারেন্স বিকাশকারী।
android.com/references/android/content/…

10

সমস্ত বাহ্যিক এসডি কার্ডগুলিতে অ্যাক্সেস পেতে আমি নিম্নলিখিতগুলি করেছি।

সঙ্গে:

File primaryExtSd=Environment.getExternalStorageDirectory();

আপনি প্রাথমিক বহিরাগত এসডি পাথ পাবেন তারপরে:

File parentDir=new File(primaryExtSd.getParent());

আপনি প্রাথমিক বাহ্যিক স্টোরেজটির পিতামাতার দির পান এবং এটি সমস্ত বাহ্যিক এসডির পিতা বা মাতাও। এখন, আপনি সমস্ত স্টোরেজ তালিকাবদ্ধ করতে পারেন এবং আপনার পছন্দসই একটি নির্বাচন করতে পারেন।

আশা করি এটি কাজে লাগবে।


এটি গ্রহণযোগ্য উত্তর হওয়া উচিত এবং আপনাকে ধন্যবাদ যে এটি কার্যকর।
মিইমনম্যান

9

এসডি-কার্ড পাথের তালিকা (প্রাথমিক বাহ্যিক সঞ্চয় বাদে) এখানে কীভাবে পাবেন তা এখানে:

  /**
   * returns a list of all available sd cards paths, or null if not found.
   * 
   * @param includePrimaryExternalStorage set to true if you wish to also include the path of the primary external storage
   */
  @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  public static List<String> getSdCardPaths(final Context context,final boolean includePrimaryExternalStorage)
    {
    final File[] externalCacheDirs=ContextCompat.getExternalCacheDirs(context);
    if(externalCacheDirs==null||externalCacheDirs.length==0)
      return null;
    if(externalCacheDirs.length==1)
      {
      if(externalCacheDirs[0]==null)
        return null;
      final String storageState=EnvironmentCompat.getStorageState(externalCacheDirs[0]);
      if(!Environment.MEDIA_MOUNTED.equals(storageState))
        return null;
      if(!includePrimaryExternalStorage&&VERSION.SDK_INT>=VERSION_CODES.HONEYCOMB&&Environment.isExternalStorageEmulated())
        return null;
      }
    final List<String> result=new ArrayList<>();
    if(includePrimaryExternalStorage||externalCacheDirs.length==1)
      result.add(getRootOfInnerSdCardFolder(externalCacheDirs[0]));
    for(int i=1;i<externalCacheDirs.length;++i)
      {
      final File file=externalCacheDirs[i];
      if(file==null)
        continue;
      final String storageState=EnvironmentCompat.getStorageState(file);
      if(Environment.MEDIA_MOUNTED.equals(storageState))
        result.add(getRootOfInnerSdCardFolder(externalCacheDirs[i]));
      }
    if(result.isEmpty())
      return null;
    return result;
    }

  /** Given any file/folder inside an sd card, this will return the path of the sd card */
  private static String getRootOfInnerSdCardFolder(File file)
    {
    if(file==null)
      return null;
    final long totalSpace=file.getTotalSpace();
    while(true)
      {
      final File parentFile=file.getParentFile();
      if(parentFile==null||parentFile.getTotalSpace()!=totalSpace||!parentFile.canRead())
        return file.getAbsolutePath();
      file=parentFile;
      }
    }

externalCacheDirs[0].getParentFile().getParentFile().getParentFile().getParentFile().getAbsolutePath()এটি দুর্যোগের জন্যে একটি রেসিপি। যদি আপনি এটি করছেন, আপনি সম্ভবত সঠিক পথটি চান তারপরে আপনার পছন্দ অনুসারে, আপনি যদি 4 জন পিতা-মাতার ব্যতীত অন্য কোনও কিছু দিয়ে ক্যাশে দির পান তবে আপনি নালপয়েন্টার এক্সসেপশন বা ভুল পথ পাবেন।
rharter

নিবন্ধ এই সমস্যাটিও স্থির করে। তাকাও এখানে.
অ্যান্ড্রয়েড বিকাশকারী

দস্তাবেজগুলি ( বিকাশকারী। অ্যান্ড্রয়েড.com/references/android/ content/… ) বলছেন "এখানে ফিরে আসা বাহ্যিক স্টোরেজ ডিভাইসগুলি ডিভাইসের স্থায়ী অংশ হিসাবে বিবেচিত হয়, উভয়ই এমুলেটেড বাহ্যিক স্টোরেজ এবং শারীরিক মিডিয়া স্লট যেমন ব্যাটারির এসডি কার্ড সহ including বগি। ফিরে আসা পাথগুলিতে USB ফ্ল্যাশ ড্রাইভের মতো ক্ষণস্থায়ী ডিভাইস অন্তর্ভুক্ত নয়। " দেখে মনে হচ্ছে এগুলিতে এসডি কার্ড স্লটও অন্তর্ভুক্ত নেই, যেমন যে জায়গাগুলি আপনি ব্যাটারির নীচে না গিয়ে কোনও এসডি কার্ড সরাতে পারবেন। যদিও বলা শক্ত।
লার্শ

4
@ লার্শ ওয়েল, আমি নিজে এটি এসজিএস 3 (এবং আসল এসডি-কার্ড) এ পরীক্ষা করেছি, তাই আমার মনে হয় এটি অন্যান্য ডিভাইসেও কাজ করা উচিত।
অ্যান্ড্রয়েড বিকাশকারী

5

আপনাদের দ্বারা সরবরাহ করা ক্লুগুলির জন্য ধন্যবাদ, বিশেষত @ স্মার্টলমন, আমি সমাধান পেয়েছি। অন্য কারওর প্রয়োজনে আমি আমার চূড়ান্ত সমাধানটি এখানে রেখেছি (প্রথম তালিকাভুক্ত বাহ্যিক এসডি কার্ড সন্ধানের জন্য):

public File getExternalSDCardDirectory()
{
    File innerDir = Environment.getExternalStorageDirectory();
    File rootDir = innerDir.getParentFile();
    File firstExtSdCard = innerDir ;
    File[] files = rootDir.listFiles();
    for (File file : files) {
        if (file.compareTo(innerDir) != 0) {
            firstExtSdCard = file;
            break;
        }
    }
    //Log.i("2", firstExtSdCard.getAbsolutePath().toString());
    return firstExtSdCard;
}

যদি সেখানে কোনও বাহ্যিক এসডি কার্ড না থাকে, তবে এটি বোর্ড স্টোরেজটি ফেরত দেয়। এসডিকার্ড না থাকলে আমি এটি ব্যবহার করব, আপনার এটি পরিবর্তন করার প্রয়োজন হতে পারে।


4
অ্যান্ড্রয়েড সংস্করণ 19-এ এই নিক্ষেপটি বাতিল হয়ে যায় root আমি এটি নেক্সাস 7, এমুলেটর এবং গ্যালাক্সি নোট দিয়ে পরীক্ষা করেছি।
মনু জি

3

আমার কোড দেখুন, আপনার জন্য সহায়ক আশা করি:

    Runtime runtime = Runtime.getRuntime();
    Process proc = runtime.exec("mount");
    InputStream is = proc.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    String line;
    String mount = new String();
    BufferedReader br = new BufferedReader(isr);
    while ((line = br.readLine()) != null) {
        if (line.contains("secure")) continue;
        if (line.contains("asec")) continue;

        if (line.contains("fat")) {//TF card
            String columns[] = line.split(" ");
            if (columns != null && columns.length > 1) {
                mount = mount.concat("*" + columns[1] + "\n");
            }
        } else if (line.contains("fuse")) {//internal storage
            String columns[] = line.split(" ");
            if (columns != null && columns.length > 1) {
                mount = mount.concat(columns[1] + "\n");
            }
        }
    }
    txtView.setText(mount);

2

আসলে কিছু ডিভাইসে বহিরাগত এসডকার্ড ডিফল্ট নামটি প্রদর্শিত হয় extSdCardএবং অন্যটির জন্য এটি প্রদর্শিত হয় sdcard1

এই কোড স্নিপেট সেই সঠিক পাথটি খুঁজে পেতে সহায়তা করে এবং আপনাকে বাহ্যিক ডিভাইসের পথ পুনরুদ্ধারে সহায়তা করে।

String sdpath,sd1path,usbdiskpath,sd0path;    
        if(new File("/storage/extSdCard/").exists())
            {
               sdpath="/storage/extSdCard/";
               Log.i("Sd Cardext Path",sdpath);
            }
        if(new File("/storage/sdcard1/").exists())
         {
              sd1path="/storage/sdcard1/";
              Log.i("Sd Card1 Path",sd1path);
         }
        if(new File("/storage/usbcard1/").exists())
         {
              usbdiskpath="/storage/usbcard1/";
              Log.i("USB Path",usbdiskpath);
         }
        if(new File("/storage/sdcard0/").exists())
         {
              sd0path="/storage/sdcard0/";
              Log.i("Sd Card0 Path",sd0path);
         }

এটি আমাকে প্রচুর পরিমাণে সাহায্য করেছিল।
ড্রড ক্রিস

কিছু ডিভাইস রয়েছে যা "/ স্টোরেজ / বহিরাগত_এসডি" (এলজি জি 3 কিটকাট) ব্যবহার করে, মার্শমেলোতে কিছু আলাদা স্কিম রয়েছে, অ্যান্ড্রয়েড 6.0 ব্যবহার করে নেক্সাস 5 এক্সের অভ্যন্তরীণ স্টোরেজটি "/ mnt / sdcard" এবং বহিরাগত এসডিকার্ডটি "/ স্টোরেজ" এর অধীনে পাওয়া যায় / এক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স
এবি

2

হ্যাঁ. বিভিন্ন নির্মাতারা বিভিন্ন এসডিকার্ড নাম ব্যবহার করে যেমন স্যামসাং ট্যাব 3 এর extsd ব্যবহার করে এবং অন্যান্য স্যামসাং ডিভাইসগুলি এসডিকার্ড ব্যবহার করে যেমন আলাদা উত্পাদনকারী বিভিন্ন নাম ব্যবহার করে।

আপনারও আমার একই চাহিদা ছিল। সুতরাং আমি আমার প্রকল্প থেকে আপনার জন্য একটি নমুনা উদাহরণ তৈরি করেছি এই লিঙ্কটি অ্যান্ড্রয়েড ডিরেক্টরি ডিরেক্টরি চয়নকারী উদাহরণ যা androi-dirchooser লাইব্রেরি ব্যবহার করে। এই উদাহরণটি এসডিকার্ড সনাক্ত করে এবং সমস্ত সাব-ফোল্ডার তালিকাভুক্ত করে এবং ডিভাইসটিতে আরও একটি এসডিকার্ড রয়েছে কিনা তা এটি সনাক্ত করে।

কোডটির কিছু অংশ এর মতো দেখাচ্ছে পুরো উদাহরণটির জন্য অ্যান্ড্রয়েড ডিরেক্টরি চয়নকারীটির লিঙ্কটি যেতে হবে

/**
* Returns the path to internal storage ex:- /storage/emulated/0
 *
* @return
 */
private String getInternalDirectoryPath() {
return Environment.getExternalStorageDirectory().getAbsolutePath();
 }

/**
 * Returns the SDcard storage path for samsung ex:- /storage/extSdCard
 *
 * @return
 */
    private String getSDcardDirectoryPath() {
    return System.getenv("SECONDARY_STORAGE");
}


 mSdcardLayout.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
        String sdCardPath;
        /***
         * Null check because user may click on already selected buton before selecting the folder
         * And mSelectedDir may contain some wrong path like when user confirm dialog and swith back again
         */

        if (mSelectedDir != null && !mSelectedDir.getAbsolutePath().contains(System.getenv("SECONDARY_STORAGE"))) {
            mCurrentInternalPath = mSelectedDir.getAbsolutePath();
        } else {
            mCurrentInternalPath = getInternalDirectoryPath();
        }
        if (mCurrentSDcardPath != null) {
            sdCardPath = mCurrentSDcardPath;
        } else {
            sdCardPath = getSDcardDirectoryPath();
        }
        //When there is only one SDcard
        if (sdCardPath != null) {
            if (!sdCardPath.contains(":")) {
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File(sdCardPath);
                changeDirectory(dir);
            } else if (sdCardPath.contains(":")) {
                //Multiple Sdcards show root folder and remove the Internal storage from that.
                updateButtonColor(STORAGE_EXTERNAL);
                File dir = new File("/storage");
                changeDirectory(dir);
            }
        } else {
            //In some unknown scenario at least we can list the root folder
            updateButtonColor(STORAGE_EXTERNAL);
            File dir = new File("/storage");
            changeDirectory(dir);
        }


    }
});

2

এই সমাধানটি (এই প্রশ্নের অন্যান্য উত্তরগুলি থেকে একত্রিত হয়ে) সেই সত্যটি পরিচালনা করে (যেমন @ নनो দ্বারা উল্লিখিত) System.getenv("SECONDARY_STORAGE")মার্শমেলোর কোনও লাভ নেই।

পরীক্ষিত এবং কাজ করছে:

  • স্যামসং গ্যালাক্সি ট্যাব 2 (অ্যান্ড্রয়েড 4.1.1 - স্টক)
  • স্যামসং গ্যালাক্সি নোট 8.0 (অ্যান্ড্রয়েড 4.2.2 - স্টক)
  • স্যামসং গ্যালাক্সি এস 4 (অ্যান্ড্রয়েড ৪.৪ - স্টক)
  • স্যামসং গ্যালাক্সি এস 4 (অ্যান্ড্রয়েড 5.1.1 - সায়ানোজেনমড)
  • স্যামসং গ্যালাক্সি ট্যাব এ (অ্যান্ড্রয়েড 6.0.1 - স্টক)

    /**
     * Returns all available external SD-Card roots in the system.
     *
     * @return paths to all available external SD-Card roots in the system.
     */
    public static String[] getStorageDirectories() {
        String [] storageDirectories;
        String rawSecondaryStoragesStr = System.getenv("SECONDARY_STORAGE");
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            List<String> results = new ArrayList<String>();
            File[] externalDirs = applicationContext.getExternalFilesDirs(null);
            for (File file : externalDirs) {
                String path = file.getPath().split("/Android")[0];
                if((Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && Environment.isExternalStorageRemovable(file))
                        || rawSecondaryStoragesStr != null && rawSecondaryStoragesStr.contains(path)){
                    results.add(path);
                }
            }
            storageDirectories = results.toArray(new String[0]);
        }else{
            final Set<String> rv = new HashSet<String>();
    
            if (!TextUtils.isEmpty(rawSecondaryStoragesStr)) {
                final String[] rawSecondaryStorages = rawSecondaryStoragesStr.split(File.pathSeparator);
                Collections.addAll(rv, rawSecondaryStorages);
            }
            storageDirectories = rv.toArray(new String[rv.size()]);
        }
        return storageDirectories;
    }
    

শর্তটি rawSecondaryStoragesStr.contains(path)অভ্যন্তরীণ স্টোরেজটিকে যুক্ত হতে দেয়; আমরা সেই শর্তটি আরও ভালভাবে মুছে ফেলতে পারি .. আমার সমস্যাটি যেহেতু আমার ডিভাইসটি অভ্যন্তরীণ স্টোরেজ ডিরেক্টরিটি দিয়ে System.getenv("SECONDARY_STORAGE")ফিরে আসে, তবে কিটকেটে বহিরাগত মেমরি কার্ডের পথটি ফিরিয়ে দেয় System.getenv(EXTERNAL_STORAGE); দেখে মনে হচ্ছে যে কোনও বিক্রেতারা কোনও জঘন্য মান ছাড়াই এটি ভিন্নভাবে প্রয়োগ করেছে ..
গোকুল এনসি

এখানে আমার সমাধান যা নওগাট পর্যন্ত কাজ করে: stackoverflow.com/a/40205116/5002496
গোকুল এনসি

1

কিছু ডিভাইসে (উদাহরণস্বরূপ স্যামসাং গ্যালাক্সি এসআইআই) অভ্যন্তরীণ মেমরি কার্ড মাবে ভিএফএটিতে থাকুন। এক্ষেত্রে সর্বশেষ কোডটি উল্লেখ করুন, আমরা অভ্যন্তরীণ মেমরি কার্ড (/ mnt / sdcad) পাই তবে কোনও বাহ্যিক কার্ড পাওয়া যায় না। নীচে কোড দেখুন এই সমস্যার সমাধান।

static String getExternalStorage(){
         String exts =  Environment.getExternalStorageDirectory().getPath();
         try {
            FileReader fr = new FileReader(new File("/proc/mounts"));       
            BufferedReader br = new BufferedReader(fr);
            String sdCard=null;
            String line;
            while((line = br.readLine())!=null){
                if(line.contains("secure") || line.contains("asec")) continue;
            if(line.contains("fat")){
                String[] pars = line.split("\\s");
                if(pars.length<2) continue;
                if(pars[1].equals(exts)) continue;
                sdCard =pars[1]; 
                break;
            }
        }
        fr.close();
        br.close();
        return sdCard;  

     } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return null;
}

1
       File[] files = null;
    File file = new File("/storage");// /storage/emulated
if (file.exists()) {
        files = file.listFiles();
            }
            if (null != files)
                for (int j = 0; j < files.length; j++) {
                    Log.e(TAG, "" + files[j]);
                    Log.e(TAG, "//--//--// " +             files[j].exists());

                    if (files[j].toString().replaceAll("_", "")
                            .toLowerCase().contains("extsdcard")) {
                        external_path = files[j].toString();
                        break;
                    } else if (files[j].toString().replaceAll("_", "")
                            .toLowerCase()
                            .contains("sdcard".concat(Integer.toString(j)))) {
                        // external_path = files[j].toString();
                    }
                    Log.e(TAG, "--///--///--  " + external_path);
                }

0

আমি নিশ্চিত যে এই কোডটি অবশ্যই আপনার সমস্যাগুলি সমাধান করবে ... এটি আমার পক্ষে ভাল কাজ করছে ... \

try {
            File mountFile = new File("/proc/mounts");
            usbFoundCount=0;
            sdcardFoundCount=0;
            if(mountFile.exists())
             {
                Scanner usbscanner = new Scanner(mountFile);
                while (usbscanner.hasNext()) {
                    String line = usbscanner.nextLine();
                    if (line.startsWith("/dev/fuse /storage/usbcard1")) {
                        usbFoundCount=1;
                        Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/usbcard1" );
                    }
            }
         }
            if(mountFile.exists()){
                Scanner sdcardscanner = new Scanner(mountFile);
                while (sdcardscanner.hasNext()) {
                    String line = sdcardscanner.nextLine();
                    if (line.startsWith("/dev/fuse /storage/sdcard1")) {
                        sdcardFoundCount=1;
                        Log.i("-----USB--------","USB Connected and properly mounted---/dev/fuse /storage/sdcard1" );
                    }
            }
         }
            if(usbFoundCount==1)
            {
                Toast.makeText(context,"USB Connected and properly mounted", 7000).show();
                Log.i("-----USB--------","USB Connected and properly mounted" );
            }
            else
            {
                Toast.makeText(context,"USB not found!!!!", 7000).show();
                Log.i("-----USB--------","USB not found!!!!" );

            }
            if(sdcardFoundCount==1)
            {
                Toast.makeText(context,"SDCard Connected and properly mounted", 7000).show();
                Log.i("-----SDCard--------","SDCard Connected and properly mounted" );
            }
            else
            {
                Toast.makeText(context,"SDCard not found!!!!", 7000).show();
                Log.i("-----SDCard--------","SDCard not found!!!!" );

            }
        }catch (Exception e) {
            e.printStackTrace();
        } 

এনভায়রনমেন্ট.জেটএক্সটার্নাল স্টোরেজ ডিরেক্টরী () আপনাকে আপনার বাহ্যিক এসডিকার্ড বা ইউএসবি অবস্থানের সঠিক অবস্থানটি দেবে না "" / proc / মাউন্টস "অবস্থানের জন্য কেবল পার্স করলে / ডিভ / ফিউজ / স্টোরেজ / এসডিকার্ড ১ আপনাকে আপনার এসডিকার্ড সঠিকভাবে অবস্থান করছে কিনা তা আপনাকে স্থান দেবে USB এর জন্য মাউন্ট করা বা একই নয় his এইভাবে আপনি সহজেই এটি পেতে পারেন..চায়ার্স..স্যাম
স্যাম

0

এটা সত্যি না. এসডি কার্ড মাউন্ট না করা হলেও / mnt / sdcard / বহিরাগত_এসডি উপস্থিত থাকতে পারে। আপনি যখন / মাউন্ট / এসডিকার্ড / বহিরাগত_এসডি লিখতে চেষ্টা করবেন না তখনই আপনার অ্যাপ্লিকেশনটি ক্রাশ হবে।

আপনাকে এসডি কার্ডটি প্রথমে মাউন্ট করা হয়েছে কিনা তা পরীক্ষা করে দেখতে হবে:

boolean isSDPresent = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

7
getExternalStorageState()আমি মনে করি, বাহ্যিক এসডি কার্ডের চেয়ে অভ্যন্তরীণ স্টোরেজ ফিরিয়ে দিলে এটি অর্থহীন ।
রোমুলাস উড়াকগি সি'সাই

তারা কি এখনই বাহ্যিক এসডি কার্ড পেতে কোনও ফাংশন সরবরাহ করে? ঘন্টাখানেক খোঁজাখুঁজির পরেও কোনও ক্লু খুঁজে পাচ্ছি না। যদি এটি হয় তবে এতগুলি সংস্করণ আপডেট হওয়ার পরে এটি এত আশ্চর্য।
আরএমএল

আপনি যখন "এটি সত্য নয়" বলেছিলেন, আপনি কী উল্লেখ করছেন? আমি জানি, এটি 2.5 বছর আগে ছিল ...
লার্স

0
 String path = Environment.getExternalStorageDirectory()
                        + File.separator + Environment.DIRECTORY_PICTURES;
                File dir = new File(path);

4
এটি কাজ করে না। এটি অভ্যন্তরীণ স্টোরেজের পথে ফিরে আসে। অর্থাত্ / স্টোরেজ /

0

আপনি যেমন - Context.getExternCacheDirs () বা Context.getExternFilesDirs () বা Context.getObbDirs () এর মতো কিছু ব্যবহার করতে পারেন। তারা সমস্ত বাহ্যিক স্টোরেজ ডিভাইসে অ্যাপ্লিকেশন সুনির্দিষ্ট ডিরেক্টরি দেয় যেখানে অ্যাপ্লিকেশনটি এর ফাইলগুলি সঞ্চয় করতে পারে।

সুতরাং এর মতো কিছু - প্রসঙ্গ।

আমি জানি এই আদেশগুলি একটি ভিন্ন উদ্দেশ্যে, কিন্তু অন্যান্য উত্তরগুলি আমার পক্ষে কার্যকর হয়নি।

এই লিঙ্কটি আমাকে ভাল পয়েন্টার দিয়েছে - https://possiblemobile.com/2014/03/android-extern-stores/


0

System.getenv("SECONDARY_STORAGE")মার্শমেলোর জন্য নাল ফেরায়। এটি সমস্ত বাহ্যিক ডায়ারগুলি সন্ধান করার অন্য উপায়। আপনি এটির অপসারণযোগ্য কিনা তা যাচাই করতে পারবেন যা অভ্যন্তরীণ / বাহ্যিক কিনা তা নির্ধারণ করে

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    File[] externalCacheDirs = context.getExternalCacheDirs();
    for (File file : externalCacheDirs) {
        if (Environment.isExternalStorageRemovable(file)) {
            // It's a removable storage
        }
    }
}

0

আমি আমার স্যামসাং গ্যালাক্সি ট্যাব এস 2 (মডেল: T819Y) তে দিমিত্রি লোজেনকো এবং গাথোনটিকের প্রদত্ত সমাধানগুলি চেষ্টা করেছি তবে বাইরের এসডি কার্ড ডিরেক্টরিতে আমাকে পুনরুদ্ধার করতে কেউই আমাকে সহায়তা করেনি। কমান্ড এক্সিকিউশনে বাহ্যিক এসডি কার্ড ডিরেক্টরিতে (যেমন / স্টোরেজ / এ 5 এফ 9-15 এফ 4) প্রয়োজনীয় পাথ রয়েছে তবে এটি নিয়মিত প্রকাশের সাথে মেলে না তাই এটি ফিরে আসে নি। স্যামসুংয়ের পরে ডিরেক্টরি নামকরণের পদ্ধতিটি আমি পাই না। কেন তারা মানদণ্ড থেকে বিচ্যুত হয় (অর্থাত্ extsdcard) এবং আমার ক্ষেত্রে (যেমন / স্টোরেজ / এ 5 এফ 9-15 এফ 4) এর মতো সত্যই মজাদার কিছু নিয়ে আসে । আমি কি অনুপস্থিত কিছু আছে? যাইহোক, গ্যাথোনিকের নিয়মিত অভিব্যক্তিতে পরিবর্তনগুলি অনুসরণ করেmount সমাধান আমাকে বৈধ এসডকার্ড ডিরেক্টরি পেতে সহায়তা করেছে:

final HashSet<String> out = new HashSet<String>();
        String reg = "(?i).*(vold|media_rw).*(sdcard|vfat|ntfs|exfat|fat32|ext3|ext4).*rw.*";
        String s = "";
        try {
            final Process process = new ProcessBuilder().command("mount")
                    .redirectErrorStream(true).start();
            process.waitFor();
            final InputStream is = process.getInputStream();
            final byte[] buffer = new byte[1024];
            while (is.read(buffer) != -1) {
                s = s + new String(buffer);
            }
            is.close();
        } catch (final Exception e) {
            e.printStackTrace();
        }

        // parse output
        final String[] lines = s.split("\n");
        for (String line : lines) {
            if (!line.toLowerCase(Locale.US).contains("asec")) {
                if (line.matches(reg)) {
                    String[] parts = line.split(" ");
                    for (String part : parts) {
                        if (part.startsWith("/"))
                            if (!part.toLowerCase(Locale.US).contains("vold"))
                                out.add(part);
                    }
                }
            }
        }
        return out;

আমি নিশ্চিত নই যে এটি কোনও বৈধ সমাধান এবং এটি যদি অন্য স্যামসাং ট্যাবলেটগুলির ফলাফল দেয় তবে এটি আমার আপাতত স্থির করে দিয়েছে। অ্যান্ড্রয়েড (v6.0) এ অপসারণযোগ্য SD কার্ড পাথ পুনরুদ্ধার করার জন্য অন্য একটি পদ্ধতি অনুসরণ করা হল। আমি অ্যান্ড্রয়েড মার্শমালো দিয়ে পদ্ধতিটি পরীক্ষা করেছি এবং এটি কাজ করে। এতে ব্যবহৃত পদ্ধতির বিষয়টি খুব মৌলিক এবং অবশ্যই অন্যান্য সংস্করণগুলিতেও কাজ করবে তবে পরীক্ষাটি বাধ্যতামূলক। এর মধ্যে কিছু অন্তর্দৃষ্টি সহায়ক হবে:

public static String getSDCardDirPathForAndroidMarshmallow() {

    File rootDir = null;

    try {
        // Getting external storage directory file
        File innerDir = Environment.getExternalStorageDirectory();

        // Temporarily saving retrieved external storage directory as root
        // directory
        rootDir = innerDir;

        // Splitting path for external storage directory to get its root
        // directory

        String externalStorageDirPath = innerDir.getAbsolutePath();

        if (externalStorageDirPath != null
                && externalStorageDirPath.length() > 1
                && externalStorageDirPath.startsWith("/")) {

            externalStorageDirPath = externalStorageDirPath.substring(1,
                    externalStorageDirPath.length());
        }

        if (externalStorageDirPath != null
                && externalStorageDirPath.endsWith("/")) {

            externalStorageDirPath = externalStorageDirPath.substring(0,
                    externalStorageDirPath.length() - 1);
        }

        String[] pathElements = externalStorageDirPath.split("/");

        for (int i = 0; i < pathElements.length - 1; i++) {

            rootDir = rootDir.getParentFile();
        }

        File[] files = rootDir.listFiles();

        for (File file : files) {
            if (file.exists() && file.compareTo(innerDir) != 0) {

                // Try-catch is implemented to prevent from any IO exception
                try {

                    if (Environment.isExternalStorageRemovable(file)) {
                        return file.getAbsolutePath();

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

এই সমস্যাটি পরিচালনা করার জন্য আপনার কাছে যদি অন্য কোনও পদ্ধতি থাকে তবে দয়া করে ভাগ করুন। ধন্যবাদ


এখানে আমার সমাধান যা নওগাট পর্যন্ত কাজ করে: stackoverflow.com/a/40205116/5002496
গোকুল এনসি

আমি আসলে আসুস Zenfone 2 এ আপনার সাথে একই সমস্যা আছে, কিন্তু আমি Dmitriy Lozenko পরিবর্তে সমস্যা সমাধানের জন্য থেকে কোড পরিবর্তন stackoverflow.com/a/40582634/3940133
HendraWD

@ হেন্দ্রডাব্লুডি আপনি যে সমাধানটির পরামর্শ দিচ্ছেন সেটি অ্যান্ড্রয়েড মার্শমেলো (6.0) এর সাথে কাজ করবে না কারণ এতে পরিবেশের ভেরিয়েবলের সমর্থন সরিয়ে দেওয়া হয়েছে। আমি ঠিক মনে করতে পারি না তবে আমি মনে করি এটি চেষ্টা করে দেখেছি।
আব্দুল রেহমান

@ গোকুলএনসি আমি এটি দিয়ে চেষ্টা করব। বৈধ বলে মনে হচ্ছে :)
আব্দুল রেহমান

@ গোকুলএনসি হ্যাঁ, এজন্যই আমি প্রসঙ্গটি ব্যবহার করি getআজট এক্সটার্নালফায়াল্ডস (নাল); সংস্করণ> মার্শমেলো
হেন্ডেনডাব্লুডি


0
//manifest file outside the application tag
//please give permission write this 
//<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        File file = new File("/mnt");
        String[] fileNameList = file.list(); //file names list inside the mnr folder
        String all_names = ""; //for the log information
        String foundedFullNameOfExtCard = ""; // full name of ext card will come here
        boolean isExtCardFounded = false;
        for (String name : fileNameList) {
            if (!isExtCardFounded) {
                isExtCardFounded = name.contains("ext");
                foundedFullNameOfExtCard = name;
            }
            all_names += name + "\n"; // for log
        }
        Log.d("dialog", all_names + foundedFullNameOfExtCard);

এটি প্রাথমিকভাবে ডিভাইসে মাউন্ট করা সমস্ত ড্রাইভারদের স্ট্রিংলিস্ট পাওয়ার জন্য প্রাথমিকভাবে।
এমরে কিলিংক আরসলান

0

আমার এসডি কার্ডে ফাইলগুলি অ্যাক্সেস করতে , আমার এইচটিসি ওয়ান এক্স (অ্যান্ড্রয়েড) এ, আমি এই পথটি ব্যবহার করি:

file:///storage/sdcard0/folder/filename.jpg

ট্রিপলটি নোট করুন "/"!


-1

গ্যালাক্সি এস 3 অ্যান্ড্রয়েডে 4.3 আমি যে পথটি ব্যবহার করি তা হ'ল। / স্টোরেজ /েক্সটএসডি কার্ড / কার্ড / এবং এটি কাজ করে। আশা করি এটা সাহায্য করবে,


-1

নিম্নলিখিত পদক্ষেপগুলি আমার জন্য কাজ করেছিল। আপনার কেবল এই লাইনগুলি লিখতে হবে:

String sdf = new String(Environment.getExternalStorageDirectory().getName());
String sddir = new String(Environment.getExternalStorageDirectory().getPath().replace(sdf,""));

প্রথম লাইনটি এসডি ডিরেক্টরিটির নাম দেবে এবং আপনাকে দ্বিতীয় স্ট্রিংয়ের জন্য এটি প্রতিস্থাপন পদ্ধতিতে ব্যবহার করতে হবে। দ্বিতীয় স্ট্রিংটিতে অভ্যন্তরীণ এবং অপসারণযোগ্য এসডি (/ স্টোরেজ / আমার ক্ষেত্রে) এর পথ থাকবে । আমার অ্যাপ্লিকেশনের জন্য আমার কেবল এই পথটির প্রয়োজন ছিল তবে আপনার যদি এটি প্রয়োজন হয় তবে আপনি আরও এগিয়ে যেতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.