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

标签 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");
    }
}

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

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

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

    最佳答案

    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 获取此网页内容的流一样,您必须使用 ContentResolveropenInputStream()获取 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/

    相关文章:

    android - adb命令设置语音助手

    android - 未知的命令行选项 '-skip'

    c - gtk_file_chooser_get_filename,结果未释放,内存泄漏?

    安卓文件选择器

    events - JavaFX - 为什么我的 FileChooser 允许我访问原始舞台?

    android - 关于android Drawable getBounds return Rect(0, 0 - 0, 0)

    android - 如何在 Android 上创建数字时钟?

    java - 忽略textspeech中的某些单词(http地址)

    javascript - 如何禁用提交按钮,直到所有文本字段都已满并选择了文件

    image - 使用 FileChooser 保存可写图像图像