如何将图像复制到SD卡上的现有目录? [英] How to copy image to an existing directory on sd card?

查看:121
本文介绍了如何将图像复制到SD卡上的现有目录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用以下代码复制图像文件:

I'm trying to copy an image file with this code:

InputStream fileInputStream = null;
OutputStream fileOutputStream = null;
String inPath = "/storage/emulated/0/Pictures/MyImage.jpg"; 
String outPath = "/storage/extSdCard/MyFolder/MyImage.jpg";
    try {
    verifyStoragePermissions(this);
    fileInputStream = new FileInputStream(new File(inPath));
    File outputFile = new File(outPath);
        if (!outputFile.exists()) {
            try {
                outPutFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    fileOutputStream = new FileOutputStream(outputFile);

    byte[] buffer = new byte[1024];
    int read;
    while ((read = fileInputStream.read(buffer)) != -1) {
        fileOutputStream.write(buffer, 0, read);
    }
    fileInputStream.close();
    fileInputStream = null;
    fileOutputStream.flush();
    fileOutputStream.close();
    fileOutputStream = null;

    } catch (Exception e) {
    Log.e("tag", e.getMessage());
    }

这是验证sdk> = 23上的存储权限的方法

And this is the method for verifying storage permissions on sdk>=23

// Storage Permissions
private static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
};

/**
 * Checks if the app has permission to write to device storage
 *
 * If the app does not has permission then the user will be prompted to grant permissions
 *
 * @param activity
 */
public static void verifyStoragePermissions(Activity activity) {
    // Check if we have write permission
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        // We don't have permission so prompt the user
        ActivityCompat.requestPermissions(
                activity,
                PERMISSIONS_STORAGE,
                REQUEST_EXTERNAL_STORAGE
        );
    }
}

结果是在到达buffer行之前发生的此错误.

And result is this error which occurs before reaching the buffer line.

Unable to decode stream: java.io.FileNotFoundException: /storage/extSdCard/MyFolder/MyImage.jpg: open failed: ENOENT (No such file or directory)

我在SD卡上安装了MyFolder,并且我的设备上的Gallery应用程序将图像复制到该目录也没有问题.

I have MyFolder on sd card and gallery apps on my device copy images to this directory without any problem.

注意:权限是在清单(在应用程序标签之前的正确位置)和内部活动(对于skd> = 23)中授予的.

NOTE: permissions are granted in the manifest (in the correct place before application tag) and inside activity(for skd >=23) .

  1. 建议在fileOutputStream之前创建文件(这无济于事).

  1. Implemented suggestion of creating file before fileOutputStream (didn't help).

降低了targetSdkVersion的权限,使其无法解决与权限相关的任何可能的问题,但仍然没有成功.

Lowered the targetSdkVersion to overpass any possible problems related to permissions and still no success.

targetSdkVersion 22

  1. 以这种方式创建File:

File outFile = new File("/storage/extSdCard", "MyFolder/MyImage.jpg");

也没有结果.

我正在android 22版上对其进行测试.

I'm testing it on android version 22.

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

推荐答案

这是我使用SAF完成工作的方式.

This is the way I used SAF to get the job done.

private void newcopyFile(File fileInput, String outputParentPath,
                    String mimeType, String newFileName) {

DocumentFile documentFileGoal = DocumentFile.fromTreeUri(this, treeUri);

String[] parts = outputParentPath.split("\\/");
for (int i = 3; i < parts.length; i++) { //ex: parts:{"", "storage", "extSdCard", "MyFolder", "MyFolder", "MyFolder"}
    if (documentFileGoal != null) {
        documentFileGoal = documentFileGoal.findFile(parts[i]);
    }
}
if (documentFileGoal == null) {
    Toast.makeText(MainActivity.this, "Directory not found", Toast.LENGTH_SHORT).show();
    return;
}

DocumentFile documentFileNewFile = documentFileGoal.createFile(mimeType, newFileName);

InputStream inputStream = null;
OutputStream outputStream = null;
try {
    outputStream = getContentResolver().openOutputStream(documentFileNewFile.getUri());
    inputStream = new FileInputStream(fileInput);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
try {
    if (outputStream != null) {
        byte[] buffer = new byte[1024];
        int read;
        if (inputStream != null) {
            while ((read = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
            }
        }
        if (inputStream != null) {
            inputStream.close();
        }
        inputStream = null;
        outputStream.flush();
        outputStream.close();
        outputStream = null;
    }
} catch (IOException e) {
    e.printStackTrace();
}
}

这篇关于如何将图像复制到SD卡上的现有目录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆