日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)

發(fā)布時(shí)間:2023/12/15 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咱們先看下報(bào)錯(cuò)結(jié)果圖:

我這邊是華為榮耀7i手機(jī)才出現(xiàn)這個(gè)情況,總結(jié)得出結(jié)論android6.0以上加載自定義scheme會報(bào)錯(cuò)如下,6.0以下貌似不會

三星和模擬器沒有可以直接加載這個(gè)url

,網(wǎng)頁出來后才出現(xiàn)這個(gè)錯(cuò)誤頁面,原因是加載的這個(gè)url內(nèi)部有JavaScript代碼里面包含自定義scheme代碼導(dǎo)致加載這個(gè)JavaScript代碼里面的自定義scheme的時(shí)候就報(bào)錯(cuò)無法加載。

下面的加載的url地址:

https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg=

看下報(bào)錯(cuò)日志:

[INFO:CONSOLE(62)] "Mixed Content: The page at 'https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg=' was loaded over HTTPS, but requested an insecure resource 'xuntong:getPersonInfo:1:%7B%7D'. This content should also be served over HTTPS.", source: https://do.yunzhijia.com/pub/js/qingjs.js (62)

看最后一句https://do.yunzhijia.com/pub/js/qingjs.js這是無法加載的JavaScript源碼:

?

我先說下我這邊情況,我這邊加載的https網(wǎng)址,但是https網(wǎng)址里面攜帶有自定義的scheme屬性JavaScript文件,android中默認(rèn)加載http和https協(xié)議,其他自定義協(xié)議規(guī)定為不安全默認(rèn)不讓加載。咱們可以看下webview的報(bào)錯(cuò)提示:

chromium: [INFO:CONSOLE(1)] "Mixed Content: The page at 'https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg=' was loaded over HTTPS, but requested an insecure image 'http://do.yunzhijia.com/microblog/filesvr/5d13288c90144e08bfcd6496'. This content should also be served over HTTPS.", source: https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html?p=XT-1088eb69-d338-4779-9298-77d89b8be806&f=ewsqZbAD&success=false&errorMsg= (1)

?

劃重點(diǎn)了:計(jì)解決辦法如下

遇到這種情況我們有兩種解決辦法

第一種:就是在shouldOverrideUrlLoading方法中設(shè)置為外部瀏覽器打開(體驗(yàn)差不推薦)

第二種:就是在shouldOverrideUrlLoading方法中攔截自定義scheme

如下代碼我才用的第二種方案:

webview.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Uri uri = Uri.parse(url);LogUtils.e("打印Scheme", uri.getScheme() + "==" + url);if (!"http".equals(uri.getScheme()) || !"https".equals(uri.getScheme())) {return false;} else {view.loadUrl(url);return false;}}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});webview.loadUrl(url);

咱們再來看下效果:

?

但是當(dāng)我們點(diǎn)擊進(jìn)去JavaScript里面帶有自定義scheme的js頁面發(fā)現(xiàn)點(diǎn)擊是不了,報(bào)了個(gè)錯(cuò):

I/chromium: [INFO:CONSOLE(2)] "tap事件:ours.getNS().saveForm(ours.getNS().afterSaveForm)不能被執(zhí)行,", source: https://www.formtalk.net/res_common/ours_phone_form.min.js?V=1.1.2.6 (2) I/chromium: [INFO:CONSOLE(2)] "TypeError: Cannot read property 'getItem' of null", source: https://www.formtalk.net/res_common/ours_phone_form.min.js?V=1.1.2.6 (2)

說的是JavaScript里面的js方法不能被執(zhí)行,什么原因呢?

搜了下找到了個(gè)可行的方法

//允許android調(diào)用javascript webSettings.setDomStorageEnabled(true);

再此感謝原博主博主鏈接

然后點(diǎn)擊JavaScript頁面生效了。

?

?

最后貼出完整代碼:

package com.yhsh.wallet.ui;import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.DisplayMetrics; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView;import com.yhsh.mobile.basic.util.LogUtils; import com.yhsh.mobile.common.base.BaseActivity; import com.yhsh.mobile.uiwidget.widget.CustomWebview;/*** 暫定為集團(tuán)理財(cái)** @author DELL*/ public class H5Activity extends BaseActivity {@Overridepublic int getLayoutResId() {return com.yhsh.mobile.login.R.layout.agreement_dialog;}@Overridepublic void initView(Bundle savedInstanceState) {String title = getIntent().getStringExtra("title");String url = getIntent().getStringExtra("url");String welcome = getIntent().getStringExtra("welcome");Toolbar toolbar = findViewById(com.yhsh.mobile.login.R.id.toolbar);TextView tvTitle = findViewById(com.yhsh.mobile.login.R.id.toolbar_title);tvTitle.setText(title);CustomWebview wvAgreement = findViewById(com.yhsh.mobile.login.R.id.wv_agreement);setSupportToolbar(toolbar, v -> {if (wvAgreement.canGoBack()) {wvAgreement.goBack();} else {if (!TextUtils.isEmpty(welcome)) {//當(dāng)是歡迎頁面進(jìn)來的時(shí)候,點(diǎn)擊返回直接進(jìn)入首頁startActivity(new Intent(this, SplashActivity.class));}finish();}});WebSettings webSettings = wvAgreement.getSettings();webSettings.setSupportZoom(true);webSettings.setJavaScriptEnabled(true);//允許android調(diào)用javascriptwebSettings.setDomStorageEnabled(true);webSettings.setJavaScriptCanOpenWindowsAutomatically(true);webSettings.setBuiltInZoomControls(true);webSettings.setAllowFileAccess(true);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {webSettings.setAllowFileAccessFromFileURLs(true);webSettings.setAllowUniversalAccessFromFileURLs(true);}webSettings.setUseWideViewPort(true);webSettings.setLoadWithOverviewMode(true);webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);}DisplayMetrics metrics = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);int mDensity = metrics.densityDpi;if (mDensity == 240) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);} else if (mDensity == 160) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.MEDIUM);} else if (mDensity == 120) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.CLOSE);} else if (mDensity == DisplayMetrics.DENSITY_XHIGH) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);} else if (mDensity == DisplayMetrics.DENSITY_TV) {webSettings.setDefaultZoom(WebSettings.ZoomDensity.FAR);}wvAgreement.setWebViewClient(new WebViewClient() {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Uri uri = Uri.parse(url);LogUtils.e("打印Scheme", uri.getScheme() + "==" + url);if (!"http".equals(uri.getScheme()) || !"https".equals(uri.getScheme())) {return false;} else {view.loadUrl(url);return false;}}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});wvAgreement.loadUrl(url);} }

?

?

最終結(jié)論經(jīng)過我后期代碼測試發(fā)現(xiàn)最終上面問題解決辦法:

?

說簡單點(diǎn)直接設(shè)置setWebViewClient重寫shouldOverrideUrlLoading方法即可

@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return super.shouldOverrideUrlLoading(view, url);}

請看最終代碼如下:直接用下面這個(gè)原生簡單的webview就可以正常加載自定義scheme和JS事件點(diǎn)擊了

package com.xiayiye.mytestapp;import android.app.Activity; import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.TextView;public class MainActivity extends Activity {private WebView wvInternetPage;private TextView tvTittle;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wvInternetPage = findViewById(R.id.wv_internet_page);tvTittle = findViewById(R.id.tv_tittle);WebViewOption();}private void WebViewOption() {WebSettings settings = wvInternetPage.getSettings();settings.setJavaScriptEnabled(true);//允許打開js新窗口settings.setJavaScriptCanOpenWindowsAutomatically(true);settings.setDomStorageEnabled(true);wvInternetPage.setWebViewClient(new MyWebViewClient());wvInternetPage.loadUrl("https://www.yunzhijia.com/pubacc/public/data/19/06/26/ewsqZbAD.html"); // wvInternetPage.loadUrl("https://www.baidu.com");}private class MyWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {return super.shouldOverrideUrlLoading(view, url);}@Overridepublic void onPageFinished(WebView view, String url) {tvTittle.setText(view.getTitle());super.onPageFinished(view, url);}}@Overridepublic void onBackPressed() {if (wvInternetPage.canGoBack()) {wvInternetPage.goBack();return;}super.onBackPressed();} }

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Android开发之WebView加载自定义scheme报错net::ERR_UNKNOWN_URL_SCHEME(附带源码标题下面可点击下载)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。