android - 如何从文件管理器获取打开的应用程序并获取该文件的路径?
问题描述
我想通过单击文件(几乎完成)从文件管理器打开我的应用程序并播放该文件。但是我怎样才能得到那个特定视频文件的路径以便我可以打开它呢?
在清单内的活动中使用以下代码(显示红色错误但工作)后,我的应用程序显示为打开该文件的选项:
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="video/*"/>
</intent-filter>
在显示上图之前,如何获取我在文件管理器中单击的文件的路径?
解决方案
但是我怎样才能得到那个特定视频文件的路径以便我可以打开它呢?
很多时候,你不知道。
你调用getIntent()
那个Activity
有那个的<intent-filter>
,然后你调用那个getData()
来获取Uri
用户希望查看的内容。
有时,鉴于<intent-filter>
,你会得到一个Uri
谁的方案是file
。在这种情况下,调用getPath()
将Uri
返回一个文件系统路径。您不太可能使用该路径,尤其是在 Android 10 及更高版本上,因为无论启动您的应用程序都有错误 -file
Uri
自 Android 7.0 以来,这些值通常已被禁止。
更多时候,你会得到Uri
另一个方案。在这些情况下,Uri
不一定代表文件系统上您可以访问的文件。相反,您可以根据方案做一些事情来访问内容:
- 对于
content
orandroid.resource
(orfile
) 的方案,使用ContentResolver
andopenInputStream()
来获取InputStream
内容 - 对于
http
or的方案https
,使用您最喜欢的 HTTP 客户端 API(例如 OkHttp)下载内容 - 依此类推,对于您希望支持的任何计划
如果您想将活动限制为仅支持方案的子集,请使用<data>
中的元素<intent-filter>
列出您支持的方案。
在您的情况下,如果您要播放视频,您可以将 传递Uri
给您用于视频播放的任何内容(例如,ExoPlayer),并让它处理实际加载内容的所有麻烦。
推荐阅读
- ios - 选择 DatePicker 后更新单元格中的日期(时间)
- java - 片段中的回收站视图为空
- c++ - 为什么 const char* const & = "hello" 可以编译?
- c# - 在c#中返回元组字典作为函数的返回类型
- angular - 如何正确实施“photo.service”?
- javascript - 锚标签-在 iphone7/6s plus 中没有在 mousedown 上获取日志
- cordova - 如何在ionic 2中使用couchbase-lite cordova插件实现同步功能?
- python - 防止 requests-mock 降低我的帖子数据的大小写
- javascript - 使用 websocket 时消息被延迟
- node.js - 如何使用正文有效负载发出 HTTP/2 请求?