当我启动意图ACTION_OPEN_DOCUMENT_TREE时,它会自动打开一个空的最近文件夹吗?

时间:2019-02-19 12:30:50

标签: java android storage-access-framework

我要实现的目的是删除SD卡上的文件,我尝试了file.delete方法,该方法不起作用,因为SD卡现在只能读取。

因此,我读了一篇有关SAF(存储访问框架)的文章,通过存储我们在onActivityResult中获得的treeUri来获得sd卡的写访问权限。

文件删除现在可以正常工作,但是当我启动意图 Intent.ACTION_OPEN_DOCUMENT_TREE 时,有时它会返回最近的文件夹,该文件夹为空,并且在sdcard上显示文件的方法是单击溢出图标,然后选择显示SDCARD或内部存储,这可能会使某些人在运行我的应用程序时感到困惑。

我尝试将这些添加到我的意图中: intent.putExtra(“ android.content.extra.SHOW_ADVANCED”,true);          intent.putExtra(“ android.content.extra.FANCY”,true);          intent.putExtra(“ android.content.extra.SHOW_FILESIZE”,true);

可以在某些设备上使用,但它是专用API,在某些设备上则无法使用。

有没有办法自动打开特定目录或显示提示对话框,其中包含说明应选择哪个目录的步骤?

private void getSDCardAccess(){
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath());
    startActivityForResult(intent, REQUEST_EXTERNAL_ACCESS);
} 


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_EXTERNAL_ACCESS && resultCode == RESULT_OK) {
        Uri treeUri = null;

        if (data != null){
            treeUri = data.getData();
        }

        if (treeUri != null && getActivity() != null) {
            getActivity().getContentResolver().takePersistableUriPermission(treeUri,
                    Intent.FLAG_GRANT_READ_URI_PERMISSION |
                            Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            StorageUtil storageUtil = new StorageUtil(getActivity());
            //Takes the access so that we can use it again after the app reopens
            storageUtil.storeTreeUri(treeUri.toString());
            Log.d(TAG, "treeUri: " + treeUri.toString());
        }else{
            Log.d(TAG,"uri is empty!");
        }
    }
} 

1 个答案:

答案 0 :(得分:0)

  

有没有一种方法可以自动打开特定目录

如果您以前有一个Uri的{​​{1}},则应该可以通过ACTION_OPEN_DOCUMENT_TREE提供。根据{{​​3}}:

  

呼叫者可以通过DocumentsContract.EXTRA_INITIAL_URI设置文档URI,以指示文档导航器的初始位置。如果是文件夹,则系统将尽最大努力在指定文档中启动导航器;如果不是,则系统将启动包含指定文档的文件夹。


  

还是显示提示对话框,其中包含解释应选择哪个目录的步骤?

在调用DocumentsContract.EXTRA_INITIAL_URI请求startActivityForResult()之前,您需要自己做。