Scenario
我的 Android 应用程序中有一个 WebView,其中包含 Soundcloud 嵌入(来自 Embedly)。该嵌入有两个按钮:“在 Soundcloud 上播放”和“在浏览器中收听”。
“在 Soundcloud 上播放”按钮包含以下格式的 URLintent://tracks:257659076#Intent;scheme=soundcloud;package=com.soundcloud.android;end
Code
我的 WebView 使用自定义 WebViewClient (因为我需要拦截一些不同内容的 URL)。
protected class WebViewClient extends android.webkit.WebViewClient {
public WebViewClient() { }
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
PackageManager packageManager = context.getPackageManager();
// Create an Intent from the URL.
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
// Find out if I have any activities which will handle the URL.
List<ResolveInfo> resolveInfoList = packageManager.queryIntentActivities(intent, 0);
// If we have an app installed that can handle the URL, then use it.
if (resolveInfoList != null && resolveInfoList.size() > 0) {
Intent viewUrlIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
context.startActivity(viewUrlIntent);
}
else {
// Do something else.
}
return true;
}
}
Problem
单击“在浏览器中收听”会在嵌入本身中播放曲目并且工作正常。单击“在 Soundcloud 上播放”将调入shouldOverrideUrlLoading
在上面的 WebViewClient 中(如预期)。但是,我查找活动的代码找不到任何可以处理此 Soundcloud URL 的内容。
如果我没有在 WebView 上设置 WebViewClient(因此它只做自己的事情),“在 Soundcloud 上播放”按钮将按预期工作并启动 Soundcloud 应用程序。
临时(垃圾)解决方案
我已经成功地通过解析 URL 来获取曲目 ID,然后使用 Soundcloud 明确接受的格式构建一个新 URL,从而实现了我想要的功能(感谢this https://stackoverflow.com/questions/19513977/force-a-soundcloud-track-to-open-in-soundcloud-app-on-android所以帖子)。格式为 URL"soundcloud://tracks:[TRACK_ID]"
将被 Soundcloud 应用程序接受。
But WHY?
要么我做的整个“找出哪些活动可以处理这个 URL”的事情是错误的,或者也许(?!)WebView 使用的默认 WebViewClient 显式地处理这个问题?!似乎难以置信。