我有这段代码:
npm -g
我想要做的是能够从手机中选择任何文件并发送。
代码有效,它会打开选择器并让我搜索任何文件。但是,我遇到了一些问题:
我该如何解决这个问题?
答案 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页面内容的流一样,因此您必须使用ContentResolver
和openInputStream()
来获取content:
Uri
的内容值。
我该如何解决这个问题?
或者:
在Uri
上使用Uri
作为openInputStream()
,getType()
,ContentResolver
和类似方法,或
请勿使用ACTION_GET_CONTENT
,而是构建自己的用户界面,以便浏览您的应用恰好能够覆盖的文件。这将是设备上所有文件的子集,因为并非所有文件都位于您的应用可访问的位置(例如,将丢失可移动媒体上的文件)。但是,它会将您的代码与您的心理模型同步(即,您想要文件,而不是内容)。