Android WebView err_unknown_url_scheme
Posted
技术标签:
【中文标题】Android WebView err_unknown_url_scheme【英文标题】: 【发布时间】:2017-06-01 06:54:09 【问题描述】:使用下面的简单代码,我可以正确加载我的 url,但是,当我尝试点击以 mailto: whatsapp:开头的 html 链接时,我得到“ERR_UNKNOWN_URL_SCHEME” > 和 tg:(电报)。
谁能帮我解决这个问题?不幸的是,我根本不懂 Java :(
谢谢。
import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends Activity
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
// Force links and redirects to open in the WebView instead of in a browser
mWebView.setWebViewClient(new WebViewClient());
// Enable javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Use remote resource
mWebView.loadUrl("http://myexample.com");
【问题讨论】:
【参考方案1】:你必须在 webview 中设置一个客户端并将它们传递给一个意图
webView.setWebViewClient(new WebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
if( URLUtil.isNetworkUrl(url) )
return false;
if (appInstalledOrNot(url))
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity( intent );
else
// do something if app is not installed
return true;
);
你可以有一个方法来检查是否安装了应用程序
private boolean appInstalledOrNot(String uri)
PackageManager pm = getPackageManager();
try
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
return true;
catch (PackageManager.NameNotFoundException e)
return false;
【讨论】:
非常感谢!这行得通!我能再问你一件事吗?如果设备上没有安装 WhatsApp 或 Telegram,则应用程序崩溃:android.content.ActivityNotFoundException: No Activity found to handle Intent act=android.intent.action.VIEW dat=tg://msg?text=My text通过 Telegram 发送 是否可以添加一个检查,如果未安装软件包,则显示带有警告消息的弹出窗口? 完美!非常感谢@cgomezmendez! 似乎shouldOverrideUrlLoading
这种形式已被弃用。是否值得在可能的情况下使用另一个?另外,我认为您忘记转换为 Uri...
知道如何在 Flutter 中实现同样的效果吗?【参考方案2】:
您需要重写WebViewClient的shouldOverrideUrlLoading
方法,您可以在该方法中自行控制链接传输。
因为html links that starts with mailto: whatsapp: and tg: (Telegram).
不是常见的url以“http://”或“https://”开头,所以WebView无法解析到正确的位置,我们应该使用intent来重定向url。
例如:
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;
try
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
catch (Exception e)
Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
return true;
然后将WebViewClient 设置为您的WebView,如下所示:
public class MainActivity extends Activity
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mWebView = (WebView) findViewById(R.id.activity_main_webview);
// Force links and redirects to open in the WebView instead of in a browser
mWebView.setWebViewClient(new WebViewClient()
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
if (url == null || url.startsWith("http://") || url.startsWith("https://")) return false;
try
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
catch (Exception e)
Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
return true;
);
// Enable Javascript
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
// Use remote resource
mWebView.loadUrl("http://myexample.com");
【讨论】:
【参考方案3】:@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url)
if(url.startsWith("tel:") || url.startsWith("whatsapp:"))
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
return false;
将此代码放入您的 mWebView.setWebViewClient(new WebViewClient()。它将完美地适用于所有链接,例如 tel:、whatsapp:、mailto: 等。
【讨论】:
【参考方案4】:这项工作适合我
"webview.setWebViewClient(新的 WebViewClient() 字符串 currentUrl;
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
currentUrl = url;
if (url.startsWith("http") || url.startsWith("https"))
return false;
if (url.startsWith("intent"))
try
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
String fallbackUrl = intent.getStringExtra("browser_fallback_url");
if (fallbackUrl != null)
webview.loadUrl(fallbackUrl);
return true;
catch (URISyntaxException e)
//not an intent uri
return true;//do nothing in other cases
【讨论】:
【参考方案5】:mailto
链接不会加载到您的 webview
中。您已在 shouldOverrideUrlLoading
中像这样检查它并使用 intent
处理它。
public boolean shouldOverrideUrlLoading(WebView view, String url)
if (url.startsWith("mailto:"))
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, message);
startActivity(Intent.createChooser(share, "Title of the dialog the system will open"));
view.reload();
return true;
类似问题Android Webview ERR_UNKNOWN_URL_SCHEME Error
【讨论】:
这仅适用于邮件而不适用于“whatsapp: and tg: (Telegram)”。 @cgomezmendez 这是一个例子.. 我不知道他在 if 循环中想要什么.. 看看逻辑..以上是关于Android WebView err_unknown_url_scheme的主要内容,如果未能解决你的问题,请参考以下文章
android webview-android的webview怎么修改网页字体颜色和背景
android中webview 怎么实现网页加载时显示加载进度?