android webview加載支付寶Scheme失敗解決方案
在Android開發中,WebView加載包含自定義URL Scheme(例如支付寶的alipays://)的鏈接時,常常遇到net::err_unknown_url_scheme錯誤,導致頁面無法正常加載,并在onReceivedError回調中返回錯誤碼-10。即使重寫了shouldOverrideUrlLoading方法,問題依然存在。這是因為WebView默認不支持處理自定義URL Scheme。
本文提供有效的解決方案。關鍵在于正確重寫WebViewClient的shouldOverrideUrlLoading方法,并使用Intent啟動相應應用處理自定義URL Scheme。
許多開發者嘗試重寫shouldOverrideUrlLoading方法卻未能解決問題,原因可能是方法實現存在缺陷。以下是一個經過驗證的正確實現:
首先,為WebView設置WebViewClient:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("alipays://")) { // 處理支付寶Scheme Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); try { startActivity(intent); } catch (ActivityNotFoundException e) { // 處理支付寶客戶端未安裝的情況 e.printStackTrace(); // 可在此處提示用戶安裝支付寶客戶端 } return true; // 攔截URL,阻止WebView加載 } // 其他URL,使用WebView默認行為 return super.shouldOverrideUrlLoading(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); // 處理加載錯誤,例如顯示錯誤提示 } });
代碼首先檢查URL是否以”alipays://”開頭。如果是,則創建Intent,使用ACTION_VIEW動作和解析后的URI啟動支付寶應用。try-catch塊處理支付寶應用未安裝的情況,避免程序崩潰。return true表示已處理該URL,WebView無需加載。 如果不是支付寶Scheme,則調用父類的shouldOverrideUrlLoading方法,讓WebView處理其他URL。onReceivedError方法用于處理加載錯誤,開發者可在此添加錯誤處理邏輯。
通過此方法,即可正確攔截和處理支付寶自定義URL Scheme,解決net::err_unknown_url_scheme錯誤。