android webview加載alipays:// scheme失敗的解決方案
在Android應用開發中,WebView常用于加載網頁內容。然而,加載自定義URL scheme(例如alipays://)時,經常遇到net::err_unknown_url_scheme錯誤,即使重寫了shouldOverrideUrlLoading方法,onReceivedError回調中仍可能返回errorCode為-10的錯誤。這是因為WebView默認不支持自定義URL scheme,需要特殊處理。
本文提供有效的解決方案。關鍵在于正確重寫WebViewClient的shouldOverrideUrlLoading方法,攔截并處理自定義URL scheme。
一些開發者可能已嘗試重寫shouldOverrideUrlLoading,但仍未解決問題。這是因為實現方法可能存在錯誤。正確的實現如下:
首先,為WebView設置WebViewClient,并重寫shouldOverrideUrlLoading方法。在這個方法中,判斷URL是否以”alipays://”開頭。如果是,則創建一個Intent,使用Intent.ACTION_VIEW和Uri.parse(url)啟動支付寶應用。如果支付寶應用未安裝,則會捕獲ActivityNotFoundException異常。最后,返回true表示已處理該URL,WebView無需繼續加載。如果不是自定義scheme,則調用父類的shouldOverrideUrlLoading方法,讓WebView使用默認行為。
以下代碼片段演示了正確的實現:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("alipays://")) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); try { startActivity(intent); } catch (ActivityNotFoundException e) { // 處理支付寶應用未安裝的情況,例如提示用戶安裝 Toast.makeText(context, "請安裝支付寶", Toast.LENGTH_SHORT).show(); } return true; } return super.shouldOverrideUrlLoading(view, url); } });
通過以上代碼,WebView就能正確處理alipays:// scheme的URL,避免net::err_unknown_url_scheme錯誤。 可以根據實際需求調整ActivityNotFoundException的異常處理方式,例如向用戶顯示更友好的錯誤提示。 onReceivedError方法在此示例中已省略,因為錯誤處理已在shouldOverrideUrlLoading中完成。