gpt4 book ai didi

android - 从 WebView 在 native Soundcloud 应用程序中打开 Soundcloud URL

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:34 25 4
gpt4 key购买 nike

场景

我的 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(如预期)。但是,我用于查找 Activity 的代码找不到任何可以处理此 Soundcloud URL 的内容。

如果我没有在 WebView 上设置我的 WebViewClient(所以它只是做自己的事情),“在 Soundcloud 上播放”按钮将按预期工作并启动 Soundcloud 应用程序。

临时(废话)解决方案

我已经设法通过解析 URL 以获取轨道 ID,然后使用 Soundcloud 绝对接受的格式构建新 URL(感谢 this SO 帖子)来实现我想要它做的事情。 Soundcloud 应用程序将接受格式为 "soundcloud://tracks:[TRACK_ID]" 的 URL。

但是为什么?

要么我在做整个“找出哪些 Activity 可以处理此 URL”的事情是错误的,要么可能(?!)WebView 使用的默认 WebViewClient 明确处理了这个问题?!似乎难以置信。

最佳答案

我只是在这里扩展临时(废话)解决方案,所以这远非一个完美的答案,但仍然可以帮助那些绝对需要让它工作的人,还有私有(private)轨道。

replace 方法在轨道是公共(public)轨道时有效,但对于私有(private)轨道则不起作用,这可能是因为 intent URL 中缺少 secret token 。

不幸的是,嵌入播放器不包含我需要生成的 URL 的所有必要部分,iframe 除外,由于跨源策略我无法访问它。所以除了 iframe 代码之外,我还需要共享链接。

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

因此,对于私有(private)轨道,这将转到 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);
}
}
});
}

关于android - 从 WebView 在 native Soundcloud 应用程序中打开 Soundcloud URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38588543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com