从Storage Access Framework UI获取文件夹后保存图像

时间:2017-08-28 17:59:31

标签: android storage-access-framework

我为用户设置了一个首选项,使用Storage Access Framework为我的应用选择保存文件夹。获取uri onActivityResult后,我将其保存为SharedPreferences字符串,并在保存图片时保存。

我使用此方法成功保存图片。

public void saveImageWithDocumentFile(String uriString, String mimeType, String name) {
    isImageSaved = false;
    try {
        Uri uri = Uri.parse(uriString);
        DocumentFile pickedDir = DocumentFile.fromTreeUri(this, uri);
        DocumentFile file = pickedDir.createFile(mimeType, name);
        OutputStream out = getContentResolver().openOutputStream(file.getUri());
        isImageSaved = mBitmap.compress(CompressFormat.JPEG, 100, out);
        out.close();

    } catch (IOException e) {
        throw new RuntimeException("Something went wrong : " + e.getMessage(), e);
    }
    Toast.makeText(MainActivity.this, "Image saved  " + isImageSaved, Toast.LENGTH_SHORT).show();
}

如果用户删除使用SAF选择的文件夹,则iget null DocumentFile file并且应用程序崩溃。我的第一个问题是如何在不再次打开SAF ui的情况下检查文件夹是否存在。

我还想使用ParcelFileDescriptor用这种方法保存相同的图像

public void saveImageWithParcelFileDescriptor(String folder, String name) {
    if (mBitmap == null) {
        Toast.makeText(MainActivity.this, "", Toast.LENGTH_SHORT).show();
        return;
    }
    String image = folder + File.separator + name + ".jpg";
    Toast.makeText(MainActivity.this, "image " + image, Toast.LENGTH_LONG).show();

    Uri uri = Uri.parse(image);
    ParcelFileDescriptor pfd = null;
    FileOutputStream fileOutputStream = null;
    try {
        pfd = getContentResolver().openFileDescriptor(uri, "w");
        fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
        mBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (pfd != null) {
            try {
                pfd.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (fileOutputStream != null) {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    Toast.makeText(MainActivity.this, "Image saved  " + isImageSaved, Toast.LENGTH_SHORT).show();

}

我得java.lang.IllegalArgumentException: Invalid URI: content://com.android.externalstorage.documents/tree/612E-B7BF%3Aname/imagePFD.jpg 在线pfd = getContentResolver().openFileDescriptor(uri, "w");

这就是我调用此方法的方法, currentFolder 是我在第一个方法上使用intent和相同文件夹获得的文件夹。

saveImageWithParcelFileDescriptor(currentFolder, "imagePFD");

我该如何解决这个问题,哪种方法更可取?为什么?

1 个答案:

答案 0 :(得分:1)

  

如何检查文件夹是否存在

DocumentFileexists()方法。从理论上讲,pickedDir.exists()应该告诉你它是否存在。实际上,这取决于存储提供商。

  

我还想使用ParcelFileDescriptor用这种方法保存相同的图像

该代码有错误:

  • 您无法使用grantUriPermission()

  • 授予自己权限
  • 您无法通过连接发明任意Uri值,尤其是对于不属于您的提供商

  

如何解决此问题

删除它。

  

哪种方法更优选

第一个。

  

为什么?

第一个可行,也许是经过微调。第二个没有机会工作。