【问题标题】:Storage Access Framework, takePersistableUriPermission存储访问框架,takePersistableUriPermission
【发布时间】:2016-10-23 23:21:40
【问题描述】:

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

我已经弄清楚如何使用 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,我实际写入文件的地方:

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 之后写入它们而没有提示将来选择目录?

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

【问题讨论】:

    标签: android storage


    【解决方案1】:

    感谢@earthw0rmjim 的回答和谷歌搜索,我想出了一个完整的解决方案:

    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 的样子

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2021-10-14
      • 1970-01-01
      • 2015-06-28
      相关资源
      最近更新 更多