Android 关于mimeType的使用

本文介绍了在Android中如何让应用能够处理特定类型的文件,如ppt、pptx和pdf,通过设置mimeType来实现从文件管理器选择文件时,让用户能够选择你的应用进行打开。同时,文章提到了在华为手机上遇到的文件路径问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近有个需求,需要在app中显示ppt,第一反应就是从文件管理中选择ppt,然后用第三方控件显示,结果ios开发人员跟我说在ios上可以直接选择打开方式,比如微信接收到一个ppt,然后选择打开,会弹出一个列表,可以选择自己的app打开。当时我就觉得很好奇了,然后我也试验了下,发现除了offic软件,百度网盘也在列表中,那么说明是可以设置的。果不其然,在网上一番搜索后,找到

<intent-filter tools:ignore="AppLinkUrlError">
     <action android:name="android.intent.action.VIEW"/>
     <category android:name="android.intent.category.DEFAULT"/>
     <data android:mimeType="*/*"/>
</intent-filter>

补充:
如果需要设置多个类型,又不想设置成全类型,只需要多写几个mineType就可以了,比如我项目中只允许ppt、pptx、pdf类型的文件,只需要如下设置即可

<intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="application/pdf"/>
                <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation"/>
                <data android:mimeType="application/vnd.ms-powerpoint"/>
            </intent-filter>

再补充个从APP中去选择本地文件的方法,同样是允许三个类型的文件

  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent .setType("*/*");
  String[] mimeTypes = {"application/vnd.ms-powerpoint", "application/pdf","application/vnd.openxmlformats-officedocument.presentationml.presentation"};
  intent .putExtra(Intent.EXTRA_MIME_TYPES, mimeTypes);
  intent.addCategory(Intent.CATEGORY_OPENABLE);
  startActivityForResult(intent, INTENT_FILE);

但是我有个问题,要是有知道的,可以给我留言哈,
我从app外选择通过app打开。可以通过getIntent().getType();方法获取文件类型,但是从文件管理去选择,返回在onActivityResult中用同样的方法,却不行,type为null

还有其它常用的如:更多

text/plainl(纯文本)

text/html(HTML文档)

application/xhtml+xml(XHTML文档)

image/gif(GIF图像)

image/jpeg(JPEG图像)【PHP中为:image/pjpeg】

image/png(PNG图像)【PHP中为:image/x-png】

video/mpeg(MPEG动画)

application/octet-stream(任意的二进制数据)

application/pdf(PDF文档)

application/vnd.ms-powerpoint(PPT文档)

application/vnd.openxmlformats-officedocument.presentationml.presentation(PPTX文档)

application/msword(Microsoft Word文件)

message/rfc822(RFC 822形式)

multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)

application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)

multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

2:在java文件的onCreate中设置, str就是文件的路径

Intent intent = getIntent();
       String action = intent.getAction();
       //将文件复制到制定目录中
       if (Intent.ACTION_VIEW.equals(action)) {
           Uri uri = intent.getData();
           String str = Uri.decode(uri.getEncodedPath());
}

参考

补充:

我发现,在华为手机上测试时,str为/external/file/2255,然后读取文件提示文件不存在,查看文件详情发现地址的确不是这个。
下面直接记录下代码

 String path = uri2Path(this, uri);
     public String uri2Path(Context context, Uri uri) {
            String path;
            if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方应用打开
                path = uri.getPath();
            } else {
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后
                    path = getPath(context, uri);
                } else {//4.4以下下系统调用方法
                    path = getRealPathFromURI(uri);
                }
            }
            return path;
        }


private String getPath(final Context context, final Uri uri) {

        final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

        // DocumentProvider
        if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
            // ExternalStorageProvider
            if (isExternalStorageDocument(uri)) {
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];

                if ("primary".equalsIgnoreCase(type)) {
                    return Environment.getExternalStorageDirectory() + "/" + split[1];
                }
            } else if (isDownloadsDocument(uri)) { // DownloadsProvider
                final String id = DocumentsContract.getDocumentId(uri);
                final Uri contentUri = ContentUris.withAppendedId(
                        Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
                return getDataColumn(context, contentUri, null, null);
            } else if (isMediaDocument(uri)) { // MediaProvider
                final String docId = DocumentsContract.getDocumentId(uri);
                final String[] split = docId.split(":");
                final String type = split[0];
                Uri contentUri = null;
                if ("image".equals(type)) {
                    contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                } else if ("video".equals(type)) {
                    contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                } else if ("audio".equals(type)) {
                    contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                }
                final String selection = "_id=?";
                final String[] selectionArgs = new String[]{split[1]};
                return getDataColumn(context, contentUri, selection, selectionArgs);
            }
        } else if ("content".equalsIgnoreCase(uri.getScheme())) {// MediaStore (and general)
            return getDataColumn(context, uri, null, null);
        } else if ("file".equalsIgnoreCase(uri.getScheme())) {// File
            return uri.getPath();
        }
        return null;
    }

 /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is ExternalStorageProvider.
     */
    private boolean isExternalStorageDocument(Uri uri) {
        return "com.android.externalstorage.documents".equals(uri.getAuthority());
    }


    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is DownloadsProvider.
     */
    private boolean isDownloadsDocument(Uri uri) {
        return "com.android.providers.downloads.documents".equals(uri.getAuthority());
    }


    /**
     * Get the value of the data column for this Uri. This is useful for
     * MediaStore Uris, and other file-based ContentProviders.
     *
     * @param context       The context.
     * @param uri           The Uri to query.
     * @param selection     (Optional) Filter used in the query.
     * @param selectionArgs (Optional) Selection arguments used in the query.
     * @return The value of the _data column, which is typically a file path.
     */
    private String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {
        Cursor cursor = null;
        final String column = "_data";
        final String[] projection = {column};

        try {
            cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                    null);
            if (cursor != null && cursor.moveToFirst()) {
                final int column_index = cursor.getColumnIndexOrThrow(column);
                return cursor.getString(column_index);
            }
        } finally {
            if (cursor != null)
                cursor.close();
        }
        return null;
    }

    /**
     * @param uri The Uri to check.
     * @return Whether the Uri authority is MediaProvider.
     */
    private boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
 private String getRealPathFromURI(Uri contentUri) {
        String res = null;
        String[] pro = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, pro, null, null, null);
        if (null != cursor && cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
            cursor.close();
        }
        return res;
    }
<activity android:name=".opp.BluetoothOppLauncherActivity" android:process="@string/process" android:theme="@android:style/Theme.Material.Light.Dialog" android:label="@string/bt_share_picker_label" android:excludeFromRecents="true" android:configChanges="orientation|keyboardHidden|screenSize" android:enabled="@bool/profile_supported_opp"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> <data android:mimeType="audio/*" /> <data android:mimeType="text/x-vcard" /> <data android:mimeType="text/x-vcalendar" /> <data android:mimeType="text/calendar" /> <data android:mimeType="text/plain" /> <data android:mimeType="text/html" /> <data android:mimeType="text/xml" /> <data android:mimeType="application/zip" /> <data android:mimeType="application/vnd.ms-excel" /> <data android:mimeType="application/msword" /> <data android:mimeType="application/vnd.ms-powerpoint" /> <data android:mimeType="application/pdf" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <data android:mimeType="application/x-hwp" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/mspowerpoint" /> <data android:mimeType="application/vnd.android.package-archive" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SEND_MULTIPLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="image/*" /> <data android:mimeType="video/*" /> <data android:mimeType="audio/*" /> <data android:mimeType="x-mixmedia/*" /> <data android:mimeType="text/x-vcard" /> <data android:mimeType="text/x-vcalendar" /> <data android:mimeType="text/plain" /> <data android:mimeType="application/zip" /> <data android:mimeType="application/msword" /> <data android:mimeType="application/vnd.ms-excel" /> <data android:mimeType="application/vnd.ms-powerpoint" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> <data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> <data android:mimeType="application/pdf" /> <data android:mimeType="application/ogg" /> <data android:mimeType="application/mspowerpoint" /> </intent-filter> <intent-filter> <action android:name="android.btopp.intent.action.OPEN" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="vnd.android.cursor.item/vnd.android.btopp" /> </intent-filter> </activity>
最新发布
07-11
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘟嘟嘟~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值