我希望用户 Select 一个文件.我是这样做的:

        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
        intent.setType("*/*");
        startActivityForResult(intent, Aux.ACTIVITY_REQUEST_CODE_SELECT_CCRYPT_ONLY);

然后,我对活动结果执行此操作.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode,resultCode,data);

    if (resultCode == RESULT_OK){
        if (requestCode == Aux.ACTIVITY_REQUEST_CODE_SELECT_CCRYPT_ONLY){

            Uri dataFileUri = data.getData();

            Aux.DbugCcrypt("Storing the URI of the Work Directory In Shared Preferences: " + dataFileUri.toString());
            Aux.storeStringInSharedPreferences(this,Aux.SHARED_PREF_STRING_KEY,dataFileUri.toString());

            // And now we take persistent permission.
            ContentResolver cr = this.getContentResolver();
            cr.takePersistableUriPermission(dataFileUri, (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION));

        }
    }
    else {
        // TODO Handle.
        Aux.DbugCcrypt("On Activity Result was not OK.");
    }
}

因此,基本上我将URI字符串存储在共享首选项中,并请求对该文件的持久权限.

然后我关闭应用程序.然后再把它打开.

我这样做:

    DbugCcrypt("Getting the Shared Preference URI");
    String dataAuxUriString = getStringInSharedPreferences(context,SHARED_PREF_STRING_KEY);
    if (!dataAuxUriString.isEmpty()){
        DbugCcrypt("Got the URI File. Testing Read/Write" );
        Uri dataAuxUri= Uri.parse(dataAuxUriString);
        File testFile = new File(dataAuxUri.getPath());
        if (testFile.isDirectory()){
            DbugCcrypt("Is a directory");
        }
        else {
            DbugCcrypt("Data Aux File URI. Can Read: " + testFile.canRead());
            DbugCcrypt("Data Aux File URI. Can Write: " + testFile.canWrite());
        }
    }
    else {
        DbugCcrypt("Data Aux URI String is empty");
    }

返回此打印输出(DBugCCcrypt只是调用System.err.println("[Stuf]"+Message))

[CCRYPT_DBUG] Getting the Shared Preference URI
[CCRYPT_DBUG] Got the URI File. Testing Read/Write
[CCRYPT_DBUG] Data Aux File URI. Can Read: false
[CCRYPT_DBUG] Data Aux File URI. Can Write: false

所以我的问题是,为什么我不能在应用程序执行之间获得对文件的读/写权限?

推荐答案

        File testFile = new File(dataAuxUri.getPath());

用户不需要 Select 本地文件系统上的文件,更不用说可以使用文件系统API读取和写入的文件了.

        if (testFile.isDirectory()){

ACTION_OPEN_DOCUMENT打开一个文档.它永远不会打开文档树(例如,本地文件系统上的目录).对于这一点,您将使用ACTION_OPEN_DOCUMENT_TREE.

要处理从ACTION_OPEN_DOCUMENT请求中返回的Uri,您可以使用:

  • ContentResolver,例如openInputStream()openOutputStream();以及
  • DocumentFile,Via DocumentFile.fromSingleUri()(或ACTION_OPEN_DOCUMENT_TREEDocumentFile.fromTreeUri()),它提供了一个类似于File的子集的API

存储访问框架的使用在许多地方都有介绍,例如我的以下内容:

还有无数的帖子、书籍、课程等等.

Android相关问答推荐

为什么R8不混淆某些类?

AdMob:MobileAds. initialize()—java. lang. xml对于某些设备不能强制转换为java. lang. String""

Android:MethodHandle. invoke和MethodHandle. invokeExact仅从Android O( - min—api 26)开始支持

如何将结果从viewModelScope传递到活动

有没有办法知道每台安卓设备上的通知限制?

Android意图过滤器不限制应用程序仅处理YouTube链接

找不到类MultipartBody;的序列化程序

警告:应用必须面向 Android 13(API 级别 33)或更高版本.确实如此

了解 CoroutineScope(Job() + Dispatchers.Main) 语法

如何在C++中使用JNI_GetCreatedJavaVMs调用Java代码

通过 setIntentScanningStrategyEnabled(true) 未检测到信标的 Android Beacon 库后台扫描

如何仅使用您的 Android 应用程序定位平板电脑?

Compose 状态不是 recomposing

任务 ':app:checkReleaseDuplicateClasses' 执行失败

我该怎么做文本计时器

在 Jetpack Compose 中更改列中子项的对齐方式

如何从日期 Select 器计算年龄?

0dp 大小的可组合文件是否可以组合?

不能在kotlin的lazycolumn中使用列表

使用 Android 字符串数组在 Room 中迁移