簡體   English   中英

Android無法在SD卡上執行mkdir()

[英]Android failed to mkdir() on SD card

我有一些代碼可以在SD卡上創建/獲取文件夾:

if( hasSDCard() ){

        UUID uniqueFileName = UUID.randomUUID();

        mediaStorageDir = new File(
                getExternalImageStoragePath(),
                "MyApp");

        if ( ! mediaStorageDir.exists() ){

            if( ! mediaStorageDir.mkdirs() ){

                MyLogger.Error("Create image directory FAILED. path: " + mediaStorageDir.getPath());

                return null;
            }
        }

並且我已經在清單文件中注冊了權限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STOREAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

但是當我運行它時,它會打印:

Create image directory FAILED. path: /storage/emulated/0/Pictures/MyApp

我想知道為什么會這樣嗎?

===更新===

我已經嘗試了所有這些:

/**
 * get external storage directory path for image
 * @return
 */
public static String getExternalImageStoragePath(){

    String strPath = "";

    if(hasSDCard()){
        //strPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getPath();
        //strPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).getAbsolutePath();
        //strPath = Environment.getExternalStorageDirectory().getPath();
        strPath = Environment.getExternalStorageDirectory().getAbsolutePath();
    }

    return strPath;
}

但是他們的行為完全一樣...

===更新2 ===

我正在測試Nexus5。我看到了這篇文章在Eclipse中找不到Nexus 7的storage / emulated / 0 /文件夾可能有問題嗎?

===更新3 ===

>> adb shell ls -l /storage/
dr-xr-xr-x root     root              1970-01-24 23:48 emulated
lrwxrwxrwx root     root              1970-01-24 23:48 sdcard0 -> /storage/emulated/legacy

>> adb shell ls -l /storage/emulated/0/Pictures/
/storage/emulated/0/Pictures/: No such file or directory

===更新4 ===

這是我的hasSD()方法:

public static boolean hasSDCard(){
    boolean fHasSDCard = false;

    if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())){
        fHasSDCard = true;
    }

    return fHasSDCard;
}

編輯:您拼錯了您的權限(您有STOREAGE,而正確的是STORAGE)

更改

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

至:

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

除非您尚未在hasSDCard()中進行此操作,否則請檢查您的外部媒體是否完全可用。 正如文檔所說:

在使用外部存儲進行任何操作之前,應始終調用getExternalStorageState()來檢查介質是否可用。 介質可能已安裝到計算機上,丟失,只讀或處於其他某種狀態。

他們提供了一個示例:

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}
// try this
File mediaStorageDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + "MyApp" + "/");
if (!mediaStorageDir.exists()) {
      mediaStorageDir.mkdirs();
}

mediaStorageDir.getAbsolutePath()

嘗試這個:

mediaStorageDir = new File(
            Environment.getExternalStorageDirectory().getAbsolutePath(),
            "MyApp");

這就是我正在做的事情,對我有用

File path = Environment.getExternalStorageDirectory();
String save_path = path.toString() + "/MyApp/";
File newFile=new File(save_path );
newFile.mkdirs();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM