关于MIME TYPE描述

多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。

内容类型(Content-Type),这个头部领域用于指定消息的类型。一般以下面的形式出现。[type]/[subtype]

type有下面的形式。

  • Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
  • Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
  • Application:用于传输应用程序数据或者二进制数据;
  • Message:用于包装一个E-mail消息;
  • Image:用于传输静态图片数据;
  • Audio:用于传输音频或者音声数据;
  • Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。

subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示:

  • text/plain(纯文本
  • 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/msword(Microsoft Word文件)
  • message/rfc822(RFC 822形式)
  • multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
  • application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
  • multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)

---------------------------------------------------------------------------------------------------------------------------

Android中MimeType的用途                 Intent-Filter中的<data>有一个mimeType . 它的作用是告诉Android系统本Activity可以处理的文件的类型。如设置为 “text/plain”表示可以处理“.txt”文件。 MimeTypeMap类                 MimeTypeMap类是专门处理mimeType的类。

--------------------------------------------------------------------------------------------------------------------------- 类说明以及方法如下:

[java] view plaincopy

 
  1. Class Overview
  2. Two-way map that maps MIME-types to file extensions and vice versa.
  3. Summary
  4. Public Methods
  5. String
  6. getExtensionFromMimeType(String mimeType)
  7. Return the registered extension for the given MIME type.
  8. static String
  9. getFileExtensionFromUrl(String url)
  10. Returns the file extension or an empty string iff there is no extension.
  11. String
  12. getMimeTypeFromExtension(String extension)
  13. Return the MIME type for the given extension.
  14. staticMimeTypeMap
  15. getSingleton()
  16. Get the singleton instance of MimeTypeMap.
  17. boolean
  18. hasExtension(String extension)
  19. Return true if the given extension has a registered MIME type.
  20. boolean
  21. hasMimeType(String mimeType)
  22. Return true if the given MIME type has an entry in the map.

MimeTypeMap类是单例模式的,既没有公有的构造方法。使用getSinglton()方法获得MimeTypeMap对象:
       MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();

示例:

[java] view plaincopy

 
  1. public class MainActivity extends Activity {
  2. private String tag = "MainActivity";
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.main);
  7. System.out.println(111);
  8. MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
  9. //MimeTypeMap中是否有txt的MimeType
  10. System.out.println(mimeTypeMap.hasExtension("txt"));
  11. System.out.println(mimeTypeMap.hasMimeType("text/html"));
  12. //获得txt文件类型的MimeType
  13. String extension = mimeTypeMap.getMimeTypeFromExtension("txt");
  14. System.out.println(extension);
  15. }
  16. }
---------------------------------------------------------------------------------------------------------------------------
在Android-4.2中,用MimeUtils类来管理所有支持的MimeType类型
[java] view plaincopy

 
  1. static {
  2. // The following table is based on /etc/mime.types data minus
  3. // chemical/* MIME types and MIME types that don't map to any
  4. // file extensions. We also exclude top-level domain names to
  5. // deal with cases like:
  6. //
  7. // mail.google.com/a/google.com
  8. //
  9. // and "active" MIME types (due to potential security issues).
  10. add("application/andrew-inset", "ez");
  11. add("application/dsptype", "tsp");
  12. add("application/futuresplash", "spl");
  13. add("application/hta", "hta");
  14. <span style="white-space:pre">  </span>...
---------------------------------------------------------------------------------------------------------------------------

如何使用:

实例代码为SDK自带的sample NotePad

startActivity(new Intent(Intent.ACTION_EDIT, uri));

其中uri为:content://com.google.provider.NotePad/notes/1

要启动的activity为

[html] view plaincopy

 
 
  1. <activity android:name="NoteEditor"
  2. android:theme="@android:style/Theme.Light"
  3. android:label="@string/title_note"
  4. android:screenOrientation="sensor"
  5. android:configChanges="keyboardHidden|orientation"
  6. >
  7. <!-- This filter says that we can view or edit the data of
  8. a single note -->
  9. <intent-filter android:label="@string/resolve_edit">
  10. <action android:name="android.intent.action.VIEW" />
  11. <action android:name="android.intent.action.EDIT" />
  12. <action android:name="com.android.notepad.action.EDIT_NOTE" />
  13. <category android:name="android.intent.category.DEFAULT" />
  14. <data android:mimeType="vnd.android.cursor.item/vnd.google.note" />
  15. </intent-filter>
  16. <!-- This filter says that we can create a new note inside
  17. of a directory of notes. -->
  18. <intent-filter>
  19. <action android:name="android.intent.action.INSERT" />
  20. <category android:name="android.intent.category.DEFAULT" />
  21. <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
  22. </intent-filter>
  23. </activity>

隐形Intent如何找到其对定的Activity?

1.系统从intent中获取道uri,得到了content://com.google.provider.NotePad/notes/1,

去掉开始的content:标识,得到com.google.provider.NotePad/notes/1,

然后获取前面的com.google.provider.NotePad,然后就到Androidmanfest.xml中

找到authorities为com.google.provider.NotePad的provider,

然后就加载这个content provider

[java] view plaincopy

 
 
  1. <provider android:name="NotePadProvider"
  2. android:authorities="com.google.provider.NotePad"
  3. />

2.然后调用NotePadProvider的gettype函数,并把上述URI传给这个函数,

函数返回URI所对应的类型,这里返回Notes.CONTENT_ITEM_TYPE,代表一条日志记录,

而CONTENT_ITEM_TYPE = " vnd.android.cursor.item/vnd.google.note "

[java] view plaincopy

 
 
  1. @Override
  2. public String getType(Uri uri) {
  3. switch (sUriMatcher.match(uri)) {
  4. case NOTES:
  5. return Notes.CONTENT_TYPE;
  6. case NOTE_ID:
  7. return Notes.CONTENT_ITEM_TYPE;
  8. default:
  9. throw new IllegalArgumentException("Unknown URI " + uri);
  10. }
  11. }

3.然后系统使用获得的" vnd.android.cursor.item/vnd.google.note "和

”android.intent.action.EDIT”到androidmanfest.xml中去找匹配的activity.

其中:android:authorities="com.google.provider.NotePad" 这段代码是指定此ContentProvider的authorities,

类似于activity中的IntentFilter中action的作用,说白了就是这个ContentProvider在一个

android系统中的名字。ContentProvider在这个应用程序启动以后,

就会永远存在android系统中,直到卸载这个应用程序。

Android MimeType的用法和几种类型的更多相关文章

  1. Android:Intent传递数据的几种类型和源码实现

    public class Intent implements Parcelable, Cloneable {   //... private String mAction; private Uri m ...

  2. Android MimeType的用途以及所有类型

    MIME TYPE描述 多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支持非ASCII字符 ...

  3. Android窗口系统第一篇---Window的类型与Z-Order确定

    Android的窗口系统是UI架构很重要的一部分,数据结构比较多,细节比较多.本篇文章主要介绍窗口相关数据结构和抽象概念理解,关于[窗口部分的博客]计划如下. 1.窗口Z-Order的管理 2.应用程 ...

  4. Android开发_Android数据的四种存储方式

    Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放 ...

  5. Android中实现定时器的四种方式

    第一种方式利用Timer和TimerTask 1.继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); ...

  6. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示

    Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示 今天项目中要实现一个天气的预览,加载的信息很多,字段也很多,所以理清了一下思路,准备独立出来写一个总结,这样对大家 ...

  7. 【转】Android播放音频MediaPlayer的几种方式介绍

    接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...

  8. 【Android】播放音频的几种方式介绍

    接下来笔者介绍一下Android中播放音频的几种方式,android.media包下面包含了Android开发中媒体类,当然笔者不会依次去介绍,下面介绍几个音频播放中常用的类: 1.使用MediaPl ...

  9. Android源码中中一种常见的struct使用方法

    直接看例子: #include<iostream> #include<stdlib.h> using namespace std; struct Base{ int ba; i ...

随机推荐

  1. 360safe安全卫士防网站攻击源码

    近段时间,公司网站老被攻击,于是研究起防止攻击方法,当然无外乎就是SQL注入之类的问题,无意间发现了一个360安全卫士提供的源码,觉得挺好的,咋们暂且不说防攻击效果,至少思路是很好的,奉献给大家,大家 ...

  2. Redis入门笔记(二)-配置及运行

    转自: http://gly199.iteye.com/blog/1056424 1.redis基本参数 redis的配置文件中的常见参数如下: daemonize   是否以后台进程运行,默认为no ...

  3. JAVA生成二维码图片代码

    首先需要导入 QRCode.jar 包 下载地址看这里   http://pan.baidu.com/s/1o6qRFqM import java.awt.Color;import java.awt. ...

  4. jq图片点击居中放大原始图片兼容ie

    /* *鍥剧墖澶у浘鏄剧ず */ function imgshow(){ content_div:"";//内容 bg_div:"";//背景变暗 img_di ...

  5. (转)实例分析:MySQL优化经验

    [IT专家网独家]同时在线访问量继续增大,对于1G内存的服务器明显感觉到吃力,严重时甚至每天都会死机,或者时不时的服务器卡一下,这个问题曾经困扰了我半个多月.MySQL使用是很具伸缩性的算法,因此你通 ...

  6. 将filenames里的每个字符串输出到out文件对象中注意行首的缩进

    在Linux上用强大的shell脚本应该也可以完成,可是使用Windows的朋友呢?其实象这样一个简单任务用Python这个强大脚本语言只要几条语句就可以搞定了.个大家知道,要完成这样一个任务根本不用 ...

  7. DDoS deflate+iptables防御轻量级ddos攻击

    一.查看攻击者ip #netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n 二.安装ddos deflate ...

  8. (IOS)BaiduFM 程序分析

    本文主要分享下楼主在学习Swift编程过程中,对GitHub上的一个开源app BaiduFM的研究心得. 项目地址:https://github.com/belm/BaiduFM-Swift 一.项 ...

  9. EntityFramework 实体拆分与表拆分

    摘录自https://msdn.microsoft.com/zh-cn/data/jj591617 * 将实体类型的 CLR 属性映射到数据库中的多个表(实体拆分) 实体拆分允许一个实体类型的属性分散 ...

  10. 蓝牙物理链路类型:SCO和ACL链路

    蓝牙物理链路ACL(Asynchronous Connectionless), 另外的一种链路是SCO(Synchronous Connection Oriented)主要用来传输对时间要求很高的数据 ...