存储访问框架,takePersistableUriPermission [英] Storage Access Framework, takePersistableUriPermission

查看:343
本文介绍了存储访问框架,takePersistableUriPermission的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,用户可以选择下载目录.如果他选择了外部可移动 SD卡(不是模拟的SD卡!而是内存,例如真正的Physcel MicroSD卡),那么从Android 4.4开始,我只能使用 SAF (存储访问框架).

In my application user is able to select the downloads directory. If he selects external removable SD card (not an emulated sd card!, but a memory, which is a real physicel microSD card for example), starting from Android 4.4 I am only able to write to it using SAF (Storage Access Framework).

我已经弄清楚了如何使用SAF创建和写入单个文件:

I've figured out how to create and write a single file using SAF:

public void newFile() {
    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);

    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TITLE, "newfile.txt");

    startActivityForResult(intent, CREATE_REQUEST_CODE);
}

public void saveFile() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.setType("text/plain");

    startActivityForResult(intent, SAVE_REQUEST_CODE);
}

这是我的onActivityResult,我实际上在其中写入文件:

And here is my onActivityResult, where I actually write to file:

public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {
    Uri currentUri = null;

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == CREATE_REQUEST_CODE) {
            if (resultData != null) {
                Log.d(TAG, "CREATE_REQUEST_CODE resultData = " + resultData);
            }
        } else if (requestCode == SAVE_REQUEST_CODE) {

            if (resultData != null) {
                currentUri = resultData.getData();
                getContentResolver().takePersistableUriPermission(currentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                writeFileContent(currentUri);
                Log.d(TAG, "SAVE_REQUEST_CODE currentUri = " + currentUri);
            }
        }
    }
}

还有 writeFileContent :

private void writeFileContent(Uri uri) {
    try {
        ParcelFileDescriptor pfd =
                this.getContentResolver().
                        openFileDescriptor(uri, "w");

        FileOutputStream fileOutputStream =
                new FileOutputStream(pfd.getFileDescriptor());

        String textContent = "some text";

        fileOutputStream.write(textContent.getBytes());

        fileOutputStream.close();
        pfd.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

最后是我的问题:

如何创建其他文件,并在调用 getContentResolver().takePersistableUriPermission 后写出它们,而又不提示将来选择目录?

How do I create other files, and write them after I called getContentResolver().takePersistableUriPermission without a prompt to select a directory in future?

如果我是对的,那么 getContentResolver().takePersistableUriPermission 应该允许我做

If I'm right, then getContentResolver().takePersistableUriPermission shoudl allow me to do tha

推荐答案

感谢@ earthw0rmjim的答案,然后使用Google谷歌搜索,我想出了一个完整的解决方案:

Thanks to @earthw0rmjim answer, and googling, I figgured out a complete solution:

public void saveFile() {
    List<UriPermission> permissions = getContentResolver().getPersistedUriPermissions();
    if (permissions != null && permissions.size() > 0) {
        DocumentFile pickedDir = DocumentFile.fromTreeUri(this, permissions.get(0).getUri());
        DocumentFile file = pickedDir.createFile("text/plain", "try2.txt");
        writeFileContent(file.getUri());
    } else {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("text/plain");

        startActivityForResult(intent, SAVE_REQUEST_CODE);
    }
}

因此,首先,如果我们没有 PersistedUriPermissions ,它将请求此类权限.这样的方式就是 onActivityResult 的样子

So firstly, if we don't have PersistedUriPermissions, it will request such permissions. This way here is how onActivityResult looks like

public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {
    Uri currentUri = null;

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_DIR_REQUEST_CODE) {
            if (resultData != null) {
                Uri treeUri=resultData.getData();
                Log.d(TAG, "SELECT_DIR_REQUEST_CODE resultData = " + resultData);
                getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
                DocumentFile file = pickedDir.createFile("text/plain", "try2.txt");
                writeFileContent(file.getUri());
            }
        }
    }
}

writeFileContent 与问题中的内容相同

private void writeFileContent(Uri uri) {
    try {
        ParcelFileDescriptor pfd =
                this.getContentResolver().
                        openFileDescriptor(uri, "w");

        FileOutputStream fileOutputStream =
                new FileOutputStream(pfd.getFileDescriptor());

        String textContent = "some text";

        fileOutputStream.write(textContent.getBytes());

        fileOutputStream.close();
        pfd.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这篇关于存储访问框架,takePersistableUriPermission的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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