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

Android 11(R)文件路径访问

朱明知
2023-03-14

从Android11开始,拥有READ_EXTERNAL_STORAGE权限的应用程序可以使用直接文件路径和本地库读取设备的媒体文件。这个新功能允许您的应用程序更顺利地与第三方媒体库一起工作。

问题是我无法从mediastore获得文件路径,那么我们应该如何读取无法访问/检索的文件路径呢?我不知道有没有办法从mediastore获取文件路径?

此外,文件说:

    null
    null

但是我不需要所有的文件访问权限,我只希望用户从mediastore中选择一个视频,并将文件路径传递给ffmpeg(它需要文件路径)。我知道我不能再使用_data列来检索文件路径。

请注意:

  • 我知道从mediastore返回的URI不指向文件。
  • 我知道我可以将文件复制到我的应用程序目录,并将其传递到FFMPEG,但在Android R之前我可以这样做。
  • 我无法将FileDescriptor传递给FFMPEG,也无法使用/proc/self/fd/(从SD卡中选择文件时,我获得/proc/7828/fd/70:权限被拒绝),请查看此问题。

共有1个答案

杜弘光
2023-03-14

在对issuetracker提出一个问题后,我得出了以下结论:

>

  • 在Android R上,删除了Android Q中添加的文件限制。这样我们就可以再次访问文件对象。
  • 如果您的目标是Android10>,并且希望访问/使用文件路径,则必须在清单中添加/保留以下内容:

    android:requestLegacyExternalStorage="true"
    

    这是为了确保文件路径在Android10(Q)上正常工作。在Android R上,这个属性将被忽略。

    ContentValues valuesvideos;
    valuesvideos = new ContentValues();
    valuesvideos.put(MediaStore.Video.Media.RELATIVE_PATH, "Movies/" + "YourFolder");
    valuesvideos.put(MediaStore.Video.Media.TITLE, "SomeName");
    valuesvideos.put(MediaStore.Video.Media.DISPLAY_NAME, "SomeName");
    valuesvideos.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
    valuesvideos.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis() / 1000);
    valuesvideos.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
    valuesvideos.put(MediaStore.Video.Media.IS_PENDING, 1);
    ContentResolver resolver = getContentResolver();
    Uri collection = MediaStore.Video.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
    Uri uriSavedVideo = resolver.insert(collection, valuesvideos);
    

  •  类似资料:
    • 问题内容: 这似乎是一个直接的问题。但我无法破解。在helper1.js中,我想访问foobar.json(来自) 我无法使它正常工作fs:如何找到父文件夹? 这里的任何帮助将是巨大的。 问题答案: 您可以使用该模块将所在目录的路径连接到的相对路径。这将为您提供前往的绝对路径。 假设采用UTF8编码,则此方法应可在Linux,OSX和Windows上使用。

    • 谢谢大家 我的代码:

    • 问题内容: 我正在使用python进行文件操作。 我有一个文件路径为: 当我使用python打开文件时,它说: 但是,该文件存在于驱动器上。 可能是因为窗口包含空格,所以无法正确获取“ SEM 2”。 如何在窗口路径的路径中处理此类空格? 问题答案: 路径中的空格没有问题,因为您没有使用“外壳”来打开文件。这是Windows控制台上的一个会话来证明这一点。你做错了什么

    • 1)android TargetSDKVersion30 requestLegacyExternalStorage=false。 在基于cordova的android应用程序中,从javascript级别完成XMLHttpRequest请求。 3)XMLHttpRequest引发错误 5)android targetSdkVersion 29 requestLegacyExternalStorag

    • 我正在尝试创建许多文件,作为用户的一个功能。例如,我可能会编写一个应用程序,为他们过去几周听的每首歌创建一个文件(例如,一个带有歌词的文本文件)。我不能让用户为我生成的每个文件选择目录和文件名,这将花费他们数小时的时间。用户应该可以从其他应用程序访问这些文档。 在Android11中,存储访问框架似乎没有什么用处。我注意到最初有两个有趣的选项: 创建一个新文件(该文件创建启动用户与之交互的活动,以

    • 我想访问项目“\src\main\resources”的资源形式,但由于任何原因,我只能访问目标类。这是我的代码: 这里是我的Project Dir: 问题是,即使我删除了目标/类中的所有文件并运行代码,编译器也会将文件从“src/main/ressource”复制到“目标/类”中并从那里读取它们。