我的应用不会显示在 android.intent.action.VIEW 的选择器对话框中,只有在 Marshmallow 上具有 mime 类型 video/*

Posted

技术标签:

【中文标题】我的应用不会显示在 android.intent.action.VIEW 的选择器对话框中,只有在 Marshmallow 上具有 mime 类型 video/*【英文标题】:My app won't show up on the chooser dialog for android.intent.action.VIEW with mime type video/* only on Marshmallow 【发布时间】:2016-04-22 08:42:54 【问题描述】:

基本上,当应用分享视频网址时,我的应用应该会显示在列表中,但它不会。 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 的问题。

编辑:我应该补充一点,并非所有 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 上,列表已完全展开

这是我的 Nexus 4 和 5.1.1,列表也完全展开

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

【问题讨论】:

您是否尝试过每种 mime 类型的一个意图过滤器? 我在运行 Android 6.0.1 的 Nexus 9 上测试了您的意图过滤器,它运行良好。你用什么来重复这个问题? @ligi 我已经尝试了所有我能想到的组合。 @JaredRummler 可能有一些 Android 6.0.1 设备可以使用。自从我的用户开始报告该问题以来,我花了大约一个月的时间才重现该问题,突然间我开始能够在我的 Nexus 5 上重现它。我的 Nexus 6P 仍然无法重现它。 你可以尝试intent-intercept来获取更多细节 【参考方案1】:

修好了!我所要做的就是删除&lt;category android:name="android.intent.category.BROWSABLE"/&gt;

【讨论】:

【参考方案2】:

为您的意图过滤器尝试以下操作

<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>

还可以尝试在“重现问题的代码”中使用“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

【讨论】:

感谢这份非常全面的清单,但它也有同样的问题。 @mntgoat 您可能需要再次检查,当我查看包含该链接的网页时,我可以让我的这个工作(我的应用程序显示在选择器中)。 你能检查一下 MXPlayer 是否出现在你面前吗?如果是这样,那么您在手机上看不到问题。似乎只有部分手机能体验到它。 DERP!!完全忘记了我正在我的 6P 运行 jan 更新(所以最新的 6.0.1)上尝试这个 @mntgoat MX Player 也出现了(相同的 6P 6.0.1 设备)

以上是关于我的应用不会显示在 android.intent.action.VIEW 的选择器对话框中,只有在 Marshmallow 上具有 mime 类型 video/*的主要内容,如果未能解决你的问题,请参考以下文章

android android.intent.action.call 使 Android 应用程序崩溃?

Android Intent 选择器仅显示电子邮件选项

Android Intent Filter:无法从预览中打开音频文件?

Android - Intent.Action_Send 发送多个图像而不多次显示选择器对话框

Android:Intent-Filter 和后台网页

Android Intent应用