Невозможно создать файл на съемной SD-карте в Android 5.0.1

Я работаю над приложением, которому нужна возможность создавать файлы на съемной SD-карте в устройстве Samsung S4 i9295. Я использую стандартную прошивку Samsung 5.0.1 с рутом. В целях тестирования я пытался создать эти файлы, жестко задав пути для этого конкретного устройства, но не смог создать файлы на съемной карте. Приведенный ниже код создает файлы, как и ожидалось, на внутренней SD-карте, но не на съемной карте.

//creates directory on internal sdcard
public void createInternalSdcardFile(){     
    Log.v(LOGTAG, "Create internal sdcard file initiated");
    String szFilePath = "/storage/sdcard0";
    File appDir = new File(szFilePath, "TargetFile");
    appDir.mkdir();  
    makeTimestamp();
    File exportDir = new File(szFilePath, "TargetFile/" + szDateTime);
    exportDir.mkdir();
} 
//creates a directory at the root of the REMOVEABLE sdcard
public void createRemoveableSdcardFile(){   
    Log.v(LOGTAG, "Create removeable sdcard file initiated");
    String szFilePath = "/storage/extSdCard";
    File appDir = new File(szFilePath, "TargetFile");
    appDir.mkdir();  
    makeTimestamp();
    File exportDir = new File(szFilePath, "TargetFile/" + szDateTime);
    exportDir.mkdir();
}
public void makeTimestamp(){    
    Date T = new Date();        
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    szDateTime = sdf.format(T); 
}

Обзор Logcat не показывает ничего подозрительного. Соответствующие разрешения манифеста:

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

Права доступа к файлу «/storage/extSdCard» на устройстве — чтение, запись, выполнение владельцем. Группа также читала, записывала и выполняла. Остальные только исполняются. Права доступа к файлу «/storage/sdcard0»: чтение, запись, выполнение для всех.

Почему я не могу писать на съемную карту для этого устройства? Буду признателен за конкретные предложения по решению.

Примечание. Я также работаю с getExternalFilesDirs() и могу записывать на внутреннюю SD-карту, но не на съемную карту, как в случае со статическими ссылками. Статические пути используются в примере кода здесь для упрощения.


comment
У вас нет произвольного доступа к съемному хранилищу на Android 4.4+: commonsware.com/blog/2014/04/09/   -  person CommonsWare    schedule 22.04.2016


Ответы (1)


Понятно. В общем замена...

String szFilePath = "/mnt/extSdCard/temp";

с этим:

File[] fo = getExternalFilesDirs(null);
    File f =fo[1];

решил проблему. Конкретные изменения в окончательном тестовом примере:

public void createRemoveableSdcardFile(View view) {
    File[] fo = getExternalFilesDirs(null);
    File f =fo[1];
    File appDir = new File(f, "TargetFile");
    appDir.mkdir();  
    makeTimestamp();
    File exportDir = new File(f, "TargetFile/" + szDateTime);
    exportDir.mkdir();         
}

Это создает файл на съемной SD-карте здесь:

../extsdcard/android/data/net.google.example/file/
person portsample    schedule 22.04.2016