Android: Finding the SD Card Path

Finding the SD Card path in Android is easy right? All you have to do is use Environment.getExternalStoreDirectory(), and you’re good to go!

Well, not quite.

After all, that’s what StackOverflow says. If you actually try the above method on a Samsung device, life won’t be fun for you. Environment.getExternalStoreDirectory() actually returns the incorrect path on most Samsung devices. That’s how I came across the issue. It turns out, the above method doesn’t actually guarantee that it will return the SD Card directory. According to Android’s API documentation,

“In devices with multiple ‘external’ storage directories (such as both secure app storage and mountable shared storage), this directory represents the ‘primary’ external storage that the user will interact with.”

So the call doesn’t guarantee that the path returned truly points SD Card. There are a few other ways to get an “external” path on the device where files can be stored, though, like the getExternalFilesDir().

There are also a few other tricks to actually get the path of the SD Card directory. The below code works on most Android devices (Samsung included). It’s a pretty hacky solution, though, and who knows how long this trick will actually work (source). Instead of using the code below, it may be better to ask the question, “do I really need the SD Card directory, or just a path that I can store files to?”

 File file = new File("/system/etc/vold.fstab");
     FileReader fr = null;
     BufferedReader br = null;
    
     try {
         fr = new FileReader(file);
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     } 
    
     try {
         if (fr != null) {
             br = new BufferedReader(fr);
             String s = br.readLine();
             while (s != null) {
                 if (s.startsWith("dev_mount")) {
                     String[] tokens = s.split("\\s");
                     path = tokens[2]; //mount_point
                     if (!Environment.getExternalStorageDirectory().getAbsolutePath().equals(path)) {
                         break;
                     }
                 }
                 s = br.readLine();
             }
         }            
     } catch (IOException e) {
         e.printStackTrace();
     } finally {
         try {
             if (fr != null) {
                 fr.close();
             }            
             if (br != null) {
                 br.close();
             }
         } catch (IOException e) {
             e.printStackTrace();
         }
     }

Happy coding and don’t forget to share!

Reference: Android Tutorial: Finding the SD Card Path from our JCG partner Isaac Taylor at the Programming Mobile blog.

Related Whitepaper:

Rapid Android Development: Build Rich, Sensor-Based Applications with Processing

Create mobile apps for Android phones and tablets faster and more easily than you ever imagined

Use 'Processing', the free, award-winning, graphics-savvy language and development environment, to work with the touchscreens, hardware sensors, cameras, network transceivers, and other devices and software in the latest Android phones and tablets.

Get it Now!  

Leave a Reply


× 8 = forty



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close