无法在 Android 5.0.1 中的可移动 SD 卡上创建文件

Unable to create file on removeable sdcard in Android 5.0.1

我正在开发一个需要能够在 Samsung S4 i9295 设备的可移动 SD 卡上创建文件的应用程序。我是 运行 已 root 的原装三星 ROM 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 卡,但不能写入可移动卡,静态引用也是如此。为了简化,此处的示例代码中使用了静态路径。

知道了。 一般来说,替换...

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/