我的应用程序不会显示在选择器对话框中 android.intent.action.VIEW with mime type video/* only on Marshmallow

My app won't show up on the chooser dialog for android.intent.action.VIEW with mime type video/* only on Marshmallow

基本上,当应用分享视频时 url 我的应用应该出现在列表中,但它没有出现。 MXPlayer 也没有,但 Google Photos 媒体播放器和 allcast 一样显示良好(最近发布了一个版本来解决这个问题)。

我写了一个快速应用程序来测试这个问题,这是我的清单过滤器:

<intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>

<intent-filter>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain"/>
    <data android:mimeType="video/*"/>
    <data android:mimeType="audio/*"/>
    <data android:mimeType="image/*"/>
    <action android:name="android.intent.action.SEND"/>
</intent-filter>

<intent-filter>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:mimeType="video/*" android:scheme="http"/>
    <data android:mimeType="audio/*" android:scheme="http"/>
    <data android:mimeType="image/*" android:scheme="http"/>
    <data android:mimeType="video/*" android:scheme="https"/>
    <data android:mimeType="audio/*" android:scheme="https"/>
    <data android:mimeType="image/*" android:scheme="https"/>
    <data android:mimeType="video/*" android:scheme="file"/>
    <data android:mimeType="audio/*" android:scheme="file"/>
    <data android:mimeType="image/*" android:scheme="file"/>
    <action android:name="android.intent.action.VIEW"/>
</intent-filter>

<intent-filter>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:host="*" android:pathPattern=".*\.mp4" android:scheme="http"/>
    <action android:name="android.intent.action.VIEW"/>
</intent-filter>

这是重现问题的代码:

Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(Uri.parse("http://media.w3.org/2010/05/sintel/trailer.mp4"),"video/*");
startActivity(intent);

这只是棉花糖上的一个问题。

编辑:我应该补充一点,并非所有 Marshmallow 设备都这样做。从我第一次听说它开始,我花了很长时间来重现它,直到有一天它才开始出现在我的 Nexus 5 上。我的 6P 无法重现它。

编辑:我在 startActivity 之前添加了一些调试代码。基本上我要求包管理器给我可以处理该意图的意图活动,然后我得到与我在对话框中看到的完全相同的列表。

PackageManager manager = getBaseContext().getPackageManager();
                List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
                if (infos.size() > 0) {
                    //THE INFOS LIST HAS THE 3 APPS THAT IT SHOWS BUT MINE IS MISSING
                }else{

                }

编辑:我认为添加屏幕截图可能会使其更加清晰。

这是在我的 Nexus 5 6.0.1 上,列表已完全展开

这是在装有 5.1.1 的 Nexus 4 上,列表也已完全展开

这两款手机的应用几乎完全相同。

为您的 intent-filters

尝试以下方法
<activity >
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="rtmp"/>
        <data android:scheme="rtmpe"/>
        <data android:scheme="rtmps"/>
        <data android:scheme="rtp"/>
        <data android:scheme="rtsp"/>
        <data android:scheme="mms"/>
        <data android:scheme="mmsh"/>
        <data android:scheme="icyx"/>
        <data android:scheme="httplive"/>
        <data android:scheme="udp"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:mimeType="video/*"/>
        <data android:mimeType="audio/*"/>
        <data android:mimeType="image/*"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme=""/>
        <data android:scheme="file"/>
        <data android:scheme="ftp"/>
        <data android:scheme="content"/>
        <data android:scheme="http"/>
        <data android:scheme="https"/>
        <data android:mimeType="video/*"/>
        <data android:mimeType="audio/*"/>
        <data android:mimeType="*/rmvb"/>
        <data android:mimeType="*/avi"/>
        <data android:mimeType="*/mkv"/>
        <data android:mimeType="application/3gpp*"/>
        <data android:mimeType="application/mp4"/>
        <data android:mimeType="application/mpeg*"/>
        <data android:mimeType="application/ogg"/>
        <data android:mimeType="application/sdp"/>
        <data android:mimeType="application/vnd.3gp*"/>
        <data android:mimeType="application/vnd.apple.mpegurl"/>
        <data android:mimeType="application/vnd.dvd*"/>
        <data android:mimeType="application/vnd.dolby*"/>
        <data android:mimeType="application/vnd.rn-realmedia*"/>
        <data android:mimeType="application/x-iso9660-image"/>
        <data android:mimeType="application/x-extension-mp4"/>
        <data android:mimeType="application/x-flac"/>
        <data android:mimeType="application/x-matroska"/>
        <data android:mimeType="application/x-mpegURL"/>
        <data android:mimeType="application/x-ogg"/>
        <data android:mimeType="application/x-quicktimeplayer"/>
        <data android:mimeType="application/x-shockwave-flash"/>
        <data android:mimeType="application/xspf+xml"/>
        <data android:mimeType="misc/ultravox"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme=""/>
        <data android:scheme="file"/>
        <data android:scheme="ftp"/>
        <data android:scheme="content"/>
        <data android:scheme="http"/>
        <data android:scheme="https"/>
        <data android:host="*"/>
        <data android:pathPattern=".*\.3g2"/>
        <data android:pathPattern=".*\.3gp"/>
        <data android:pathPattern=".*\.3gp2"/>
        <data android:pathPattern=".*\.3gpp"/>
        <data android:pathPattern=".*\.amv"/>
        <data android:pathPattern=".*\.asf"/>
        <data android:pathPattern=".*\.avi"/>
        <data android:pathPattern=".*\.divx"/>
        <data android:pathPattern=".*\.drc"/>
        <data android:pathPattern=".*\.dv"/>
        <data android:pathPattern=".*\.f4v"/>
        <data android:pathPattern=".*\.flv"/>
        <data android:pathPattern=".*\.gvi"/>
        <data android:pathPattern=".*\.gxf"/>
        <data android:pathPattern=".*\.ismv"/>
        <data android:pathPattern=".*\.iso"/>
        <data android:pathPattern=".*\.m1v"/>
        <data android:pathPattern=".*\.m2v"/>
        <data android:pathPattern=".*\.m2t"/>
        <data android:pathPattern=".*\.m2ts"/>
        <data android:pathPattern=".*\.m3u8"/>
        <data android:pathPattern=".*\.mkv"/>
        <data android:pathPattern=".*\.mov"/>
        <data android:pathPattern=".*\.mp2"/>
        <data android:pathPattern=".*\.mp2v"/>
        <data android:pathPattern=".*\.mp4"/>
        <data android:pathPattern=".*\.mp4v"/>
        <data android:pathPattern=".*\.m4v"/>
        <data android:pathPattern=".*\.mpe"/>
        <data android:pathPattern=".*\.mpeg"/>
        <data android:pathPattern=".*\.mpeg1"/>
        <data android:pathPattern=".*\.mpeg2"/>
        <data android:pathPattern=".*\.mpeg4"/>
        <data android:pathPattern=".*\.mpg"/>
        <data android:pathPattern=".*\.mpv2"/>
        <data android:pathPattern=".*\.mts"/>
        <data android:pathPattern=".*\.mtv"/>
        <data android:pathPattern=".*\.mxf"/>
        <data android:pathPattern=".*\.mxg"/>
        <data android:pathPattern=".*\.nsv"/>
        <data android:pathPattern=".*\.nut"/>
        <data android:pathPattern=".*\.nuv"/>
        <data android:pathPattern=".*\.ogm"/>
        <data android:pathPattern=".*\.ogv"/>
        <data android:pathPattern=".*\.ogx"/>
        <data android:pathPattern=".*\.ps"/>
        <data android:pathPattern=".*\.rec"/>
        <data android:pathPattern=".*\.rm"/>
        <data android:pathPattern=".*\.rmvb"/>
        <data android:pathPattern=".*\.tod"/>
        <data android:pathPattern=".*\.ts"/>
        <data android:pathPattern=".*\.tts"/>
        <data android:pathPattern=".*\.vob"/>
        <data android:pathPattern=".*\.vro"/>
        <data android:pathPattern=".*\.webm"/>
        <data android:pathPattern=".*\.wm"/>
        <data android:pathPattern=".*\.wmv"/>
        <data android:pathPattern=".*\.wtv"/>
        <data android:pathPattern=".*\.xesc"/>
        <data android:pathPattern=".*\.3G2"/>
        <data android:pathPattern=".*\.3GP"/>
        <data android:pathPattern=".*\.3GP2"/>
        <data android:pathPattern=".*\.3GPP"/>
        <data android:pathPattern=".*\.AMV"/>
        <data android:pathPattern=".*\.ASF"/>
        <data android:pathPattern=".*\.AVI"/>
        <data android:pathPattern=".*\.DIVX"/>
        <data android:pathPattern=".*\.DRC"/>
        <data android:pathPattern=".*\.DV"/>
        <data android:pathPattern=".*\.F4V"/>
        <data android:pathPattern=".*\.FLV"/>
        <data android:pathPattern=".*\.GVI"/>
        <data android:pathPattern=".*\.GXF"/>
        <data android:pathPattern=".*\.ISMV"/>
        <data android:pathPattern=".*\.ISO"/>
        <data android:pathPattern=".*\.M1V"/>
        <data android:pathPattern=".*\.M2V"/>
        <data android:pathPattern=".*\.M2T"/>
        <data android:pathPattern=".*\.M2TS"/>
        <data android:pathPattern=".*\.M3U8"/>
        <data android:pathPattern=".*\.MKV"/>
        <data android:pathPattern=".*\.MOV"/>
        <data android:pathPattern=".*\.MP2"/>
        <data android:pathPattern=".*\.MP2V"/>
        <data android:pathPattern=".*\.MP4"/>
        <data android:pathPattern=".*\.MP4V"/>
        <data android:pathPattern=".*\.M4V"/>
        <data android:pathPattern=".*\.MPE"/>
        <data android:pathPattern=".*\.MPEG"/>
        <data android:pathPattern=".*\.MPEG1"/>
        <data android:pathPattern=".*\.MPEG2"/>
        <data android:pathPattern=".*\.MPEG4"/>
        <data android:pathPattern=".*\.MPG"/>
        <data android:pathPattern=".*\.MPV2"/>
        <data android:pathPattern=".*\.MTS"/>
        <data android:pathPattern=".*\.MTV"/>
        <data android:pathPattern=".*\.MXF"/>
        <data android:pathPattern=".*\.MXG"/>
        <data android:pathPattern=".*\.NSV"/>
        <data android:pathPattern=".*\.NUT"/>
        <data android:pathPattern=".*\.NUV"/>
        <data android:pathPattern=".*\.OGM"/>
        <data android:pathPattern=".*\.OGV"/>
        <data android:pathPattern=".*\.OGX"/>
        <data android:pathPattern=".*\.PS"/>
        <data android:pathPattern=".*\.REC"/>
        <data android:pathPattern=".*\.RM"/>
        <data android:pathPattern=".*\.RMVB"/>
        <data android:pathPattern=".*\.TOD"/>
        <data android:pathPattern=".*\.TS"/>
        <data android:pathPattern=".*\.TTS"/>
        <data android:pathPattern=".*\.VOB"/>
        <data android:pathPattern=".*\.VRO"/>
        <data android:pathPattern=".*\.WEBM"/>
        <data android:pathPattern=".*\.WM"/>
        <data android:pathPattern=".*\.WMV"/>
        <data android:pathPattern=".*\.WTV"/>
        <data android:pathPattern=".*\.XESC"/>
        <data android:pathPattern=".*\.3ga"/>
        <data android:pathPattern=".*\.a52"/>
        <data android:pathPattern=".*\.aac"/>
        <data android:pathPattern=".*\.ac3"/>
        <data android:pathPattern=".*\.adt"/>
        <data android:pathPattern=".*\.adts"/>
        <data android:pathPattern=".*\.aif"/>
        <data android:pathPattern=".*\.aifc"/>
        <data android:pathPattern=".*\.aiff"/>
        <data android:pathPattern=".*\.amr"/>
        <data android:pathPattern=".*\.aob"/>
        <data android:pathPattern=".*\.ape"/>
        <data android:pathPattern=".*\.awb"/>
        <data android:pathPattern=".*\.caf"/>
        <data android:pathPattern=".*\.dts"/>
        <data android:pathPattern=".*\.flac"/>
        <data android:pathPattern=".*\.it"/>
        <data android:pathPattern=".*\.m4a"/>
        <data android:pathPattern=".*\.m4b"/>
        <data android:pathPattern=".*\.m4p"/>
        <data android:pathPattern=".*\.mid"/>
        <data android:pathPattern=".*\.mka"/>
        <data android:pathPattern=".*\.mlp"/>
        <data android:pathPattern=".*\.mod"/>
        <data android:pathPattern=".*\.mpa"/>
        <data android:pathPattern=".*\.mp1"/>
        <data android:pathPattern=".*\.mp2"/>
        <data android:pathPattern=".*\.mp3"/>
        <data android:pathPattern=".*\.mpc"/>
        <data android:pathPattern=".*\.mpga"/>
        <data android:pathPattern=".*\.oga"/>
        <data android:pathPattern=".*\.ogg"/>
        <data android:pathPattern=".*\.oma"/>
        <data android:pathPattern=".*\.opus"/>
        <data android:pathPattern=".*\.ra"/>
        <data android:pathPattern=".*\.ram"/>
        <data android:pathPattern=".*\.rmi"/>
        <data android:pathPattern=".*\.s3m"/>
        <data android:pathPattern=".*\.spx"/>
        <data android:pathPattern=".*\.tta"/>
        <data android:pathPattern=".*\.voc"/>
        <data android:pathPattern=".*\.vqf"/>
        <data android:pathPattern=".*\.w64"/>
        <data android:pathPattern=".*\.wav"/>
        <data android:pathPattern=".*\.wma"/>
        <data android:pathPattern=".*\.wv"/>
        <data android:pathPattern=".*\.xa"/>
        <data android:pathPattern=".*\.xm"/>
        <data android:pathPattern=".*\.3GA"/>
        <data android:pathPattern=".*\.A52"/>
        <data android:pathPattern=".*\.AAC"/>
        <data android:pathPattern=".*\.AC3"/>
        <data android:pathPattern=".*\.ADT"/>
        <data android:pathPattern=".*\.ADTS"/>
        <data android:pathPattern=".*\.AIF"/>
        <data android:pathPattern=".*\.AIFC"/>
        <data android:pathPattern=".*\.AIFF"/>
        <data android:pathPattern=".*\.AMR"/>
        <data android:pathPattern=".*\.AOB"/>
        <data android:pathPattern=".*\.APE"/>
        <data android:pathPattern=".*\.AWB"/>
        <data android:pathPattern=".*\.CAF"/>
        <data android:pathPattern=".*\.DTS"/>
        <data android:pathPattern=".*\.FLAC"/>
        <data android:pathPattern=".*\.IT"/>
        <data android:pathPattern=".*\.M4A"/>
        <data android:pathPattern=".*\.M4B"/>
        <data android:pathPattern=".*\.M4P"/>
        <data android:pathPattern=".*\.MID"/>
        <data android:pathPattern=".*\.MKA"/>
        <data android:pathPattern=".*\.MLP"/>
        <data android:pathPattern=".*\.MOD"/>
        <data android:pathPattern=".*\.MPA"/>
        <data android:pathPattern=".*\.MP1"/>
        <data android:pathPattern=".*\.MP2"/>
        <data android:pathPattern=".*\.MP3"/>
        <data android:pathPattern=".*\.MPC"/>
        <data android:pathPattern=".*\.MPGA"/>
        <data android:pathPattern=".*\.OGA"/>
        <data android:pathPattern=".*\.OGG"/>
        <data android:pathPattern=".*\.OMA"/>
        <data android:pathPattern=".*\.OPUS"/>
        <data android:pathPattern=".*\.RA"/>
        <data android:pathPattern=".*\.RAM"/>
        <data android:pathPattern=".*\.RMI"/>
        <data android:pathPattern=".*\.S3M"/>
        <data android:pathPattern=".*\.SPX"/>
        <data android:pathPattern=".*\.TTA"/>
        <data android:pathPattern=".*\.VOC"/>
        <data android:pathPattern=".*\.VQF"/>
        <data android:pathPattern=".*\.W64"/>
        <data android:pathPattern=".*\.WAV"/>
        <data android:pathPattern=".*\.WMA"/>
        <data android:pathPattern=".*\.WV"/>
        <data android:pathPattern=".*\.XA"/>
        <data android:pathPattern=".*\.XM"/>
        <data android:pathPattern=".*\.asx"/>
        <data android:pathPattern=".*\.ASX"/>
        <data android:pathPattern=".*\.m3u"/>
        <data android:pathPattern=".*\.M3U"/>
        <data android:pathPattern=".*\.pls"/>
        <data android:pathPattern=".*\.PLS"/>
        <data android:pathPattern=".*\.xspf"/>
        <data android:pathPattern=".*\.XSPF"/>
    </intent-filter>
</activity>

也尝试在 "code to reproduce the issue"

中使用 "video/mp4" 而不是 "video/*"
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(Uri.parse("http://media.w3.org/2010/05/sintel/trailer.mp4"),
                      "video/mp4");
startActivity(intent);

HTH

已修复!我所要做的就是删除 <category android:name="android.intent.category.BROWSABLE"/>