java - Android 无法在 SD 卡上执行 mkdir()

标签 java android file storage android-file

我有一些代码可以在 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;
            }
        }

并且我在我的 list 文件中注册了权限:

<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 ===

我正在使用 Nexus 5 进行测试。我看到了这篇文章 Cannot find storage/emulated/0/ folder of Nexus 7 in Eclipse可能有什么问题?

=== 更新 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() 中执行此操作,否则请检查您的外部媒体是否可用。作为docs说:

Before you do any work with the external storage, you should always call getExternalStorageState() to check whether the media is available. The media might be mounted to a computer, missing, read-only, or in some other state.

他们提供的一个例子:

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;
}

关于java - Android 无法在 SD 卡上执行 mkdir(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20114206/

相关文章:

python - ftplib 远程更改文件

java - maven.plugin.classpath 和 maven.runtime.classpath 有什么区别

java - 从类外部运行父类定义的 equal 方法

java - 抛出 ConcurrentModificationException(内部有多个 for 循环)

android - 如何动态创建 fragment 寻呼机适配器

c - 如何在C中读取和减去文件中不同行中的2个值

java - 将 SMS 发送到非 native 端口 – 端口 0 除外

Android IPC 和 ContentProvider 的区别

android - ListView 滚动时改变记录

C++逐字符读取二进制文件