我有这个代码:
protected void pickFile(View view){
///Codigo que abre la galeria de imagenes y carga la imagen en displayedImage
Intent intent = new Intent();
intent.setType("file/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Choose File to Upload"), 1);
}
//It's executed when leaving file system
@Override
protected void onActivityResult(int reqCode, int resCode, Intent data){
super.onActivityResult(reqCode, resCode, data);
if (reqCode == 1 && resCode == RESULT_OK && data != null) {
Uri selectedFile = data.getData();
RequestMaker.uploadFile(this, selectedFile, "this is a file");
}
}
我想要做的是能够从我的手机中选择任何文件并发送它。
该代码有效,它打开选择器并让我搜索任何文件。但是,我遇到了一些问题:
我在网上看到了一些修复,但它们都是用于从图库中选择图像,我想要通用的。
我怎样才能解决这个问题?
最佳答案
The code works
不,不是的。
一、
file/*
不是有效的 MIME 类型,甚至不是通配符 MIME 类型。 There is no MIME type that begins with file/
.如果您想要任何 MIME 类型,请尝试 */*
.二、
ACTION_GET_CONTENT
不允许用户“选择任何文件”。它允许用户从设备上实现 ACTION_GET_CONTENT
的任何应用程序中选择一段内容。选择尊重您的 MIME 类型的 Activity 。该 Activity 返回的是 Uri
指向内容。这不一定是本地文件,更不用说您可以直接访问文件系统的文件了。When i select the file and run Uri.getPath(), sometimes the path is valid
不,路径始终有效(至少在一段时间内)。它只是不是你想的那样。 A
Uri
is not a file .例如,假设您正在 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 获取此网页内容的流一样,您必须使用 ContentResolver
和 openInputStream()
获取 content:
的内容Uri
值(value)观。How can i fix this?
任何一个:
Uri
作为 Uri
, 与 openInputStream()
, getType()
,以及 ContentResolver
上的类似方法, 或 ACTION_GET_CONTENT
,而是构建您自己的 UI 来浏览您的应用碰巧能够访问的文件。这将是设备上所有文件的子集,因为并非所有内容都位于您的应用可以访问的位置(例如,可移动媒体上的文件将丢失)。但是,它将您的代码与您的心智模型同步(即,您想要文件,而不是内容)。 关于android - 如何使用intent.createChooser android获取任何类型的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33575449/