在Android中通过Intent选择任何类型的文件

在Android中通过Intent选择任何类型的文件,android,file,android-intent,intentfilter,Android,File,Android Intent,Intentfilter,我想为可以返回任何类型文件的应用启动一个intentchooser 目前我使用的(我从Android电子邮件源代码中复制,用于文件附件) 但它只在我的Galaxy S2上显示“Gallery”和“Music player”。此设备上有一个文件资源管理器,我希望它显示在列表中。我还希望摄像头应用程序显示在列表中,以便用户可以拍摄照片并通过我的应用程序发送。 如果我安装Astro文件管理器,它也会响应这个意图。我的客户只是Galaxy SII的所有者,我不想强迫他们安装Astro file mana

我想为可以返回任何类型文件的应用启动一个intentchooser

目前我使用的(我从Android电子邮件源代码中复制,用于文件附件)

但它只在我的Galaxy S2上显示“Gallery”和“Music player”。此设备上有一个文件资源管理器,我希望它显示在列表中。我还希望摄像头应用程序显示在列表中,以便用户可以拍摄照片并通过我的应用程序发送。 如果我安装Astro文件管理器,它也会响应这个意图。我的客户只是Galaxy SII的所有者,我不想强迫他们安装Astro file manager,因为他们已经有了一个基本但足够的文件管理器


你知道我怎样才能做到这一点吗?我很确定,我已经看到默认的文件管理器出现在这样的菜单中,用于选择文件,但我不记得在哪个应用程序中。

不是针对相机,而是针对其他文件

在我的设备中,我安装了
ES文件浏览器
,这在我的情况下很简单

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("file/*");
startActivityForResult(intent, PICKFILE_REQUEST_CODE);

三星文件浏览器使用了自定义操作。这就是为什么在从三星应用程序中查找文件时,我可以看到三星文件浏览器,而不是我的

操作是“com.sec.android.app.myfiles.PICK_DATA”


我创建了一个自定义活动选择器,它显示过滤两个意图的活动

这是我在galaxy note上的作品 它的表演 联络, 设备上安装的文件管理器, 画廊, 音乐播放器

private void openFile(Int  CODE) {
    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
    i.setType("*/*");
    startActivityForResult(intent, CODE);
}
这里获取活动的
onActivityResult
中的路径

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     String Fpath = data.getDataString();
    // do somthing...
    super.onActivityResult(requestCode, resultCode, data);

}

三星文件浏览器不仅需要自定义操作(com.sec.android.app.myfiles.PICK_DATA), 但是类别部分(Intent.category_DEFAULT)和mime类型也应该作为额外的传递

Intent intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
intent.putExtra("CONTENT_TYPE", "*/*");
intent.addCategory(Intent.CATEGORY_DEFAULT);
您还可以使用此操作打开多个文件:com.sec.android.app.myfiles.PICK_DATA_multiple 无论如何,我的解决方案适用于三星和其他设备:

public void openFile(String mimeType) {

        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(mimeType);
        intent.addCategory(Intent.CATEGORY_OPENABLE);

        // special intent for Samsung file manager
        Intent sIntent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
         // if you want any file type, you can skip next line 
        sIntent.putExtra("CONTENT_TYPE", mimeType); 
        sIntent.addCategory(Intent.CATEGORY_DEFAULT);

        Intent chooserIntent;
        if (getPackageManager().resolveActivity(sIntent, 0) != null){
            // it is device with Samsung file manager
            chooserIntent = Intent.createChooser(sIntent, "Open file");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] { intent});
        } else {
            chooserIntent = Intent.createChooser(intent, "Open file");
        }

        try {
            startActivityForResult(chooserIntent, CHOOSE_FILE_REQUESTCODE);
        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(getApplicationContext(), "No suitable File Manager was found.", Toast.LENGTH_SHORT).show();
        }
    }

这个解决方案对我很有效,也许对其他人也有用

如果您想知道这一点,它有一个开源库,名为它是一个小型且易于使用的库,它提供了一个文件选择器

与另一个Android文件选择器库的不同之处在于,aFileDialog提供了将文件选择器作为对话框和活动打开的选项


它还允许您选择文件夹、创建文件、使用正则表达式过滤文件以及显示确认对话框。

这给了我最好的结果:

    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }


其他答案并不错误。但是,现在有了更多打开文件的选项。例如,如果您希望应用程序对文件具有长期、永久的访问权限,您可以使用
操作\u OPEN\u文档
。请参阅官方文件:。另外。

您需要非常不同的代码来拍摄图片,然后选择文件。实际上,我并不认为大多数文件浏览器都可以返回文件,但我可能错了。您可以指定主要需要访问的文件类型吗?@dtech:我不希望文件浏览器返回文件,我只需要它的路径。@subrussn90:我需要让用户选择任何类型的文件。它可以是PDF、.doc、.zip或任何类型的文件。在sd卡上获取指定文件的Uri就足够了吗???它可以与外部文件资源管理器一起使用(例如ES File Explorer或Astro File Manager,但不适用于三星File Explorer。奇怪的是,他们没有实现正确的意图过滤器来响应该操作。@Lukap-使用开源android File Manager并将其与您的应用程序集成,这样您就不需要任何第三方应用程序。如何获取所选文件?我想这是路径,但是如何呢?@FranciscoCorralesMorales-in
onActivityResult()
-你可以得到文件的
Uri
PICKFILE\u RESULT\u code
应该是
PICKFILE\u REQUEST\u code
。嗨,你能再解释一下吗?对于三星galaxy手机,我使用Intent selectFile=new Intent(“com.sec.android.app.myfiles.PICK_DATA”);但它会导致一个错误我现在不确定,但我可以稍后检查。我认为这是“活动未发现”异常。你有任何有效的解决方案吗?我几乎尝试了所有方法,但没有设法修复它。这一意图在Galaxy SII上对我有效。在GT-B5510(Galaxy Y Pro)上试用过它但它不起作用。我认为如果你想针对所有三星设备,这是不可靠的。我最终在我的应用程序中集成了一个开源文件管理器,但对于这样一个基本需求来说,这是一个繁重的解决方案。你能帮我怎么设置URI来实现这个目的吗?它几乎对我有效,只是Sinent在启动时不接受任何限制任何类型的文件。我可以浏览文件夹,但仅此而已。问题是意图需要mimeType:“file/*”,而三星Sinent需要“*/*”-在*/*之间没有空格-其他11k安卓设备如何设置URI?如果三星意图(“com.sec.android.app.myfiles.PICK_DATA”)您可以尝试将字符串额外放入“FOLDERPATH”或“START_FOLDER”"如何将获取uri转换为util.File?不确定是否获取java.io.File,但可以使用以下选项打开:如何获取简单名称在这里:如何选择文件夹?我喜欢这个答案,因为类型设置允许您选择图像。您能否共享您的onActivityResultCode@Islam Khaled?另请参阅org.openintents.action.pick_文件以获取第三个选项打开。您的代码还假设三星手机上的每个人都使用并且(仍然)都有三星文件管理器。将intent.resolveActivity与三星一起使用作为备用方案将更加可靠。
    Intent intent;
    if (android.os.Build.MANUFACTURER.equalsIgnoreCase("samsung")) {
        intent = new Intent("com.sec.android.app.myfiles.PICK_DATA");
        intent.putExtra("CONTENT_TYPE", "*/*");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
    } else {

        String[] mimeTypes =
                {"application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .doc & .docx
                        "application/vnd.ms-powerpoint", "application/vnd.openxmlformats-officedocument.presentationml.presentation", // .ppt & .pptx
                        "application/vnd.ms-excel", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", // .xls & .xlsx
                        "text/plain",
                        "application/pdf",
                        "application/zip", "application/vnd.android.package-archive"};

        intent = new Intent(Intent.ACTION_GET_CONTENT); // or ACTION_OPEN_DOCUMENT
        intent.setType("*/*");
        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.putExtra(Intent.EXTRA_LOCAL_ONLY, true);
    }