0

我从意图的结果数据中得到了 treeUri。我选择了 sdcard 的根路径。将 treeUri 转换为字符串类型的结果是content://com.android.externalstorage.documents/tree/C4FD-B5C6%3A.

问题 1。

这样的结果对吗?

问题2。

无论如何,我像这样创建了 Documentfile。

DocumentFile tree = DocumentFile.fromTreeUri(MusicServiceActivity.getAppContext(),Uri.parse(stringtreeUri));.

我打印了

tree.canWrite

使用 Log.e,但它总是返回 false。

我怎样才能使它返回真实?

添加

这是我的 onActivityResult ..

public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
    if (resultCode != RESULT_OK)
        return;
    else {
        Uri treeUri = resultData.getData();
        Log.e("treeuri",treeUri.toString());
        grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        if(Build.VERSION.SDK_INT >= 19)
            getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        String str = treeUri.toString();
        try{
            File dir = new File (Environment.getExternalStorageDirectory().getAbsolutePath());
            if(!dir.exists()){
                dir.mkdir();
            }
            FileOutputStream fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath()+"/treeuri.txt", true);
            BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fos));
            writer.write(str);
            writer.flush();
            writer.close();
            fos.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
4

1 回答 1

0

这样的结果对吗?

看起来很合理。

我怎样才能使它返回真实?

我将您的代码解释为:

  1. 你有一个有效的文档树Uri(例如,通过ACTION_OPEN_DOCUMENT_TREE
  2. 您将 转换Uri为字符串
  3. 您将字符串保存在某处(数据库SharedPreferences等)
  4. 稍后,您正在尝试您拥有的代码(将字符串转换回 a Uri,然后尝试使用它Uri

如果是这样,那么在第 1 步之后,您需要调用takePersistableUriPermission(). ContentResolver否则,只有Uri最初获得 的 Activity 才拥有该 标识的内容的权利Uri

于 2019-01-29T13:43:59.180 回答