首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WebView的原生声云应用程序中打开声云URL

在WebView的原生声云应用程序中打开声云URL
EN

Stack Overflow用户
提问于 2016-07-26 19:22:34
回答 1查看 1.8K关注 0票数 4

场景

我在我的安卓应用程序中有一个WebView,其中包含一个Soundcloud嵌入(来自Embedly)。这个嵌入有两个按钮:“在Soundcloud上播放”和“在浏览器中听”。

“在声云上播放”按钮包含一个intent://tracks:257659076#Intent;scheme=soundcloud;package=com.soundcloud.android;end格式的网址

代码

我的WebView使用了一个自定义的WebViewClient (因为我需要截取一些不同内容的URL)。

代码语言:javascript
复制
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会显式处理此问题吗?!看起来不太可能。

EN

回答 1

Stack Overflow用户

发布于 2018-11-01 21:03:11

我只是在这里扩展临时(垃圾)解决方案,所以这远不是一个完美的答案,但仍然可以帮助那些绝对需要使用它的人,也可以使用私人音轨。

如果曲目是公共的,则replace方法有效,但对于私有曲目,此方法不起作用,这可能是因为意图URL中缺少secret令牌。

不幸的是,嵌入式播放器并没有包含我需要生成的所有必要的URL片段,除了在iframe中,由于跨源策略,我无法访问它。因此,除了iframe代码之外,我还需要共享链接。

我最终要做的是确保包含的HTML页面将共享链接作为JS变量。然后,我使用Java读取该变量,并使用该URL创建一个新的Intent。这是可行的,因为官方应用程序也会注册所有的soundcloud.com URL。

因此,对于私人曲目,这将转到HTML页面:

代码语言:javascript
复制
<script>var soundCloudURL = "https://soundcloud.com/my-profile/my-track/my-secret-token";</script>

然后,在你的Android应用程序中,你会看到这样的东西:

代码语言:javascript
复制
@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);
            }
        }
    });
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38588543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档