Google 短论坛 URL 在 Android 应用 Webview 中不工作
Google Forum short URL not working in Android app Webview
我在网站中使用 Google 论坛来填写详细信息,在 android 应用程序的 Webview 中使用该网站。当我尝试在 Webview 中打开 Google 论坛短 link 时显示错误:net::ERR_UNKNOWN_URL_SCHEME,错误代码:-10.
并且在 webview 屏幕中显示了这一行:
intent://<a href="https://docs.google.com/forms/d/e/##########/viewform%3Fusp%3Dsend_form;end">forms.gle/************#Intent;package=com.google.android.gms;action=com.google.firebase.dynamiclinks.VIEW_DYNAMIC_LINK;scheme=https;S.browser_fallback_url=https://docs.google.com/forms/d/e/########/viewform%3Fusp%3Dsend_form;end</a>; could not be loaded because:<br><br>net::ERR_UNKNOWN_URL_SCHEME
完全 Url 工作正常,Url 在浏览器中工作正常。
使用的语言:科特林,
Android 设备:三星 A 10,
Android版本:9(饼图)
使用的代码:
webview.loadUrl("https://forms.gle/#########")
并使用了这些设置:
webview?.getSettings()?.javaScriptCanOpenWindowsAutomatically = true
webview?.getSettings()?.setAppCacheEnabled(true)
webview?.getSettings()?.setAppCachePath(this.cacheDir.path)
webview?.getSettings()?.cacheMode = WebSettings.LOAD_DEFAULT```
要解决这些类型的问题,我们必须验证我们设置为 Webview 的 WebView 客户端的 shouldOverrideUrlLoading 方法。有时覆盖 url 可以以 intent 开头,因此必须以其他方式处理它们。下面附上示例代码。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
} else {
if (url.startsWith("intent://")) {
try {
Context context = webView.getContext();
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
PackageManager packageManager = context.getPackageManager();
ResolveInfo info = packageManager.resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY);
// This IF statement can be omitted if you are not strict about
// opening the Google form url in WebView & can be opened in an
// External Browser
if ((intent != null) && ((intent.getScheme().equals("https"))
|| (intent.getScheme().equals("http")))) {
String fallbackUrl = intent.getStringExtra(
"browser_fallback_url");
webView.loadUrl(fallbackUrl);
return true;
}
if (info != null) {
context.startActivity(intent);
} else {
// Call external broswer
String fallbackUrl = intent.getStringExtra(
"browser_fallback_url");
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(fallbackUrl));
context.startActivity(browserIntent);
}
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
} else {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
webView.getContext().startActivity(intent);
return true;
}
}
}
});
kotlin 中的解决方案 Google 支持 https://support.google.com/docs/thread/12941044?hl=en
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (url.startsWith("intent://")){
val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
if(intent != null){
val fallbackUrl = intent.getStringExtra("browser_fallback_url")
return if (fallbackUrl != null){
mDiscourse?.loadUrl(fallbackUrl)
true
} else {
false
}
}
}
return super.shouldOverrideUrlLoading(view, url)
}
我在网站中使用 Google 论坛来填写详细信息,在 android 应用程序的 Webview 中使用该网站。当我尝试在 Webview 中打开 Google 论坛短 link 时显示错误:net::ERR_UNKNOWN_URL_SCHEME,错误代码:-10.
并且在 webview 屏幕中显示了这一行:
intent://<a href="https://docs.google.com/forms/d/e/##########/viewform%3Fusp%3Dsend_form;end">forms.gle/************#Intent;package=com.google.android.gms;action=com.google.firebase.dynamiclinks.VIEW_DYNAMIC_LINK;scheme=https;S.browser_fallback_url=https://docs.google.com/forms/d/e/########/viewform%3Fusp%3Dsend_form;end</a>; could not be loaded because:<br><br>net::ERR_UNKNOWN_URL_SCHEME
完全 Url 工作正常,Url 在浏览器中工作正常。
使用的语言:科特林, Android 设备:三星 A 10, Android版本:9(饼图)
使用的代码:
webview.loadUrl("https://forms.gle/#########")
并使用了这些设置:
webview?.getSettings()?.javaScriptCanOpenWindowsAutomatically = true
webview?.getSettings()?.setAppCacheEnabled(true)
webview?.getSettings()?.setAppCachePath(this.cacheDir.path)
webview?.getSettings()?.cacheMode = WebSettings.LOAD_DEFAULT```
要解决这些类型的问题,我们必须验证我们设置为 Webview 的 WebView 客户端的 shouldOverrideUrlLoading 方法。有时覆盖 url 可以以 intent 开头,因此必须以其他方式处理它们。下面附上示例代码。
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
if (url.startsWith("http:") || url.startsWith("https:")) {
return false;
} else {
if (url.startsWith("intent://")) {
try {
Context context = webView.getContext();
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
if (intent != null) {
PackageManager packageManager = context.getPackageManager();
ResolveInfo info = packageManager.resolveActivity(intent,
PackageManager.MATCH_DEFAULT_ONLY);
// This IF statement can be omitted if you are not strict about
// opening the Google form url in WebView & can be opened in an
// External Browser
if ((intent != null) && ((intent.getScheme().equals("https"))
|| (intent.getScheme().equals("http")))) {
String fallbackUrl = intent.getStringExtra(
"browser_fallback_url");
webView.loadUrl(fallbackUrl);
return true;
}
if (info != null) {
context.startActivity(intent);
} else {
// Call external broswer
String fallbackUrl = intent.getStringExtra(
"browser_fallback_url");
Intent browserIntent = new Intent(Intent.ACTION_VIEW,
Uri.parse(fallbackUrl));
context.startActivity(browserIntent);
}
return true;
} else {
return false;
}
} catch (Exception e) {
return false;
}
} else {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
webView.getContext().startActivity(intent);
return true;
}
}
}
});
kotlin 中的解决方案 Google 支持 https://support.google.com/docs/thread/12941044?hl=en
override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {
if (url.startsWith("intent://")){
val intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME)
if(intent != null){
val fallbackUrl = intent.getStringExtra("browser_fallback_url")
return if (fallbackUrl != null){
mDiscourse?.loadUrl(fallbackUrl)
true
} else {
false
}
}
}
return super.shouldOverrideUrlLoading(view, url)
}