android webview加載支付寶鏈接失敗:net::ERR_UNKNOWN_URL_SCHEME問題詳解及解決方案
在Android開發中,使用WebView加載包含自定義URL scheme的鏈接(例如支付寶的alipays://)時,常常遇到net::ERR_UNKNOWN_URL_SCHEME錯誤,導致頁面無法正常加載。即使重寫了shouldOverrideUrlLoading方法,仍然可能在onReceivedError回調中收到errorCode為-10的錯誤。這是因為Android WebView默認不支持自定義URL scheme,需要開發者手動處理。
根本原因在于WebView無法識別和處理alipays://等自定義協議。僅僅重寫shouldOverrideUrlLoading方法不足以解決問題,關鍵在于正確攔截并處理該自定義協議鏈接。
解決方案:使用Intent攔截并處理自定義URL scheme
通過重寫WebViewClient的shouldOverrideUrlLoading方法,攔截包含alipays://的URL,并使用Intent將其交給相應的應用程序處理。
以下代碼片段演示了如何實現:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("alipays://")) { // 處理自定義URL scheme Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); try { startActivity(intent); } catch (ActivityNotFoundException e) { // 設備未安裝可處理該URL的應用 // 可在此處添加錯誤處理邏輯,例如提示用戶安裝支付寶 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.parse(url)生成的Uri對象,嘗試啟動相應的Activity處理支付寶鏈接。try-catch塊處理ActivityNotFoundException,即設備未安裝可處理該URL scheme的應用的情況。return true表示已處理該URL,WebView不再加載。如果不是自定義scheme,則調用父類的shouldOverrideUrlLoading方法,使用WebView默認行為。
通過此方法,即可正確攔截和處理支付寶支付鏈接,避免net::ERR_UNKNOWN_URL_SCHEME錯誤。 onReceivedError方法中的錯誤處理邏輯可根據實際需求調整。