我正在尝试在Samsung S4中的外部SD卡上创建一个目录。做这样的事情,
public void createTestFile(){
File appDir = new File(Environment.getExternalStorageDirectory() + "/external_sd", "TestFile");
appDir.mkdir();
}
不会在我的外部SD卡上创建目录。 根据其他几个StackOverflow帖子和三星开发者论坛(http://developer.samsung.com/forum/board/thread/view.do?boardName=GeneralB&messageId=162934&messageNumber=1381&startId=zzzzz~&searchType=TITLE&searchText=sdcard),它应该。
检查应用程序清单我有以下权限,
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">
我在这里缺少什么?这个设备扎根了,我每晚都在运行最近的CyanogenMod 12.1。 / sdcard,/ external_sd和/ extSdCard的权限显示正确。
我也试过了,
File appDir = new File(Environment.getExternalStorageDirectory().getParent() + "/external_sd", "TestFile");
以及.getAbsolutePath()和.getPath()没有任何运气。我在这里错过了什么?它必须简单......
更新2015年11月21日下午7:00 尝试以下,
public void createTestFile(){
String showPath = Environment.getExternalStorageDirectory().getParent();// "../storage/emulated"
//String finalPath = showPath+"/0"; // "../storage/emulated/0" This works- writes to internal sdcard.
//String finalPath = showPath+"/1"; // "../storage/emulated/1" Doesn't work- does not write to external sdcard.
String finalPath = showPath+"/external_sd"; // "../storage/emulated/external_sd" Doesn't work either...
File appDir = new File(finalPath, "testFile");
appDir.mkdir();
}
我确信我的finalPath字符串=&#34; / storage / emulated / 1&#34;或&#34; / storage / emulated / external_sd&#34;会写一个目录到可移动的SD卡,但也没有。从功能上来说,似乎好像/ external_sd是只读的,但检查权限我发现所有者/组/用户都被检查。建议?
第二次更新11/21/2015 8:10 pm 快速查看/ proc / mounts后,我发现了以下存储/标识卡引用,
/dev/fuse /storage/sdcard1 ...
/dev/fuse /storage/emulated/0 ...
/dev/fuse /storage/emulated/0/Android/obb ...
/dev/fuse /storage/emulated/legacy ...
/dev/fuse /storage/emulated/legacy/Android/obb ...
基于此,我修改了
File appDir = new File(Environment.getExternalStorageDirectory().getParent() + "/external_sd", "TestFile");
要,
File appDir = new File(/storage/sdcard1, "testFile");
并且最终能够在我的可移动SD卡上创建一个目录。 这显然是一个肮脏,疯狂的修复。建议更好的方法?外部SD卡的完整/ proc / mount如下所示。 TIA
/dev/fuse /storage/sdcard1 fuse rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
答案 0 :(得分:0)
原油,但有效。
public void createNewFile(){
String szFilePath;
//if jactivelte (Samsung S4 Active) with CyanogenMod 12.1 ROM, then write to removable sdcard
if (android.os.Build.DEVICE.contains("jactivelte")){
szFilePath = "/storage/sdcard1";
}else{ //any other ROM, will *likely* write to internal sdcard
szFilePath = Environment.getExternalStorageDirectory().getAbsolutePath();
}
File appDir = new File(szFilePath, "testFile");
appDir.mkdir();
}
打开以接受将默认文件创建为可移动SD卡的其他答案(如果存在)。
答案 1 :(得分:0)
更好的解决方案。
public void createRemoveableSdcardFile(View view) {
if(Build.VERSION.SDK_INT >=19){
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();
}else if(Build.VERSION.SDK_INT < 19){
String szFilePath = System.getenv("SECONDARY_STORAGE");
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);
}