java - Android 无法对 SD 卡进行写入和删除操作

标签 java android permissions file-permissions storage-access-framework

我现在正在开发 ImageCompressor 应用程序。

我需要删除写入(更新)图像文件。在内部存储中运行完美,但 **SD​​ 卡无法让我访问删除和写入文件。

我的应用如何在 SD 卡(可移动存储)上执行写入删除操作

我已经在没有这个的情况下完成了整个项目,所以我必须找到一种方法。

更新:

我已经在研究和讨论这个问题。并且了解我必须使用 存储访问框架 但我是 SAF 的新手。

我使用 来压缩需要文件而不是Uri 的照片。为此,我执行 Uri -> File 并使用 Intent.ACTION_OPEN_DOCUMENT 并从可移动存储中选择图像。

But for removable storage I can't find Image Real Path from uri.

不知道这样对不对。如果在 SAF 中有任何方法可以使用 uri 压缩我的图像,请告诉我。或者 如何从可移动存储照片的 uri 获取图像真实路径

更新代码SAF:

//  -----------  Intent  -------------
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");

//  ------------  On Activity Result  --------------
Uri uri = data.getData();
try {
    ParcelFileDescriptor fileDescriptor = getContentResolver().openFileDescriptor(uri, "w");
    FileOutputStream fos = new FileOutputStream(fileDescriptor.getFileDescriptor());

    FileInputStream fis = new FileInputStream(getImageFilePath(uri));

    FileChannel source = fis.getChannel();
    FileChannel destination = fos.getChannel();
    destination.transferFrom(source, 0, source.size());

    fis.close();
    fos.close();
    fileDescriptor.close();
    Toast.makeText(this, "File save successfully.", Toast.LENGTH_SHORT).show();
}

Uri to File Path,我完成了从媒体应用程序(如 Gallary、Photos)中选择图像的操作,但是从 SD 卡中选择什么而不是 MediaStore.Images.Media.DATA 我不知道。代码:

private File getImageFilePath(Uri uri) throws IOException {
    String image_id = null, imagePath = null;

    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
        image_id = cursor.getString(0);
        image_id = image_id.substring(image_id.lastIndexOf(":") + 1);
        cursor.close();
    }
    cursor = getContentResolver().query(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media._ID + " = ? ", new String[]{image_id}, null);
    if (cursor!=null) {
        cursor.moveToFirst();
        imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
        cursor.close();
    }

    File file = new File(imagePath);
    return new Compressor(this).setQuality(50).compressToFile(file);
}

最佳答案

如果您使用 File 和 FileOutputStream 类,可移动 SD 卡只能在现代 Android 设备上写入。

如果幸运的话,您的设备使用 getExternalFilesDirs() 将作为第二项返回卡上您仍然可以写入的应用程序特定目录。

对于其余部分,请改用 Storage Access Framework .

首先让用户选择带有 Intent.ACTION_OPEN_DOCUMENT_TREE 的 SD 卡或带有 Intent.ACTION_OPEN_DOCUMENT 的文件。

关于java - Android 无法对 SD 卡进行写入和删除操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51981612/

相关文章:

java - 列出所有内容为空的 td 节点

java - 调用 menuitems 来触发单独的代码块

android - Android神秘的空指针异常

python - 在没有root的情况下在Python中实现UDP traceroute

ubuntu - Vagrant 1.1.5 中的共享文件夹权限

java - 如何在JAVA中正确关闭java SocketChannel?

java - C++ 列出用法

android - 重启安卓工作室

java - 在 Android 应用程序中使用 MultiDex 运行 ProGuard 两次,并且仅第二次运行警告/注释?

jenkins - Jenkins windows 服务需要管理员权限吗?