How can I get the external SD card path for Android 4.0+?

前端 未结 26 2722
清歌不尽
清歌不尽 2020-11-22 04:48

Samsung Galaxy S3 has an external SD card slot, which is mounted to /mnt/extSdCard.

How can I get this path by something like Environment.getExter

相关标签:
26条回答
  • 2020-11-22 05:47

    that's not true. /mnt/sdcard/external_sd can exist even if the SD card is not mounted. your application will crash when you try to write to /mnt/sdcard/external_sd when it's not mounted.

    you need to check if the SD card is mounted first using:

    boolean isSDPresent = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
    
    0 讨论(0)
  • 2020-11-22 05:47

    System.getenv("SECONDARY_STORAGE") returns null for Marshmallow. This is another way of finding all the externals dirs. You can check if it's removable which determines if internal/external

    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 讨论(0)
  • 2020-11-22 05:48

    Thanks for the clues provided by you guys, especially @SmartLemon, I got the solution. In case someone else need it, I put my final solution here( to find the first listed external SD card ):

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

    If no external SD card there, then it returns the on board storage. I will use it if the sdcard is not exist, you may need to change it.

    0 讨论(0)
  • 2020-11-22 05:48
    //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 讨论(0)
  • 2020-11-22 05:49

    On some devices (for example samsung galaxy sII )internal memory card mabe be in vfat. In this case use refer last code, we obtain path internal memory card (/mnt/sdcad) but no external card. Code refer below solve this problem.

    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;
    }
    
    0 讨论(0)
  • 2020-11-22 05:50

    I am sure this code will surely resolve your issues...This is working fine for me...\

    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();
            } 
    
    0 讨论(0)
提交回复
热议问题