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

从Android内容URI获取FileInputStream(或如何在InputStream上查找)

钱德元
2023-03-14

我有一个视频播放器应用程序,可以播放自定义h264传输流。我的任务是通过用户打开“gallery”,选择“movies”,然后在选择一部电影后选择要启动的应用程序等方法来启动我们的播放器。。。这一切都很完美。我的问题是如何使用ContentResolver在InputStream上来回搜索。

我在这里也读了很多帖子,比如Android:从内容URI获取文件URI?除了咆哮http://commonsware.com/blog/2013/08/07/for-android-apis-think-streams-not-files.html使用输入流而不是其他方法,但是对于大型视频文件,跳过和标记/重置在我们的播放器中找不到,所以一个普通的输入流是无用的...一个文件输入流工作得很好,作为一个我投resolver.getInputStream到FileInputStream和它玩球,但这是一个黑客......我如何从内容uri得到一个文件对象或FileInputStream?或者我如何有效地寻找输入流?

共有2个答案

孙胜泫
2023-03-14

我的问题是如何使用ContentResolver在InputStream上来回搜索

这并不总是可能的。这取决于ContentProvider如何提供InputStream内容。如果它使用由文件支持的ParcelFileDescriptor,则流将是可查找的。如果它使用由createPipe()创建的管道支持的ParcelFileDescriptor,则流将不可查找。我还没有在ParcelFileDescriptor上测试一些较新的管道选项,但我希望它们也是不可查找的。

但是对于大型视频文件,跳过和标记/重置将不适用于在我们的播放器中查找

我希望这些方法对一些(但不是全部)content://Uri值有效。如果您说您需要的不是skip()mark()、和reset(),那么我不太清楚您的意思。

FileInputStream工作得很好,作为一个黑客,我使用了解析器。getInputStream到一个FileInputStream,它玩球

它肯定不会可靠地“打球”。此外,这似乎是无用的,因为我没有看到与您的场景相关的FileInputStream上没有继承自InputStream的任何方法。值得注意的是,mark()reset()skip()InputStream上。

我如何得到一个文件对象或FileInputStream从内容uri?

您没有。例如,视频文件可能位于可移动存储上,而在Android 4.4上,您无法直接访问可移动存储上的文件。

如何有效地搜索输入流?

如果markSupported()返回true,请使用mark()reset()。如果没有,请告诉用户您无法播放该流,或禁用需要查找的选项,或对从该流读取的数据进行自己的缓存(例如,用于回放操作)。

郭凯
2023-03-14

因此,虽然内容URI可能不受文件支持,但可以确定它是否。。。您可以从ParcelFileDescriptor使用getStatSize,如果备份资产是文件,它将返回一个值,如果不是,则返回-1。如果它是一个文件,那么显然您可以得到一个FileInputStream和底层通道

 类似资料:
  • 问题内容: 如何从BufferedImage对象获取InputStream?我尝试了这个,但是ImageIO.createImageInputStream()总是返回NULL 图片缩略图已正确生成,因为我可以成功将 bigImage绘制 到 JPanel 。 谢谢。 问题答案: 如果您尝试将图像保存到文件,请尝试: 如果您只想读取字节,请尝试执行写调用,但将其传递给ByteArrayOutputS

  • 问题内容: 我想从java.io.InputStream读取超时。显然,执行此操作的正确方法是使用java.nio.channels.SelectableChannel和java.nio.channels.Selector。不幸的是,目前尚不清楚如何从InputStream转到SelectableChannel。 InputStream来自非常规来源-http://java.sun.com/pro

  • 我正在尝试获取内容URI的文件路径。URL如下所示:content://com.android.providers.downloads.documents/document/31 游标对象不是null,但cursor.getString(column_index)返回null。 列索引始终为0。 编辑:内容URI是从文件管理器返回的,因此它应该表示实际的文件。

  • 我使用以下代码存储pdf文件: 之后在onActivityResultIm使用OutputStream保存数据。Uri到文件可以看起来像: 但当我试图以此目的启动活动时,pdf viewer应用程序显示错误: 是否可以从内容Uri打开pdf查看器活动?

  • 问题内容: 我正在尝试从文件夹中包含在项目中的原始文件获取。但是无论如何,我都会得到一个。 该文件是一个文件,也尝试过使用,也不起作用。使用DOES 播放两个文件都可以。 的回报: 我的代码: 错误: 问题答案: 尝试这种方法,用作您的inputStream。沿着这个地方: 返回一个InputStream 编辑:如果您使用上述方法,请删除这些代码 希望这有帮助,祝你好运!^^

  • 问题内容: 我在WAR中打包了一组图像,并在using中对其进行了描述。图像位于文件夹中。我希望能够选择一个图像,并在提交时将该图像的副本保存到磁盘上。 如何才能做到这一点?如何获得对此图像的参考(或其他参考)? 问题答案: 鉴于此文件夹结构, 您可以通过采用相对于webcontent的路径之一来获取它: 或通过其中获得- 的相对路径: 关于选择图像并传递其路径,只需执行以下操作: