Android 无法写入SD卡

Android 无法写入SD卡,android,Android,我的应用程序允许用户拍照,我希望照片存储在应用程序的外部文件目录getExternalFilesDirnull中。除了调用renameTo之外,它都可以工作,这个调用返回false,我不知道为什么 src文件是: /存储/extSdCard/DCIM/Camera/20140424_154458.jpg Dest文件是: /存储/仿真/0/Android/data/com.myapp.myapp/files/20140424_154458.jpg 我还指定了WRITE_EXTERNAL_存储权限

我的应用程序允许用户拍照,我希望照片存储在应用程序的外部文件目录getExternalFilesDirnull中。除了调用renameTo之外,它都可以工作,这个调用返回false,我不知道为什么

src文件是:

/存储/extSdCard/DCIM/Camera/20140424_154458.jpg

Dest文件是:

/存储/仿真/0/Android/data/com.myapp.myapp/files/20140424_154458.jpg

我还指定了WRITE_EXTERNAL_存储权限

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    if (item.getItemId() == R.id.action_take_picture)
    {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, TAKE_PICTURE_REQUEST_CODE);
        return true;
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == TAKE_PICTURE_REQUEST_CODE && resultCode == RESULT_OK)
    {
        File dest = new File(
            getExternalFilesDir(null),
            new SimpleDateFormat("yyyyMMdd_hhmmss", Locale.getDefault()).format(new Date()) + ".jpg");

        File src = new File(convertMediaUriToPath(data.getData()));
        if (src.renameTo(dest)) // Always returns false
        {
            mAdapter.add(dest);
            mAdapter.notifyDataSetChanged();
        }
    }
}

private String convertMediaUriToPath(Uri uri)
{
    String[] proj = {MediaStore.Images.Media.DATA};
    Cursor cursor = getContentResolver().query(uri, proj, null, null, null);
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String path = cursor.getString(column_index);
    cursor.close();

    return path;
}

我以前遇到过这个问题-不幸的是,您不允许使用renameTo在不同的装载点(例如内部和外部存储)之间移动文件和/或目录。考虑使用一种不同的移动文件的方式,比如这里概述的一种:


我以前遇到过这个问题-不幸的是,您不允许使用renameTo在不同的装载点(例如内部和外部存储)之间移动文件和/或目录。考虑使用一种不同的移动文件的方式,比如这里概述的一种:


问题在于renameTo方法,renameTo不创建子目录

原因是当前的文件API在Java中没有很好地实现。在当前不存在的文件API中,有许多功能是需要的,例如移动、复制和检索文件元数据

我认为没有人能够给你一个关于API为什么是按原样编写的答案。可能是一个糟糕的初稿,但由于向后兼容性问题而无法更改

这些问题已在Java7中得到解决。已经创建了一个全新的API来处理文件

要解决此问题,请尝试获取目标文件的目录路径 e、 g/storage/emulated/0/Android/data/com.myapp.myapp/files/20140424_154458.jpg

目标目录为 /存储/仿真/0/Android/data/com.myapp.myapp/files/


使用,它将为您创建所有子目录

问题在于方法renameTo,renameTo不创建子目录

原因是当前的文件API在Java中没有很好地实现。在当前不存在的文件API中,有许多功能是需要的,例如移动、复制和检索文件元数据

我认为没有人能够给你一个关于API为什么是按原样编写的答案。可能是一个糟糕的初稿,但由于向后兼容性问题而无法更改

这些问题已在Java7中得到解决。已经创建了一个全新的API来处理文件

要解决此问题,请尝试获取目标文件的目录路径 e、 g/storage/emulated/0/Android/data/com.myapp.myapp/files/20140424_154458.jpg

目标目录为 /存储/仿真/0/Android/data/com.myapp.myapp/files/


使用,它将为您创建所有子目录

如果您要添加文件或文件夹或将应用程序移动到SD卡中,只需执行以下操作:

步骤:

1使用文本或编程编辑器打开Android应用程序的源代码文件。2浏览到源代码中希望调用将文件写入设备外部存储器的函数的位置。3插入这一行代码以检查SD卡:

File sdCard = Environment.getExternalStorageDirectory();
FileOutputStream f = new FileOutputStream(file);
Finally step 7:
4插入以下代码行以设置目录和文件名:

File dir = new File (sdcard.getAbsolutePath() + "/folder1/folder2");
dir.mkdirs();
File file = new File(dir, "example_file");

// The mkdirs function will create the directory folder for you, use it only you want to create a new one.
5将上述代码中的/folder1/folder2替换为要保存文件的实际路径。这应该是您通常保存应用程序文件的位置。另外,将example_file值更改为您希望使用的实际文件名

6插入以下代码行以将文件输出到SD卡:

File sdCard = Environment.getExternalStorageDirectory();
FileOutputStream f = new FileOutputStream(file);
Finally step 7:
保存文件,然后编译并使用Android emulator软件或设备测试应用程序


这会有用的-

如果要添加文件或文件夹或将应用程序移动到SD卡中,只需执行以下操作:

步骤:

1使用文本或编程编辑器打开Android应用程序的源代码文件。2浏览到源代码中希望调用将文件写入设备外部存储器的函数的位置。3插入这一行代码以检查SD卡:

File sdCard = Environment.getExternalStorageDirectory();
FileOutputStream f = new FileOutputStream(file);
Finally step 7:
4插入以下代码行以设置目录和文件名:

File dir = new File (sdcard.getAbsolutePath() + "/folder1/folder2");
dir.mkdirs();
File file = new File(dir, "example_file");

// The mkdirs function will create the directory folder for you, use it only you want to create a new one.
5将上述代码中的/folder1/folder2替换为要保存文件的实际路径。这应该是您通常保存应用程序文件的位置。另外,将example_file值更改为您希望使用的实际文件名

6插入以下代码行以将文件输出到SD卡:

File sdCard = Environment.getExternalStorageDirectory();
FileOutputStream f = new FileOutputStream(file);
Finally step 7:
保存文件,然后编译并使用Android emulator软件或设备测试应用程序


这会有用的-

这是外部文件目录。默认情况下存在,不是吗?@greenapps否它不存在这是ExternalFilesDir。存在
默认情况下不是吗?@greenapps不,不是