如何使用intent.createChooser android获取任何类型的文件

时间:2015-11-06 20:46:34

标签: android filechooser

我有这段代码:

npm -g

我想要做的是能够从手机中选择任何文件并发送。

代码有效,它会打开选​​择器并让我搜索任何文件。但是,我遇到了一些问题:

  • 当我尝试通过“内部存储”选项进行访问时,我无法选择任何项目。他们都是残疾人。我修复了安装文件管理器的问题,它允许我选择我想要的文件,但也许有一个快速修复。
  • 当我选择文件并运行Uri.getPath()时,有时路径是有效的,其他的,并且通常当我选择一些图像文件时,我得到的路径有一个错误。不是实际的。 我在网上看到了一些修复,但它们都是为了从galery中选择图像,我想要一般的。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

代码有效

不,它没有。

首先,file/*不是有效的MIME类型,甚至不是通配符MIME类型。 There is no MIME type that begins with file/。如果您想要任何MIME类型,请尝试*/*

其次,ACTION_GET_CONTENT不允许用户选择任何文件"。它允许用户从设备上的任何应用程序中选择一条内容,该应用程序实现了ACTION_GET_CONTENT活动,该活动选择兑换您的MIME类型。该活动返回的是指向内容Uri。这不必是本地文件,更不用说您可以直接访问文件系统。

  

当我选择文件并运行Uri.getPath()时,有时路径有效

不,路径始终有效(至少有一段时间)。它不是你想象的那样。 A Uri is not a file

例如,您可能正在Web浏览器中查看此Web页面。如果您查看该Web浏览器的地址栏,您将看到以下URL:

https://stackoverflow.com/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android

根据您的想法,这是指位于/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android的硬盘上的文件。

事实并非如此。 URL的一部分表示路径相关的位置;在这种情况下,它指的是Web服务器。

Uri是一回事。特别是,如果Uri的方案不是file:,则Uri只是一个地址,不一定映射到您可以直接获得的任何地址。正如Web浏览器开发人员使用HTTP来获取此Web页面内容的流一样,因此您必须使用ContentResolveropenInputStream()来获取content: Uri的内容值。

  

我该如何解决这个问题?

或者:

  • Uri上使用Uri 作为openInputStream() getType()ContentResolver和类似方法,或

  • 请勿使用ACTION_GET_CONTENT,而是构建自己的用户界面,以便浏览您的应用恰好能够覆盖的文件。这将是设备上所有文件的子集,因为并非所有文件都位于您的应用可访问的位置(例如,将丢失可移动媒体上的文件)。但是,它会将您的代码与您的心理模型同步(即,您想要文件,而不是内容)。