use*_*172 5 android filechooser
我有这个代码:
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");
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是能够从手机中选择任何文件并将其发送。
该代码有效,它打开选择器并让我搜索任何文件。但是,我遇到了一些问题:
我怎样才能解决这个问题?
代码有效
不,不是的。
首先,file/*不是有效的 MIME 类型,甚至不是通配符 MIME 类型。没有以 开头的 MIME 类型file/。如果您想要任何 MIME 类型,请尝试*/*.
其次,ACTION_GET_CONTENT不允许用户“选择任何文件”。它允许用户从设备上实现选择遵循您的 MIME 类型的活动的任何应用程序中选择一段内容ACTION_GET_CONTENT。该活动返回的是Uri对内容的指向。这不一定是本地文件,更不用说您可以直接访问文件系统了。
当我选择文件并运行 Uri.getPath() 时,有时路径是有效的
不,该路径始终有效(至少在一段时间内)。它只是不是你想的那样。AUri不是文件。
例如,假设您正在 Web 浏览器中查看此网页。如果您查看该 Web 浏览器的地址栏,您将看到以下 URL:
/sf/ask/2350281461/
Run Code Online (Sandbox Code Playgroud)
按照您的想法,这是指硬盘驱动器上位于 的文件/questions/33575449/how-to-get-any-type-of-file-with-intent-createchooser-android。
事实并非如此。URL的一部分表示路径相关的位置;在本例中,它指的是 Web 服务器。
AUri是同一个东西。特别是,如果Uri具有除 之外的方案file:,则Uri仅仅是一个地址,不一定映射到您可以直接访问的任何内容。正如 Web 浏览器开发人员使用 HTTP 来获取此网页内容的流一样,您也必须使用ContentResolver和openInputStream()来获取content: Uri值的内容。
我怎样才能解决这个问题?
任何一个:
使用Uri as aUri、 with openInputStream()、getType()和类似方法 onContentResolver或
不要使用ACTION_GET_CONTENT,而是构建您自己的 UI 来浏览您的应用程序恰好能够访问的文件。这将是设备上所有文件的子集,因为并非所有内容都位于您的应用程序可以访问的位置(例如,可移动媒体上的文件将被丢失)。但是,它将您的代码与您的心理模型同步(即您需要文件,而不是内容)。
| 归档时间: |
|
| 查看次数: |
3605 次 |
| 最近记录: |