Search code examples
androidandroid-external-storage

getExternalFilesDir () doesnot store file to mounted memory card


I am using Nougut 7.1.1 device

When I run the below given code, file is stored in device or internal storage "emulated/0..." but I want to store it in removable memory card.

I logged getExternalStorageState() and it shows mounted.
I tried using Environment.getExternalStorageDirectory() also,stored in "emulated/0...", no result

I have used permissions in manifest file too as below:

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

Note: However, both internal and external(memory card) storage consist of "Hello World" folder like:
Android/Data/com.example.myapplication/files/Hello World/

but stored file(myData2.txt) is present only in "Hello World" folder of internal storage

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("tag", Environment.getExternalStorageState().toString());
        Log.i("tag", getExternalFilesDir(null).toString());

        savePrivate();

    }

    public void savePrivate() {
        String info = "Written";
        File folder = getExternalFilesDir("Hello World");// Folder Name
        File myFile = new File(folder, "myData2.txt");// Filename
        writeData(myFile, info);
    }

    private void writeData(File myFile, String data) {
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(myFile);
            fileOutputStream.write(data.getBytes());
            Toast.makeText(this, "Done" + myFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

Solution

  • Changed my savePrivate() method as below and it worked like a charm!!
    As per @CommonsWare suggested,using getExternalFilesDirs() returned available array of locations from which I could select particular storage,In my case folder[0] pointed to "emulated/0.." and folder[1] pointed to removable storage (storage/15C8-119Z/...).

        public void savePrivate() {
        String info = "Written";
        File[] folder = getExternalFilesDirs("backup");// Folder Name
        Log.i("tag", String.valueOf(folder[1]).toString());
        File myFile = new File(folder[1], "myData2.txt");// Filename
        writeData(myFile, info);
    }