ACTION_GET_CONTENT 只有文件,没有图片或视频

CoX*_*ies 3 java android file

好的,我用这个开始我的功能

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType(mimeType);
    intent.addCategory(Intent.CATEGORY_OPENABLE);
Run Code Online (Sandbox Code Playgroud)

三星

        chooserIntent = Intent.createChooser(sIntent, context.getString(R.string.choosefilefrom));
        chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {intent});
Run Code Online (Sandbox Code Playgroud)

对于其他设备

        chooserIntent = Intent.createChooser(intent, context.getString(R.string.choosefilefrom));
Run Code Online (Sandbox Code Playgroud)

mimeType 是允许使用的类型,此时为*/*. 但是如何排除图像和视频以仅显示文件选择器中的文件?我有 3 种意图,一种用于图像,一种用于视频,一种用于文件。

Pie*_*rre 6

如果你看看https://www.iana.org/assignments/media-types/media-types.xhtml

那么你大概可以假设主要的 mime 类型:

  • application/*(很多文件类型,不包括以下主要类型,但包括音频application/ogg
  • 声音的/*
  • 字体/*
  • 图片/*
  • 信息/*
  • 模型/*
  • 多部分/*
  • 文本/*
  • 视频/*

因此,假如你想成为能够选择别的其他则AudioVideo或者是Images

那么以下应该可以解决问题:

String[] mimetypes = {
    "application/*",
    //"audio/*",
    "font/*",
    //"image/*",
    "message/*",
    "model/*",
    "multipart/*",
    "text/*",
    //"video/*"
};

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes); //Important part here
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
startActivityForResult(intent, 10000);
Run Code Online (Sandbox Code Playgroud)

然后当然要处理返回的 URI:

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 10000)
    {
        if (data != null)
        {
            if (data.getClipData() != null)
            {
                // multiple files selected
                for (int i = 0; i < data.getClipData().getItemCount(); i++)
                {
                    android.net.Uri uri = data.getClipData().getItemAt(i).getUri();
                }
            }
            else
            {
                // single file selected
                android.net.Uri uri = data.getData();
            }
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

编辑:

以下是正确获取所有内容的方法Uri's

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 10000)
    {
        if (data != null)
        {
            List<Uri> sharedUris = getUrisFromIntent(data);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后getUrisFromIntent方法:

public static List<Uri> getUrisFromIntent(Intent intent) {
    List<Uri> uriList = new ArrayList<>();
    if (intent.getData() != null) {
        uriList.add(intent.getData());
    } else if (intent.getClipData() != null) {
        for (int i = 0; i < intent.getClipData().getItemCount(); i++) {
            uriList.add(intent.getClipData().getItemAt(i).getUri());
        }
    } else {
        if (intent.getAction().equals(Intent.ACTION_SEND)) {
            if (intent.hasExtra(Intent.EXTRA_STREAM)) {
                Uri sharedFile = intent.getParcelableExtra(Intent.EXTRA_STREAM);
                if (sharedFile != null) {
                    uriList.add(sharedFile);
                }
            }
        } else if (intent.getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
            if (intent.hasExtra(Intent.EXTRA_STREAM)) {
                List<Uri> sharedFiles = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
                if (sharedFiles != null) {
                    uriList.addAll(sharedFiles);
                }
            }
        }
    }
    return uriList;
}
Run Code Online (Sandbox Code Playgroud)

这在 Android API 17 - 29上经过测试和工作