intent-filter的action、category、data匹配规则

我们知道有两种方式来启动Activity,显示调用和隐式调用。当使用隐式调用时,又会涉及到IntentFilter的匹配规则。我确信大多数开发者很少关注隐式调用,因为平时开发中用到大多数是显示调用。例如:用Intent直接打开一个Activity,或者用Intent通过包名等其他信息打开另外一个应用等。而隐式调用则使用的比较少,当然也不是完全不使用。例如:当我们需要打开浏览器访问某个链接时,手机上可能存在多个浏览器,我们也无法拿到某一个浏览器的包名,那么一般情况下我们会写如下代码:

  Intent intent = new Intent(); 
  intent.setAction("android.intent.action.View"); 
  intent.setDate(Uri.parser("https://www.baidu.com/"));
  startActivity(intent); 

执行完这段代码后,系统将会弹框提示选择哪个浏览器打开。只要这个Intent中的action(通过setAction()方法配置)能和Activity配置的过滤规则中的任何一个action相同即可匹配成功(这里后面会详细分析)。这里就说明Intent中action匹配到了多个Activity,所以系统会将所有能打开这个链接的应用展示出来供用户选择。这种通过action匹配activity的方式就是一种典型的隐式调用。
首先我们先分析显示调用和隐式调用的原理:

1、Activity的调用模式

a、显示调用

显示调用需要明确的指出被启动的对象的组件信息、包括包名和类名

示例1:通过包名打开一个应用

这里需要注意:启动第三方Apk的Activity,需要第三方Activity的android:exported属性为true。

android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。

总体来说它的主要作用是:是否支持其它应用调用当前组件。 
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。如果有intent-filter,你把android:exported设置为false,那么第三方app也是无法调用该组件的(会报permission拒绝)

  Intent intent = new Intent(Intent.ACTION_MAIN);
  intent.addCategory(Intent.CATEGORY_LAUNCHER);
  ComponentName cn = new ComponentName("com.mg.axe.testappa","com.mg.axe.testappa.MainActivity");
  intent.setComponent(cn);
  startActivity(intent);  

示例2: 打开一个Activity

  Intent intent = new Intent(ActivityA.this,ActivityB.class); 
  startActivity(intent);

b、隐式调用

需要Intent能匹配目标组件的IntentFilter中所设置的过滤信息.如果不匹配将无法启动目标Activity

示例1:通过action方式匹配对应的Activity

  Intent intent = new Intent(); 
  intent.setAction("android.intent.action.View"); 
  startActivity(intent); 

为什么会匹配到这么多应用的Activity? 因为在这些Activity的IntentFilter匹配规则中有如下规则:

(由于我们这里没有匹配其他的条件,所以会匹配到很多应用的Activity,我们可以添加其他的匹配条件,比如入“category”,“data”的匹配来更加精确的匹配到所需要的Activity)

通过上面的实例,大概了解了显示调用和隐式调用的方式。接下来我们将重点放在隐式调用的IntentFilter的匹配中

2.Action的匹配规则

Intent中的Action必须能够和Activity过滤规则中的Action匹配. 如果一个Intent-filter过滤规则中有多个action,那么只要Intent中的action能够和Intent-filter过滤规则中的任何一个action相同即可匹配成功。

在AndroidManifest中添加AActivity的action的匹配规则<action android:name="com.axe.mg.what" />

<activity
 android:name=".AActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <category android:name = "android.intent.category.DEFAULT" />
  <action android:name="com.axe.mg.what" />
 </intent-filter>
</activity>

然后调用以下方法即可匹配到AActivity:

public void match(){
 Intent intent = new Intent();
 intent.setAction("com.axe.mg.what");
 startActivity(intent);
}

注意:
1、系统定义了一些Action。当然我们也可以自己定义action。比如<action android:name="com.axe.mg.what" />

2、在Activity中定义的Action匹配规则可能有多个,只要Intent中的action能够和Activity过滤规则中的任何一个action相同即可匹配成功。例如:

<activity
 android:name=".AActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <category android:name = "android.intent.category.DEFAULT" />
  <action android:name="com.axe.mg.what" />
  <action android:name="com.axe.mg.how"/>
 </intent-filter>
</activity>
public void match() {   
  Intent intent = new Intent();    
  //只设置一个action。依旧能够成功。
  intent.setAction("com.axe.mg.what");    
  startActivity(intent);
}

3.category的匹配规则

如果Intent中的存在category,那么所有的category都必须在Intent-filter过滤规则中的category出现过,才能和这个Activity匹配。Intent中的category数量可能少于Activity中配置的category数量,但是Intent中的这category必须和Activity中配置的category相同才能匹配。

我们在Activity中配置category匹配规则:

<activity
 android:name=".AActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <category android:name = "android.intent.category.DEFAULT" />
 <category android:name="aaa.bb.cc"/>
 <action android:name="com.axe.mg.what" />
 </intent-filter>
</activity>

运行以下代码可以匹配到AActivity:

public void match(){
 Intent intent = new Intent();
 intent.addCategory("aaa.bb.cc");
 intent.setAction("com.axe.mg.what");
 startActivity(intent);
}

注意:1、只通过category匹配是无法匹配到AActivity的。因为category属性是一个执行Action的附加信息。
所以只靠category是无法匹配的。像如下代码:

//没有setAction()无法匹配
public void match(){
 Intent intent = new Intent();
 intent.addCategory(Intent.CATEGORY_DEFAULT);
 intent.addCategory("aaa.bb.cc");
 startActivity(intent);
}

注意:系统在使用隐式Intent的时候,会自动帮我们添加上“android.intent.category.default”,所以——实际上所有需要被隐式Intent启动的activity,都要加上<category android:name="android.intent.category.DEFAULT" />这一段声明,否则就会启动不了并提示无法匹配该Intent的错误:

4.data的匹配规则

类似于action匹配,但是data有更复杂的结构。如果在AndroidManifest.xml里面指定了这行,那么,需要匹配到它的话,在代码里必须要设置intent的data,如果没有在AndroidManifest.xml配置data,则代码里面也不可添加data

a.data的结构

<data android:scheme="axe"
 android:host="axe"
 android:port="axe"
 android:path="axe"
 android:pathPattern="axe"
 android:pathPrefix="axe"
 android:mimeType="axe"/>

data 由两部分组成
mineType 和 URI

mineType: 指媒体类型 例如: image/jpeg vided/* ...

URl 可配置更多信息,类似于url。我们可以看下URI的结构

<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
content://com.axe.mg:100/fold/subfolder/etc
http://www.axe.com:500/profile/info

我们看下URL的属性:

Scheme:URI的模式。如果URI中没有指定Scheme.那么整个URI无效。默认值为content和file。
Host:URI的host。比如www.axe.com。如果指定了scheme和port,path等其他参数,但是host未指定,那么整个URI无效;如果只指定了scheme,没有指定host和其他参数,URI是有效的。可以这样理解:一个完整的URI :http://www.axe.com:500/profile/info 我将后面的prot 和path“:500/profile/info ”去掉,这个URI任然有效。如果我单独将www.axe.com 那这个URI就无效了。
Port:URI端口,当URI指定了scheme和host参数时,port参数才有意义。
path:用来匹配完整的路径,如:http://example.com/blog/abc.html,这里将 path 设置为 /blog/abc.html 才能够进行匹配;
pathPrefix: 用来匹配路径的开头部分,拿上面的 Uri 来说,这里将 pathPrefix 设置为 /blog 就能进行匹配了;
pathPattern: 用表达式来匹配整个路径。

b.一些实例
(1)只匹配scheme

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="test" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="axe" />
 </intent-filter>
 </activity>
</application>

匹配该Activity只需要data中scheme为axe就能匹配到

public void match(){
 Intent intent=new Intent();
 //只设置Intent的Data属性
 intent.setData(Uri.parse("axe://haha"));
 startActivity(intent);
}

2)匹配 scheme host port

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="test" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:host="www.axe.com"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

匹配这个Activity需要 scheme 为 axe ,host 为 www.axe.com, port为8888才能匹配。 只要有一个不正确都无法匹配

public void match(View view){
 Intent intent=new Intent();
 //只设置Intent的Data属性
 intent.setData(Uri.parse("axe://www.axe.com:8888/mypath"));
 startActivity(intent);
}

(3)匹配 scheme host path

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
   android:host="www.axe.com"
   android:path="/mypath"
   android:scheme="axe" />
 </intent-filter>
</activity>

匹配这个Activity 必须 scheme为 axe, host 为 www.axe.com, path 为 mypath才能匹配

public void match(View view) {
 Intent intent = new Intent();
 intent.setData(Uri.parse("axe://www.axe.com:4545/mypath"));
  //port不写任然能匹配. data中没有要求做匹配
  //intent.setData(Uri.parse("axe://www.axe.com/mypath"));
 startActivity(intent);
}

(4) 匹配 scheme host port path

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

匹配这个Activity 必须 scheme为 axe,,host 为 www.axe.com, path 为 mypath,port 为8888 才能匹配

public void match(V) {
 Intent intent = new Intent();
 intent.setData(Uri.parse("axe://www.axe.com:8888/mypath"));
 startActivity(intent);
}

(5)mineType匹配(如果data里面有设置mimeType,则intent必须添加相应的mimeType;如果data里面没有设置mimeType,则不允许添加mimeType)

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />

 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:mimeType="axe/abc"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>
</activity>

可以看到我们添加了mimeType。这种匹配方法我们需要做改变。我们不能使用
setType 和 setData , 需要使用setDataAndType()。
从源码可以看出:setType() 会将URL设为null; setData()会将mineType设为null;以下为源码:

public Intent setType(String type) {
 mData = null;
 mType = type;
 return this;
}

public Intent setData(Uri data) {
 mData = data;
 mType = null;
 return this;
}

匹配这个Activity 必须 scheme为 axe, host 为 www.axe.com, path 为 mypath,port 为8888, mineType 为 axe/abc才能匹配。

public void match() {
 Intent intent = new Intent();
//注意这个方法
 intent.setDataAndType(Uri.parse("axe://www.axe.com:8888/mypath"),"axe/abc");
 startActivity(intent);
}

(6)Scheme的默认支持content 和 file

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="image/*" />
 </intent-filter>
</activity>

上面的配置中我们并没有指定scheme。我们可以通过默认值content 和 file匹配。

public void match(){
 Intent intent=new Intent();
//content也可匹配
 intent.setDataAndType(Uri.parse("file://axe"),"image/png");
 startActivity(intent);
}

注意:Android 7.0及以上系统,使用file://会报错FileUriExposedException(解决方案可参考:https://blog.csdn.net/GracefulGuigui/article/details/103637095)

(7)存在多个data的匹配
一个Activity只要能匹配任何一组data,并且每个data都指定了完整的属性(有时候匹配不上, 这个规律还未找到)

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />

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

 <data
 android:mimeType="axe/abc"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />

 <data
 android:mimeType="axe/ddd"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axee" />
 </intent-filter>
</activity>

以下两种方式都可以匹配.但是有时候会匹配不到.暂时不知道规律.建议只使用一个data.如果有多个规则需要匹配. 那就添加intent-filter

public void match() {
 Intent intent = new Intent();
 intent.setDataAndType(Uri.parse("axe://www.axe.com:8888/mypath"),"axe/abc");
 startActivity(intent);
}

public void match() {
 Intent intent = new Intent();
intent.setDataAndType(Uri.parse("axee://www.axe.com:8888/mypath"),"axe/ddd");
startActivity(intent);
}

(8)空data的匹配

<activity android:name=".MainActivity3" android:label="MainActivity3">
    <intent-filter>
        <action android:name="com.gui.action.1"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data />
    </intent-filter>
</activity>

如果想隐式匹配MainActivity3,则不可以添加data数据,因为上述的data是空的

Intent intent = new Intent("com.gui.action.1");
//不能添加data,否则匹配不到
//intent.setData(Uri.parse("content://www.axe.com"));
startActivity(intent);

4.其他的技巧

a.无法匹配时的crash log

//类似于这样。
Caused by: android.content.ActivityNotFoundException: No Activity found to handle Intent { cat=[android.intent.category.DEFAULT,aaa.bb.cc] }
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1781)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1501)
at android.app.Activity.startActivityForResult(Activity.java:3804)
at android.app.Activity.startActivityForResult(Activity.java:3765)

b.一个Activity只要能匹配任何一组intent-filter,即可成功启动对应的Activity

<activity
 android:name=".CActivity"
 android:label="@string/app_name"
 android:theme="@style/AppTheme.NoActionBar">
 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:mimeType="axe/abc"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axe" />
 </intent-filter>

 <intent-filter>
 <action android:name="xx" />
 <category android:name="android.intent.category.DEFAULT" />
 <data
 android:mimeType="axe/ddd"
 android:host="www.axe.com"
 android:path="/mypath"
 android:port="8888"
 android:scheme="axee" />
 </intent-filter>
</activity>

以下两种方式都可以匹配

public void match() {
 Intent intent = new Intent();
 intent.setDataAndType(Uri.parse("axe://www.axe.com:8888/mypath"),"axe/abc");
 startActivity(intent);
}

public void match() {
 Intent intent = new Intent();
 intent.setDataAndType(Uri.parse("axee://www.axe.com:8888/mypath"),"axe/ddd");
 startActivity(intent);
}

c.如果通过intent-filter启动一个activty,最好判断一下系统是否有能匹配该intent-filter的activity。否则可能会报无可匹配的Intent异常(方法1:可以采用下面的判断;方法2:可以采用ActivityNotFoundException、Exception)

PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
    startActivity(intent);
}

MIME Type常用表

3gp video/3gpp
aab application/x-authoware-bin
aam application/x-authoware-map
aas application/x-authoware-seg
ai application/postscript
aif audio/x-aiff
aifc audio/x-aiff
aiff audio/x-aiff
als audio/X-Alpha5
amc application/x-mpeg
ani application/octet-stream
apk application/vnd.android.package-archive
asc text/plain
asd application/astound
asf video/x-ms-asf
asn application/astound
asp application/x-asap
asx video/x-ms-asf
au audio/basic
avb application/octet-stream
avi video/x-msvideo
awb audio/amr-wb
bcpio application/x-bcpio
bin application/octet-stream
bld application/bld
bld2 application/bld2
bmp image/bmp
bpk application/octet-stream
bz2 application/x-bzip2
cal image/x-cals
ccn application/x-cnc
cco application/x-cocoa
cdf application/x-netcdf
cgi magnus-internal/cgi
chat application/x-chat
class application/octet-stream
clp application/x-msclip
cmx application/x-cmx
co application/x-cult3d-object
cod image/cis-cod
cpio application/x-cpio
cpt application/mac-compactpro
crd application/x-mscardfile
csh application/x-csh
csm chemical/x-csml
csml chemical/x-csml
css text/css
cur application/octet-stream
dcm x-lml/x-evm
dcr application/x-director
dcx image/x-dcx
dhtml text/html
dir application/x-director
dll application/octet-stream
dmg application/octet-stream
dms application/octet-stream
doc application/msword
dot application/x-dot
dvi application/x-dvi
dwf drawing/x-dwf
dwg application/x-autocad
dxf application/x-autocad
dxr application/x-director
ebk application/x-expandedbook
emb chemical/x-embl-dl-nucleotide
embl chemical/x-embl-dl-nucleotide
eps application/postscript
eri image/x-eri
es audio/echospeech
esl audio/echospeech
etc application/x-earthtime
etx text/x-setext
evm x-lml/x-evm
evy application/x-envoy
exe application/octet-stream
fh4 image/x-freehand
fh5 image/x-freehand
fhc image/x-freehand
fif image/fif
fm application/x-maker
fpx image/x-fpx
fvi video/isivideo
gau chemical/x-gaussian-input
gca application/x-gca-compressed
gdb x-lml/x-gdb
gif image/gif
gps application/x-gps
gtar application/x-gtar
gz application/x-gzip
hdf application/x-hdf
hdm text/x-hdml
hdml text/x-hdml
hlp application/winhlp
hqx application/mac-binhex40
htm text/html
html text/html
hts text/html
ice x-conference/x-cooltalk
ico application/octet-stream
ief image/ief
ifm image/gif
ifs image/ifs
imy audio/melody
ins application/x-NET-Install
ips application/x-ipscript
ipx application/x-ipix
it audio/x-mod
itz audio/x-mod
ivr i-world/i-vrml
j2k image/j2k
jad text/vnd.sun.j2me.app-descriptor
jam application/x-jam
jar application/java-archive
jnlp application/x-java-jnlp-file
jpe image/jpeg
jpeg image/jpeg
jpg image/jpeg
jpz image/jpeg
js application/x-javascript
jwc application/jwc
kjx application/x-kjx
lak x-lml/x-lak
latex application/x-latex
lcc application/fastman
lcl application/x-digitalloca
lcr application/x-digitalloca
lgh application/lgh
lha application/octet-stream
lml x-lml/x-lml
lmlpack x-lml/x-lmlpack
lsf video/x-ms-asf
lsx video/x-ms-asf
lzh application/x-lzh
m13 application/x-msmediaview
m14 application/x-msmediaview
m15 audio/x-mod
m3u audio/x-mpegurl
m3url audio/x-mpegurl
ma1 audio/ma1
ma2 audio/ma2
ma3 audio/ma3
ma5 audio/ma5
man application/x-troff-man
map magnus-internal/imagemap
mbd application/mbedlet
mct application/x-mascot
mdb application/x-msaccess
mdz audio/x-mod
me application/x-troff-me
mel text/x-vmel
mi application/x-mif
mid audio/midi
midi audio/midi
mif application/x-mif
mil image/x-cals
mio audio/x-mio
mmf application/x-skt-lbs
mng video/x-mng
mny application/x-msmoney
moc application/x-mocha
mocha application/x-mocha
mod audio/x-mod
mof application/x-yumekara
mol chemical/x-mdl-molfile
mop chemical/x-mopac-input
mov video/quicktime
movie video/x-sgi-movie
mp2 audio/x-mpeg
mp3 audio/x-mpeg
mp4 video/mp4
mpc application/vnd.mpohun.certificate
mpe video/mpeg
mpeg video/mpeg
mpg video/mpeg
mpg4 video/mp4
mpga audio/mpeg
mpn application/vnd.mophun.application
mpp application/vnd.ms-project
mps application/x-mapserver
mrl text/x-mrml
mrm application/x-mrm
ms application/x-troff-ms
mts application/metastream
mtx application/metastream
mtz application/metastream
mzv application/metastream
nar application/zip
nbmp image/nbmp
nc application/x-netcdf
ndb x-lml/x-ndb
ndwn application/ndwn
nif application/x-nif
nmz application/x-scream
nokia-op-logo image/vnd.nok-oplogo-color
npx application/x-netfpx
nsnd audio/nsnd
nva application/x-neva1
oda application/oda
oom application/x-AtlasMate-Plugin
pac audio/x-pac
pae audio/x-epac
pan application/x-pan
pbm image/x-portable-bitmap
pcx image/x-pcx
pda image/x-pda
pdb chemical/x-pdb
pdf application/pdf
pfr application/font-tdpfr
pgm image/x-portable-graymap
pict image/x-pict
pm application/x-perl
pmd application/x-pmd
png image/png
pnm image/x-portable-anymap
pnz image/png
pot application/vnd.ms-powerpoint
ppm image/x-portable-pixmap
pps application/vnd.ms-powerpoint
ppt application/vnd.ms-powerpoint
pqf application/x-cprplayer
pqi application/cprplayer
prc application/x-prc
proxy application/x-ns-proxy-autoconfig
ps application/postscript
ptlk application/listenup
pub application/x-mspublisher
pvx video/x-pv-pvx
qcp audio/vnd.qcelp
qt video/quicktime
qti image/x-quicktime
qtif image/x-quicktime
r3t text/vnd.rn-realtext3d
ra audio/x-pn-realaudio
ram audio/x-pn-realaudio
rar application/x-rar-compressed
ras image/x-cmu-raster
rdf application/rdf+xml
rf image/vnd.rn-realflash
rgb image/x-rgb
rlf application/x-richlink
rm audio/x-pn-realaudio
rmf audio/x-rmf
rmm audio/x-pn-realaudio
rmvb audio/x-pn-realaudio
rnx application/vnd.rn-realplayer
roff application/x-troff
rp image/vnd.rn-realpix
rpm audio/x-pn-realaudio-plugin
rt text/vnd.rn-realtext
rte x-lml/x-gps
rtf application/rtf
rtg application/metastream
rtx text/richtext
rv video/vnd.rn-realvideo
rwc application/x-rogerwilco
s3m audio/x-mod
s3z audio/x-mod
sca application/x-supercard
scd application/x-msschedule
sdf application/e-score
sea application/x-stuffit
sgm text/x-sgml
sgml text/x-sgml
sh application/x-sh
shar application/x-shar
shtml magnus-internal/parsed-html
shw application/presentations
si6 image/si6
si7 image/vnd.stiwap.sis
si9 image/vnd.lgtwap.sis
sis application/vnd.symbian.install
sit application/x-stuffit
skd application/x-Koan
skm application/x-Koan
skp application/x-Koan
skt application/x-Koan
slc application/x-salsa
smd audio/x-smd
smi application/smil
smil application/smil
smp application/studiom
smz audio/x-smd
snd audio/basic
spc text/x-speech
spl application/futuresplash
spr application/x-sprite
sprite application/x-sprite
spt application/x-spt
src application/x-wais-source
stk application/hyperstudio
stm audio/x-mod
sv4cpio application/x-sv4cpio
sv4crc application/x-sv4crc
svf image/vnd
svg image/svg-xml
svh image/svh
svr x-world/x-svr
swf application/x-shockwave-flash
swfl application/x-shockwave-flash
t application/x-troff
tad application/octet-stream
talk text/x-speech
tar application/x-tar
taz application/x-tar
tbp application/x-timbuktu
tbt application/x-timbuktu
tcl application/x-tcl
tex application/x-tex
texi application/x-texinfo
texinfo application/x-texinfo
tgz application/x-tar
thm application/vnd.eri.thm
tif image/tiff
tiff image/tiff
tki application/x-tkined
tkined application/x-tkined
toc application/toc
toy image/toy
tr application/x-troff
trk x-lml/x-gps
trm application/x-msterminal
tsi audio/tsplayer
tsp application/dsptype
tsv text/tab-separated-values
tsv text/tab-separated-values
ttf application/octet-stream
ttz application/t-time
txt text/plain
ult audio/x-mod
ustar application/x-ustar
uu application/x-uuencode
uue application/x-uuencode
vcd application/x-cdlink
vcf text/x-vcard
vdo video/vdo
vib audio/vib
viv video/vivo
vivo video/vivo
vmd application/vocaltec-media-desc
vmf application/vocaltec-media-file
vmi application/x-dreamcast-vms-info
vms application/x-dreamcast-vms
vox audio/voxware
vqe audio/x-twinvq-plugin
vqf audio/x-twinvq
vql audio/x-twinvq
vre x-world/x-vream
vrml x-world/x-vrml
vrt x-world/x-vrt
vrw x-world/x-vream
vts workbook/formulaone
wav audio/x-wav
wax audio/x-ms-wax
wbmp image/vnd.wap.wbmp
web application/vnd.xara
wi image/wavelet
wis application/x-InstallShield
wm video/x-ms-wm
wma audio/x-ms-wma
wmd application/x-ms-wmd
wmf application/x-msmetafile
wml text/vnd.wap.wml
wmlc application/vnd.wap.wmlc
wmls text/vnd.wap.wmlscript
wmlsc application/vnd.wap.wmlscriptc
wmlscript text/vnd.wap.wmlscript
wmv audio/x-ms-wmv
wmx video/x-ms-wmx
wmz application/x-ms-wmz
wpng image/x-up-wpng
wpt x-lml/x-gps
wri application/x-mswrite
wrl x-world/x-vrml
wrz x-world/x-vrml
ws text/vnd.wap.wmlscript
wsc application/vnd.wap.wmlscriptc
wv video/wavelet
wvx video/x-ms-wvx
wxl application/x-wxl
x-gzip application/x-gzip
xar application/vnd.xara
xbm image/x-xbitmap
xdm application/x-xdma
xdma application/x-xdma
xdw application/vnd.fujixerox.docuworks
xht application/xhtml+xml
xhtm application/xhtml+xml
xhtml application/xhtml+xml
xla application/vnd.ms-excel
xlc application/vnd.ms-excel
xll application/x-excel
xlm application/vnd.ms-excel
xls application/vnd.ms-excel
xlt application/vnd.ms-excel
xlw application/vnd.ms-excel
xm audio/x-mod
xml text/xml
xmz audio/x-mod
xpi application/x-xpinstall
xpm image/x-xpixmap
xsit text/xml
xsl text/xml
xul text/xul
xwd image/x-xwindowdump
xyz chemical/x-pdb
yz1 application/x-yz1
z application/x-compress
zac application/x-zaurus-zac
zip application/zip

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值