当前位置: 首页 > 知识库问答 >
问题:

使用存储访问框架(SAF)选择或创建外部文件

柯景龙
2023-03-14

我正在尝试打开一个现有文件,或者在外部使用SAF创建一个新文件,而用户不需要安装除我的apk之外的任何其他文件。

在我的Android10像素3上,ACTION_OPEN_DOCUMENT_TREE抛出一个异常,指示没有活动来处理这个(我想知道为什么会这样?)。android.content.ActivityNotFoundException:没有找到处理Intent{act=android.intent.action.OPEN_DOCUMENT_TREEcat=[android.intent.category.OPENABLE]typ=vnd.android.document/directory(有额外功能)}

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder");
    intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);

    activity.startActivityForResult(intent, READ_DIRECTORY_CODE);

ACTION_OPEN_DOCUMENT和ACTION_CREATE_DOCUMENT似乎很合适。

但是,如果我:

>

  • 使用ACTION_OPEN_DOCUMENT启动意图,并且文件不存在,用户无法选择任何内容或创建新文件。

    final Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder/myfile.json");
    intent.putExtra(Intent.EXTRA_TITLE, "myfile.json");
    intent.setType("application/json");
    
    activity.startActivityForResult(intent, READ_DIRECTORY_CODE);
    

    用ACTION_CREATE_DOCUMENT启动intent,并且文件确实存在,用户只能选择创建一个新文件来覆盖旧文件。

    Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); //Opens the create file UI
    intent.addCategory(Intent.CATEGORY_OPENABLE);
    intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, "content://com.android.externalstorage.documents/document/primary:.myfolder");
    intent.putExtra(Intent.EXTRA_TITLE, "myfile.json");
    intent.setType("application/json");
    
    activity.startActivityForResult(intent, READ_DIRECTORY_CODE);
    

    如果我能在开始意图之前知道文件夹和文件的存在,我会有一些有用的东西。我似乎无法使用 DocumentFile.fromTreeUri(activity, uri) 注意,我从 open 命令中获取了 URI,当时文件确实存在。即。“content://com.android.externalstorage.documents/document/primary:.myfolder”当我尝试时,我只得到无效的URI异常。

        try {
            Uri folderUri = Uri.parse("content://com.android.externalstorage.documents/document/primary:.myfolder");
            exists = DocumentFile.fromTreeUri(activity, folderUri).exists();  //This line throws the URI exception
        } catch (Exception e) {
            Logger.d(TAG, e.getMessage());
        }
    

    关于这些障碍的任何想法?

  • 共有1个答案

    充培
    2023-03-14

    以下@blackapps评论给了我对ACTION_OPEN_DOCUMENT_TREE部分问题的答案。

    由于语句 intent.setType(DocumentsContract.Document.MIME_TYPE_DIR;),您会收到此异常。删除它。此外,CATEGORY_OPENABLE在那里也没有用。

     类似资料:
    • (编辑)由@blackapps回答:将“w”改为“wt”。而且奏效了! //-----------------------------------// 我已经尝试使用直接路径,它工作正确。我认为原因是它创建了一个新的文件来替换原来的文件。然而,我只是不想使用直接路径。 我已经尝试了PrintWriter清除内容,但它也需要直接路径创建文件,然后放入PrintWriter。 我已经尝试过使用Outp

    • 我是Android上存储访问框架的新手。 谢谢

    • 我有一个Xperia Neo V没有任何内部存储--只有一个SD卡作为外部存储,而Galaxy S3有内部和外部存储。 使用此函数时只能访问内部存储(S3)上的文件,但Xperia Neo V没有问题。 如何访问内部和外部存储上的文件?

    • @override protected void onActivityResult(int requestCode,int resultCode,@nullable Intent data){super.onActivityResult(requestCode,resultCode,data);if(requestCode==REQUEST_CODE_STORAGE_ACCESS){ }} 我可以

    • 我在一个应用程序上工作,我想访问“/存储/仿真/0/Android/媒体/com.whatsapp/WhatsApp/Media/.Statuses”来为我的应用程序获取状态文件夹中的数据。

    • 我试图找到所有的mp3文件在存储,但我的应用程序崩溃,我使用logcat看看为什么和问题的权限访问外部存储,但我已经把权限在清单,我不知道为什么不断崩溃。第一个错误: 03-06 14:55:24.553:E/dex2OAT(2796):创建oat文件失败:/data/dalvik-cache/x86/data@app@felipe.cursoandroid.com.musicbox-2@spli