0

在我的应用程序中,图像文件列表在 recyclerview 中被夸大了。然后在应用程序编辑图像文件的元数据之后。

我编写元数据的代码:-

DocumentFile fos = DocumentFile.fromFile(new File(fileIn));

ByteSource bytsInputStream = new ByteSourceFile(new File(fileIn));
byte[] byteArrayInputStream = bytsInputStream.getAll();

try {
    ParcelFileDescriptor pfd = context.getContentResolver().
            openFileDescriptor(fos.getUri(), "w");
    FileOutputStream fileOutputStream =
            new FileOutputStream(pfd.getFileDescriptor());

    rewriter.updateExifMetadataLossy(byteArrayInputStream,fileOutputStream,outputSet);

    fileOutputStream.close();
    pfd.close();

}
catch (Exception e){e.printStackTrace();}

我可以更新存储在手机内存中的图像文件,但是对于 SD 卡图像,我得到错误 ---->

java.io.FileNotFoundException: Permission denied

我知道从 android 5 开始,我们需要使用 SAF 获得许可。我获得许可的代码:-

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
        Intent.FLAG_GRANT_READ_URI_PERMISSION
                | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);












@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_CODE_OPEN_DOCUMENT_TREE:
            if (resultCode == Activity.RESULT_OK) {
                Uri treeUri = data.getData();
                int takeFlags = data.getFlags();
                takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
                              Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                    this.getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
                }
           }
    }

现在我不知道如何处理这个 treeUri。我希望我只在初始启动时获得一次 SdCard 权限。

简单来说,我的问题与这个问题有关:-

这个链接

4

2 回答 2

1
DocumentFile documentFile = DocumentFile.fromTreeUri(this, treeUri);

这里 treeUri 是您从 SAF 许可中获得的。表示您在 OnActivityResult() 中获得的内容。

DocumentFile fos = DocumentFile.fromFile(new File(fileIn));

在此,fileIn 是您选择的文件。然后

String[] parts = (fileIn.getPath()).split("\\/");
for (int i = 3; i < parts.length; i++) {
if (documentFile != null) {
    documentFile = documentFile.findFile(parts[i]);
}  
}

以后要获取 byteArray,您需要使用此代码

try {
                        InputStream iStream = getContentResolver().openInputStream(documentFile.getUri());
                        byte[] byteArrayInputStream = getBytes(iStream);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

得到字节数组后,你想继续你的代码,我也在下面提到。

try {
                        ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(fos.getUri(), "w");
                        FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
                        rewriter.updateExifMetadataLossy(byteArrayInputStream,fileOutputStream,outputSet);
                        fileOutputStream.close();
                        pfd.close();
                    }catch (Exception e){
                        e.printStackTrace();
                    }

不:我认为这会对你有所帮助。如果您发现任何错误,请更正。谢谢

于 2017-03-23T09:53:10.253 回答
0

保存 Uri

takePersistableUriPermission()

获得访问权是绝对正确的。权限会一直保留到卸载或清除应用程序数据为止。下一步是保留 Uri 以供以后访问(即 SharedPreferences)。

将对您有所帮助。

于 2016-08-19T12:19:26.690 回答