Search code examples
androidandroid-5.0-lollipopandroid-sdcardandroid-5.1.1-lollipopsony-xperia

Store video files on SD card in Android 5


I'm recording video with the aid of android.media.MediaRecorder class, which accepts path string for output file (MediaRecorder.setOutputFile(String)), though there is a version of the method which accepts FileDescriptor.

I need to store huge video files, so I want to use SD card. In order to get path to relevant directory I use Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM). It turns out that resulting path is for the “emulated” storage (/sdcard/…) instead of real SD card (/sdcard1/ on my Xperia Z3 Compact, Android 5.1.1).

I tried to hardcode /sdcard1/ (as well as /storage/sdcard1) but get an IOException talking about permission deny. Of course, I have

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

I heard about huge changes in access to SD card after 4.4 (aka Storage Access Framework), but couldn't find simple and clear enough explanation on how to get things done in such a case. Any help on short and concise solution for this?

PS Solution with hardcoded path would be OK for me as I'm going to use this app only with my phone.


Solution

  • This code should solve your problem:

     public String createVideoFilePath() {
            String time = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File[] pathsArray = getExternalFilesDirs(Environment.DIRECTORY_DCIM);
    

    /Usually, pathArray[1] contains path to necessary folder on removable SD card. So we can generally use just pathArray[1] instead of searching necessary File in pathArray with for statement/

            for (File f : pathsArray) {
                if ((f != null) && (Environment.isExternalStorageRemovable(f))) {
                    return f.getPath() + File.separator +"video_"+ time + ".mp4";
                }
            }
    
            return pathsArray[0].getPath() + File.separator +"video_"+ time + ".mp4";
    
        }
    

    This method returns location of file on removable SD card or in emulated storage, if removable SD doesn't exist

    Just use this method as a paramter of MediaRecorder.setOutputFile(String) Update: It is very important to say, that all files, which locate in folders, gotten with Context. getExternalFilesDirs(String typr) will be removed after uninstalling your app.