複数の種類のファイルのAndroidインテントスクリーニング



Android Intent Screening Multiple Types Files



プロジェクトでは、特定の種類のファイルを選択する必要が頻繁に発生します。

ドキュメントの種類を指定します

通常、setTypeを実現するためにフィルターを使用します
例:PDFドキュメントの表示のみ



int requestCode = 100 Intent intent = new Intent(Intent.ACTION_GET_CONTENT) intent.setType('application/pdf') intent.addCategory(Intent.CATEGORY_OPENABLE) startActivityForResult(intent, requestCode)

しかし、複数の種類のファイルを指定したいが、pdf、excel、word、pptのこれらの種類のファイルを指定したい場合は、設定方法次第ですか?

複数のファイルタイプを指定する

オンラインでチェックインすると、答えは次のとおりです。



  • 間違った方法1-スプライシングのsetType
intent.setType ( 'video / * image / *') // select both videos and pictures
  • 2--間違った方法を数回呼び出すsetType
intent.setType('video/*') intent.setType('image/*')

どちらの方法も間違っています
私たちはコードを見てください

5491294-45b1b89bbede1ae7.pngsetTypeを設定し、置き換えられます
5491294-1670e6334dbf014c.pngmTypeタイプ文字列
確認できるように、setTypeは毎回再割り当てされ、リストと配列に追加されないため、複数のタイプのファイルを指定する2つの方法で実現することは不可能です。
この実施形態は達成できないので、 したがって、Intentはフィールドデータを提供して、フィルターを通過できるようにします 私たちは公式文書とソースコードを通じて、Intentが提供していることがわかりました EXTRA_MIME_TYPESこのフィールドを渡しますが、配列型です /** * Extra used to communicate a set of acceptable MIME types. The type of the * extra is {@code String[]}. Values may be a combination of concrete MIME * types (such as 'image/png') and/or partial MIME types (such as * 'audio/*'). * * @see #ACTION_GET_CONTENT * @see #ACTION_OPEN_DOCUMENT */ public static final String EXTRA_MIME_TYPES = 'android.intent.extra.MIME_TYPES'

したがって、結果は単純です。次のように、ppt、word、excel、pdfファイルタイプを指定します。

public static void openDirChooseFile(Activity activity, int requestCode, String[] mimeTypes) { Intent intent = new Intent(Intent.ACTION_GET_CONTENT) if (mimeTypes != null) { intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes) } intent.setType('*/*') intent.addCategory(Intent.CATEGORY_OPENABLE) // intent.putExtra (Intent.EXTRA_ALLOW_MULTIPLE, true) // multiple choice activity.startActivityForResult(intent, requestCode) } public static void chooseFile(Activity activity, int requestCode) { String[] mimeTypes = {MimeType.DOC, MimeType.DOCX, MimeType.PDF, MimeType.PPT, MimeType.PPTX, MimeType.XLS, MimeType.XLSX} FileUtil.openDirChooseFile(activity, requestCode, mimeTypes) }

MimeTypeファイル



/** * @author Armyone * @date 2018/11/21 10:56 * @desc */ public class MimeType { public static final String DOC = 'application/msword' public static final String DOCX = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' public static final String XLS = 'application/vnd.ms-excel application/x-excel' public static final String XLSX = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' public static final String PPT = 'application/vnd.ms-powerpoint' public static final String PPTX = 'application/vnd.openxmlformats-officedocument.presentationml.presentation' public static final String PDF = 'application/pdf' }

意図は複数のファイルタイプを指定します、正しいアプローチは Intent.EXTRA_MIME_TYPES 実装されたMIMEタイプの配列が渡されました

intent.setType('*/*') intent.putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes)