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

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)

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

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

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

我怎样才能解决这个问题?

Com*_*are 3

代码有效

不,不是的。

首先,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 来获取此网页内容的流一样,您也必须使用ContentResolveropenInputStream()来获取content: Uri值的内容。

我怎样才能解决这个问题?

任何一个:

  • 使用Uri as aUri、 with openInputStream()getType()和类似方法 onContentResolver

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