【发布时间】:2016-11-30 00:32:57
【问题描述】:
场景
我的 Android 应用中有一个 WebView,其中包含一个 Soundcloud 嵌入(来自 Embedly)。此嵌入有两个按钮:“在 Soundcloud 上播放”和“在浏览器中收听”。
“在 Soundcloud 上播放”按钮包含格式为 intent://tracks:257659076#Intent;scheme=soundcloud;package=com.soundcloud.android;end 的 URL
代码
我的 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;
}
}
问题
单击“在浏览器中收听”会在嵌入本身中播放曲目并且工作正常。单击“在 Soundcloud 上播放”将调用上面 WebViewClient 中的shouldOverrideUrlLoading(如预期的那样)。但是,我查找活动的代码找不到可以处理此 Soundcloud URL 的任何内容。
如果我没有在 WebView 上设置我的 WebViewClient(所以它只是做自己的事情),“在 Soundcloud 上播放”按钮将按预期工作并启动 Soundcloud 应用程序。
临时(废话)解决方案
通过解析 URL 以获取曲目 ID,然后使用 Soundcloud 绝对接受的格式(感谢this SO 帖子)构建一个新 URL,我已经成功地做到了这一点。 Soundcloud 应用将接受 "soundcloud://tracks:[TRACK_ID]" 格式的 URL。
但是为什么?
要么我做错了整个“找出哪些活动可以处理这个 URL”,要么(?!)WebView 使用的默认 WebViewClient 明确地处理了这个?!似乎难以置信。
【问题讨论】:
-
我也有同样的问题,很痛苦!看来这是 SoundCloud 没有修复的错误。您可以分享您在临时解决方案中使用的链接吗?
-
当然@Barakuda,我已经在那里编辑了问题(临时(废话)解决方案部分)。
标签: android android-webview soundcloud webviewclient