在Samsung S4 Active手机中创建外部SD卡上的目录

时间:2015-11-21 07:06:42

标签: android sd-card android-sdcard samsung-mobile android-external-storage

我正在尝试在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

2 个答案:

答案 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); 
}