场景
我在我的安卓应用程序中有一个WebView,其中包含一个Soundcloud嵌入(来自Embedly)。这个嵌入有两个按钮:“在Soundcloud上播放”和“在浏览器中听”。
“在声云上播放”按钮包含一个intent://tracks:257659076#Intent;scheme=soundcloud;package=com.soundcloud.android;end格式的网址
代码
我的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;
}
}问题
点击"Listen in browser“在嵌入文件中播放曲目,效果很好。点击"Play on Soundcloud“将在上面的WebViewClient中调用shouldOverrideUrlLoading (如预期的)。然而,我用来查找活动的代码找不到任何可以处理这个Soundcloud URL的东西。
如果我没有在WebView上设置我的WebViewClient (所以它只做它自己的事情),“在Soundcloud上播放”按钮将按预期工作,并启动Soundcloud应用程序。
临时(垃圾)解决方案
我通过解析URL来获得曲目ID,然后使用Soundcloud绝对可以接受的格式构建一个新的URL (感谢this所以post),从而实现了我想要的功能。"soundcloud://tracks:[TRACK_ID]"格式的网址将被声云应用程序接受。
但是为什么呢?
要么我做了整个“找出哪些活动可以处理这个URL”的事情,要么可能(?!)WebView使用的默认WebViewClient会显式处理此问题吗?!看起来不太可能。
发布于 2018-11-01 21:03:11
我只是在这里扩展临时(垃圾)解决方案,所以这远不是一个完美的答案,但仍然可以帮助那些绝对需要使用它的人,也可以使用私人音轨。
如果曲目是公共的,则replace方法有效,但对于私有曲目,此方法不起作用,这可能是因为意图URL中缺少secret令牌。
不幸的是,嵌入式播放器并没有包含我需要生成的所有必要的URL片段,除了在iframe中,由于跨源策略,我无法访问它。因此,除了iframe代码之外,我还需要共享链接。
我最终要做的是确保包含的HTML页面将共享链接作为JS变量。然后,我使用Java读取该变量,并使用该URL创建一个新的Intent。这是可行的,因为官方应用程序也会注册所有的soundcloud.com URL。
因此,对于私人曲目,这将转到HTML页面:
<script>var soundCloudURL = "https://soundcloud.com/my-profile/my-track/my-secret-token";</script>然后,在你的Android应用程序中,你会看到这样的东西:
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url) {
if (uri.getScheme().contains("intent")) {
openSoundCloudPlayer();
return true;
}
}
private void openSoundCloudPlayer() {
appWebView.evaluateJavascript("(function() { return soundCloudUrl })();", new ValueCallback<String>() {
@Override
public void onReceiveValue(String soundCloudUrl) {
// JS null is converted into a string "null", not Java null.
if (soundCloudUrl != "null") {
// Take out the quotes from the string
soundCloudUrl = soundCloudUrl.replace("\"", "");
Uri newUri = Uri.parse(soundCloudUrl);
Intent intent = new Intent(Intent.ACTION_VIEW, newUri);
startActivity(intent);
}
}
});
}https://stackoverflow.com/questions/38588543
复制相似问题