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


95

我想为可以返回任何文件的应用程序启动一个Intentchooser

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

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("*/*");
Intent i = Intent.createChooser(intent, "File");
startActivityForResult(i, CHOOSE_FILE_REQUESTCODE);

但它在我的Galaxy S2上仅显示“图库”和“音乐播放器”。该设备上有一个文件浏览器,我希望它出现在列表中。我还希望相机应用程序显示在列表中,以便用户可以拍摄图片并通过我的应用程序发送。如果我安装了Astro文件管理器,它也会响应该意图。我的客户仅是Galaxy SII所有者,鉴于他们已经具有基本但足够的文件管理器,因此我不想强迫他们安装Astro文件管理器。

关于如何实现此目标的任何想法吗?我敢肯定,我已经看到默认的文件管理器出现在这样的菜单中来选择文件,但是我不记得是哪个应用程序了。


您将需要截然不同的代码来拍摄照片然后选择一个文件。我实际上并不认为大多数文件浏览器都可以返回文件,但是我可能错了。
dtech 2012年

您能指定主要需要访问哪种文件吗?
subrussn90

1
@dtech:我不希望文件浏览器返回文件,我只需要它的路径。
ErGo_404

@ subrussn90:我需要让用户选择任何类型的文件。可以是pdf,.doc,.zip等任何文件。
ErGo_404

在SD卡上获取指定文件的Uri够了吗???
subrussn90

Answers:


88

不是用于相机,而是用于其他文件。

在我的设备中,我已经ES File Explorer安装好了,这对我来说很有效。

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

5
它的工作与外部文件浏览器(如ES文件浏览器或天文文件管理器,但与三星的文件浏览器这似乎很奇怪,他们没有实施正确的意图过滤器来响应这一行动。
ErGo_404

@Lukap-使用开源android文件管理器并将其与您的应用程序集成,然后您就不需要任何第三方应用程序。
user370305 2012年

2
如何获取所选文件?我想这是道路,但是怎么走?
Francisco Corrales Morales 2014年

1
@FranciscoCorralesMorales-中onActivityResult()-您可以获取Uri文件。
user370305 2014年

1
PICKFILE_RESULT_CODE应该是PICKFILE_REQUEST_CODE
阿隆·洛林奇

50

三星文件浏览器不仅需要自定义操作(com.sec.android.app.myfiles.PICK_DATA),而且部分类(意向。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无论如何,这是我的解决方案,可在Samsung和其他设备上使用:

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();
        }
    }

该解决方案对我来说效果很好,也许对其他人也很有用。


它几乎对我有用,除了sIntent在启动时不接受任何类型的文件这一事实。我可以浏览文件夹,仅此而已。
Radu

问题是,意图需要具有mimeType:“ file / *”,而三星sIntent需要“ * / *”-之间没有空格* / *
Radu

1
那么其他11k的Android设备呢。
奥利弗·迪克森

1
如何为此目的设置URI,请您帮帮我?
PriyankaChauhan

1
如果是Samsung Intent(“ com.sec.android.app.myfiles.PICK_DATA”),则可以尝试将String额外放入“ FOLDERPATH”或“ START_FOLDER”
Chupik,

41

在银河上为我完成的这项工作请注意其显示联系人,安装在设备上的文件管理器,图库,音乐播放器

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);

}

6
如何将uri转换为util.File?
阿南德·萨瓦尼

不确定是否要获取java.io.File,但可以使用以下文件打开:developer.android.com/reference/android/content/…如何获得简单名称:stackoverflow.com/a/23270545/755313
demaksee

3
如何选择一个文件夹?
hornet2319 2015年

6

这给了我最好的结果:

    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);
    }

你能分享你的onActivityResultCode @Islam Khaled
Kishan Donga

1
另请参阅org.openintents.action.PICK_FILE以获取第三个选项。openintents.org/action/org-openintents-action-pick-file 您的代码还假设Samsung手机上的每个人都使用并且(仍然)拥有Samsung文件管理器。与三星一起使用intent.resolveActivity作为后备会更可靠。
Marcus Wolschon

1

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

该动作是“ com.sec.android.app.myfiles.PICK_DATA”

我创建了一个自定义“活动选择器”,该活动选择器显示了同时过滤两个意图的活动。


嗨,您能再解释一下吗?对于三星银河手机,我使用Intent selectFile = new Intent(“ com.sec.android.app.myfiles.PICK_DATA”); 但它会导致错误
steliosf 2012年

我现在不确定,但是以后可以检查。我认为这是“找不到活动”例外。您有什么可行的解决方案吗?我几乎尝试了所有事情,但没有设法解决
steliosf 2012年

这个意图对我在Galaxy SII上起作用。在GT-B5510(Galaxy Y Pro)上进行了尝试,但无法正常工作。我想如果要针对所有三星设备,那只是不可靠。我最终将一个开放源代码文件管理器集成到我的应用程序中,但是对于这样的基本需求,这是一个沉重的解决方案。
ErGo_404 2012年

如何为此目的设置URI,请您帮帮我?
PriyankaChauhan

0

如果您想知道这一点,它存在一个名为aFileDialog的开源库,它是一个小巧易用的文件提供程序。

与另一个适用于Android的文件选择器库的区别在于,aFileDialog使您可以选择以对话框和活动的形式打开文件选择器。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.