❶ WebView返回時停留在第一層界面,重復刷新此界面
WebView詳細解析:
https://www.jianshu.com/p/b8526e6b7760
解決方法:
boolean canGoBack():用來確認WebView里是否還有可回退的歷史記錄。通常我們會在WebView里重寫返回鍵的點擊事件,通過該方法判斷WebView里是否還有歷史記錄,若有則返回上一頁。
@Override
override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
if (interesWeb.canGoBack()) {
interesWeb.goBack();
return true;
}else {
finish();
}
return super.onKeyDown(keyCode, event);
}
此方法可以實現逐級返回上層webview界面,但是如果WebView的第一個界面只有在首次進入時顯示的話,就會造成後續返回時,一直停留在當前界面無法退出這個Activity界面(我的使用場景如此)
onKeyDown方法還會造成一個問題,就是在webview界面的時候,如果當前這個界面需要播放音頻,你通過音量鍵調節音量的時候,會導致界面後退。
替換方案:
override fun onBackPressed() {
if (interesWeb.canGoBackOrForward(-2)) {
interesWeb.goBack();
}else {
finish();
}
}
可以通過onBackPressed()來替代onKeyDown方法。canGoBackOrForward()替換canGoBack()方法。
boolean canGoBackOrForward(int steps):以當前的頁面為起始點,用來確認WebView的歷史記錄是否足以後退或前進給定的步數,扒輪畢正數為前進,負數為後退。(詳細解釋可以看上面的鏈接: https://www.jianshu.com/p/b8526e6b7760 )
同時,在使用原生的webView進行頁面載入時,需要注意相春芹關屬性的桐察配置。
參考:
1、 android WebView 詳解
2、 WebView·開車指南
3、 Android WebView 常用API參考手冊
❷ 安卓WebView詳解 (三)--Webview的API及說明
android.view.ViewGroup
↳ android.widget.AbsoluteLayout
↳android.webkit.WebView
用於安卓顯示網頁內容
一、查找網頁中匹配的字元串
1、void findAllAsync ( String find) 查滾悄找網頁亂搭中匹配的字元串且高亮顯示,此方法為非同步方法,對應的結果會在 WebView.FindListener中回調
2、void findNext (boolean forward) 上下查找匹配字元串
3、void addjavascriptInterface ( Object object, String name) 將提供的Java對象注入到此WebView中
4、void autofill( SparseArray < AutofillValue > values) 自動填充該視圖中虛擬子級的內容
5、boolean canGoBack () 獲取此WebView是否具有後退歷史記錄項。
6、boolean canGoBackOrForward (int steps) 獲取頁面是大陪渣否可以前進或後退給定數量的步驟。
7、boolean canGoForward () 獲取此WebView是否具有轉發歷史記錄項。
8、void clearCache (boolean includeDiskFiles) 清除緩存
9、void clearClientCertPreferences ( Runnable onCleared) 清除響應於繼續/取消客戶端證書請求而存儲的客戶端證書首選項。
10、void clearFormData() 從當前關注的表單欄位中刪除自動完成彈出窗口(如果存在)。
11、void clearHistory () 告訴此WebView清除其內部後退/前進列表
❸ Android WebView 調用系統拍照和相冊
由於業務需要,APP內嵌H5,需要調去系統相冊和拍照,網上找了點資料,整理一下,供大家參考:
private static final int REQUEST_CAMERA =1;
private static final int REQUEST_CHOOSE =2;
private ValueCallbackmUploadMessage;
private ;
private UricameraUri;
//5.0以後的方法
webView.setWebChromeClient(new WebChromeClient() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
if (mUploadMessagesAboveL !=null) {
mUploadMessagesAboveL.onReceiveValue(null);
mUploadMessagesAboveL =null;
}else {
mUploadMessagesAboveL = filePathCallback;
selectImage();
}
return true;
}
});
//選擇圖片和拍照,對應的string文件,可以自己寫死:拍照,相冊,取消
private void selectImage() {
ActionSheet.createBuilder(this, getSupportFragmentManager()).
setOtherButtonTitles(new String[]{getResources().getString(R.string.common_tip_photos), getResources().getString(R.string.common_picture)}).
setCancelButtonTitle(getResources().getString(R.string.common_cancel)).setCancelableOnTouchOutside(true).setListener(new ActionSheet.ActionSheetListener() {
public void onDismiss(ActionSheet actionSheet, boolean isCancel) {
if (mUploadMessage !=null) {
mUploadMessage.onReceiveValue(null);
mUploadMessage =null;
}
if (mUploadMessagesAboveL !=null) {
mUploadMessagesAboveL.onReceiveValue(null);
mUploadMessagesAboveL =null;
}
actionSheet.dismiss();
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void onOtherButtonClick(ActionSheet actionSheet, int index) {
switch (index) {
case 0:
chosePicture();
break;
case 1:
setRequestCamera();
}
}
}).show();
}
//拍照,添加許可權申請 這個可以自己寫下,我這邊是項目中寫好的,直接拿過來用了
public void setRequestCamera() {
permissionsBuilder =new YXTPermissionsBuilder.Builder(this)
.setOnGrantedListener((requestCode, perms) -> {
openCamera();
})
.setRationale4NeverAskAgain(LanguageUtils.isEnglish() ? String.format(getString(R.string.permission_tips), getString(R.string.common_camera), getString(R.string.app_name), getString(R.string.app_name)) :
String.format(getString(R.string.permission_tips), getString(R.string.app_name), getString(R.string.common_camera), getString(R.string.app_name)))
//必需
.setRequestCode(ConstantsData.GET_CAMERA)
.build();
permissionsBuilder.requestPermissions(Manifest.permission.CAMERA);
}
/**
* 本地相冊選擇圖片
*/
private void chosePicture() {
Intent innerIntent =new Intent(Intent.ACTION_GET_CONTENT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
innerIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(innerIntent, null);
startActivityForResult(wrapperIntent, REQUEST_CHOOSE);
}
/**
* 打開照相機
*/
private void openCamera() {
Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
String imagePaths = Environment.getExternalStorageDirectory().getPath() +"/pbccrc/Images/" + (System.currentTimeMillis() +".jpg");
// 必須確保文件夾路徑存在,否則拍照後無法完成回調
File vFile =new File(imagePaths);
if (!vFile.exists()) {
File vDirPath = vFile.getParentFile();
vDirPath.mkdirs();
}else {
if (vFile.exists()) {
vFile.delete();
}
}
cameraUri = FileProvider.getUriForFile(
this,
getPackageName() +".fileprovider",
vFile);
intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraUri);
startActivityForResult(intent, REQUEST_CAMERA);
}
/**
* 選擇照片後結束
*
* @param data
*/
private UriafterChosePic(Intent data) {
if (data !=null) {
final String path = data.getData().getPath();
if (path !=null && (path.endsWith(".png") || path.endsWith(".PNG") || path.endsWith(".jpg") || path.endsWith(".JPG"))) {
return data.getData();
}else {
Toast.makeText(this, "上傳的圖片僅支持png或jpg格式", Toast.LENGTH_SHORT).show();
}
}
return null;
}
/**
* 返迴文件選擇
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (mUploadMessagesAboveL !=null) {
onActivityResultAboveL(requestCode, resultCode, intent);
}
if (mUploadMessage ==null)return;
Uri uri =null;
if (requestCode ==REQUEST_CAMERA && resultCode ==RESULT_OK) {
uri =cameraUri;
Log.e("onActivityResult: " + uri.toString());
}
if (requestCode ==REQUEST_CHOOSE && resultCode ==RESULT_OK) {
uri = afterChosePic(intent);
}
mUploadMessage.onReceiveValue(uri);
mUploadMessage =null;
super.onActivityResult(requestCode, resultCode, intent);
}
/**
* 5.0以後機型 返迴文件選擇
*
* @param requestCode
* @param resultCode
* @param data
*/
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
Uri[] results =null;
if (requestCode ==REQUEST_CAMERA && resultCode ==RESULT_OK) {
results =new Uri[]{cameraUri};
}
if (requestCode ==REQUEST_CHOOSE && resultCode ==RESULT_OK) {
if (data !=null) {
String dataString = data.getDataString();
if (dataString !=null)
results =new Uri[]{Uri.parse(dataString)};
}
}
mUploadMessagesAboveL.onReceiveValue(results);
mUploadMessagesAboveL =null;
return;
}
基本都可以拿去用了,希望有幫助
❹ 安卓7.0中多線程web view開啟有什麼用
WebView是一個基於webkit引擎、展現web頁面的控制項。
作用:
1、顯示和渲染Web頁面,直接使用html文件(網路上或本地assets中)作布局,可和JavaScript交互調用。
2、WebView控制項功能強大,除了具有一般View的屬性和設置外,還可以對url請求、頁面載入、渲染、頁面交互進行強大的處理。
❺ Android系統 WebView是什麼有什麼用
現在越來越多的APP都內置了Web網頁去載入視圖,也就是我們常說的Hybrid APP混合應用,市場上很多平台都是這樣做的,比如我們經常使用的淘寶、京東等電商平台。這些是如何實現的呢?在我們Android中有一個WebView組件,它就可以實現此類功能。它是Android中的原生UI控制項,主要用於在APP應用中方便地訪問遠程網頁或本地HTML資源,同時WebView也在Android中充當Java代碼和JS代碼之間交互的橋梁,實際上也可以將WebView看做一個功能最小化的瀏覽器。下面我們一起來看看WebView的一些常用的使用方法。
WebView是Android系統提供的一個能顯示網頁的系統控制項,它是一個特殊的View,同時也是一個ViewGroup,可以有很多其他子View。在Android 4.4以下(不包含4.4)系統WebView底層實現是採用WebKit內核,而在Android 4.4及其以上Google採用了Chromium內核作為系統WebView的底層內核支持。在這一變化中Android提供的WebView相關API並沒有發生較大變化,在4.4上也兼容低版本的API並且引進了少部分API。這里簡單介紹下基於Chromium的WebView和基於WebKit的WebView之間的差異,基於Chromium的Webview提供了更廣的HTML5、CSS3、JavaScript支持,在Android系統版本5.0上基於Chromium 37,WebView提供了絕大多數的HTML5特性支持,除此之外Chromium也支持遠程調試(Chrome DevTools)。WebKit JavaScript引起採用WebCore JavaScript在Android 4.4上換成了V8能直接提升JavaScript性能。
二、作用
1、顯示和渲染Web頁面
2、使用html文件(網路上或本地assets中)作為布局
3、可與JavaScript交互調用
註: WebView控制項功能強大,除了具有一般View的屬性和設置外,還可以對Url請求、頁面載入、渲染、頁面交互進行強大的處理。
❻ app中的webview是什麼如何理解
當你上網閱讀東西時,我們一般會選擇一款瀏覽器,比如Chrome、火狐、safari、IE或者Edge。你可能不知道這些瀏覽器之間有一些競爭,而競爭的主要形式就是WebView。
WebView的定義
什麼是WebView呢?它是本地應用程序內嵌的一個瀏覽器!這句話有兩處需要搞清楚!
上面是火狐的一個頁面,紅色區域可以認為是WebView,它擁有渲染引擎,可以通過http/https請求載入內容,載入回來的代碼就可以被執行和渲染出來。紅色區域以上的部分就是瀏覽器本地的UI組件。
移動端app中WebView的特點
我們經常把h5頁面內嵌入app中喊御,這種就是混合型的app,除了渲染頁面本身的功能外,頁面中的js還有能力調用app系統介面的,比如某些彈窗、分享等,這些區別對用戶來說都是無感知的。
在普通瀏覽器中是沒有這個能力的,至少瀏覽器沒有開放這些api。
WebView中的渲染引擎 WebView帶來的好處 總結
可以認為WebView就是瀏覽器,只是在不同平台長相和能力有所不同!
App中的WebView可以理解為一個瀏覽器,因為它具有基本的瀏覽器能力,包括載入網頁,js控制等;
首先,看一下安卓端webview的一些介紹。
是一個基於引擎、展現頁面的控制項。可以顯示和渲染Web頁面,與JS交互,也可以和原生代碼交互。
然後可以參考下各大APP,如淘寶、支付寶、京東、美團等;這里截取幾張圖示例下。
(截圖來自支付寶、淘寶),上面2個頁面都是在app內內嵌了定製坦滲棚的webview組件,用於展示一些額外的信息(非組件化的),靈活性高;
其次,webview作為app中重要的組成部分,如混合APP, 純H5 App;
最後,題主若還有疑問,歡迎@我。
WebView(網路視圖)能載入顯示網頁,可以將其視為一個瀏覽器。
在Android手機中,網頁的解析和顯示網頁的能力是由webkit內核實現的。
(如chrome瀏覽器使用的是webkit內核,現在,webkit被內置到了android系統中)
webview對網頁處理也是交給強大的webkit做的
webview在android SDK(原生)中:
封裝為一個叫做WebView組件,通過這個組件可以在app中顯示html+css+js,當然也就可以顯示一個遠程url,比如用它打開網路首頁是可以的。
可以理解為:android開發中的一個activity里使用了webview組件,並打開了一個html頁面呈現給用戶。
其中「activity」是android原生開發時的「一張頁面」,app的所謂跳轉到不同「頁」是在activity中跳來跳去,activity是java的一個類,布局則是使用xml(如果沒做過原生android開發就這么理解就行)
webview在mui app框架開發中:
在mui開發中,這些webview就是一張一張的網頁。
這些網頁是webview對象,其操作方法被封讓則裝在html5+的plus.webview對象中
webview本身只是個瀏覽器效果組件,切換即使網頁之間的跳轉,理論上不可能像原生的activity中切換一樣流暢,本身也不會有什麼動畫。
還好,mui的開發組,dcloud(數字天堂)和他們的html5+中國產業聯盟(社區)實現了webview切換的動畫效果,他們把這些webview映射到了真正的java webview,調用的也是原生的activity切換動畫,從而使得webview切換也可以像原生app activity一樣切換的效果!圖一(簡約圖)原生開發和mui的hybrid模式區別圖:(圖二)希望幫助到你![玫瑰]
❼ Android WebView 在開發過程中有哪些坑
WebViewClient.onPageFinished()。你永遠無法確定當WebView調用這個方法的時候,網頁內容是否真的載入完畢了。當前正在載入的網頁產生跳轉的時候這個方法禪虧可能會被多次調用,StackOverflow上有比較具體的解釋(How to listen for a Webview finishing loading a URL in Android?), 但其中列舉的解決方法並不完美。所以當你的WebView需要載入各種各樣的網頁並且需要在頁面載入完成時採取一些操作的話,可能WebChromeClient.onProgressChanged()比WebViewClient.onPageFinished()都要靠譜一些。
WebView後台耗電問題。當你的程序調用了WebView載入網頁,WebView會自己開啟一些線程(?),如果你沒有正確地將WebView銷毀帆襲耐的話,這些殘余的線程(?)會一直在後台運行,由此導致你的應用程序耗電量居高不下。對此我採用的處理方式比較偷懶,簡單又粗暴(不建議),即在Activity.onDestroy()中直接調用System.exit(0),使得應用程序完全被移出虛擬機,這樣就不會有任何問題了。
切換WebView閃屏問題。如果你需要在同一個ViewGroup中來回切換不同的WebView(包含了不同的網頁內容)的話,你就會發現閃屏是不可避免的。這態春應該是Android硬體加速的Bug,如果關閉硬體加速這種情況會好很多,但無法獲得很好的瀏覽體驗,你會感覺網頁滑動的時候一卡一卡的,不跟手。
數據積累問題。開啟緩存什麼的有利於網頁的瀏覽體驗,但你會發現即使是清除了必要的內容,比如Cache、Cookie、Form Data、History、Password等等東西,你的應用程序所佔用的存儲空間還是會越來越大,到最後只好手動到系統設置的應用信息界面里清除數據了 :(
滾動條問題。Android System WebView的橫向滾動條真是好粗的有木有
❽ 關於Android WebView的那些事
[TOC]
Webkit是一個開源瀏覽器項目,其中,對Android開發者來說,或多或少的都有些接觸。 在應用層來看,最經常使用無非這么幾個類:WebView(Android中最為復雜,也是最為簡單的一個View,繼承自AbsoluteLayout),WebViewClient、WebChromeClient(作為回調控制類)、WebSettings(進行設置項的配置)等;Webkit內部包含了網路請求、頁面渲染、Js引擎等等。在Android4.4之前的版本中,系統使用的是Webkit內核,其後,切換到Google的Chromium內核。本文主要介紹的是在Android中,如何使用Webkit進行H5頁面的展現,以及常見問題的分析手段。
下面的內容抄自網路 & 亂七八糟的地方,簡單了解一下。
<b><i>前面都是吹牛逼的信息,如何使用Webkit來更好的搬磚? 且聽如下分解</i></b>
XML布局中丟一個 <WebView> 標簽,然後再 Activity 或者 Fragment 中 findViewById ,進而 loadUrl ,一般也沒人這么簡單的用,除非寫Demo。很簡單,它就是一個Layout,提供了一個調用載入頁面的介面,不寫範例了,能看到這篇文章的都看過Google的API說明。
主要涉及到WebView和WebSettings兩個類。
例如:
其實就是WebView的父類ViewGroup和View的方法,不多說了。不過需要注意的是,不是所有的View或ViewGroup的方法對WebView都生效。
列舉幾類常用的,幾乎所有App的 WebView 都會設置的屬性:
</br>
如何處理頁面跳轉以及特殊 Scheme
這個回調可以說是最容易出問題的一個回調,表示什麼? 字面意思,讓你重寫這個URL 的loading,比如點擊html打電話的一個 <a href=「tel:110」> 標簽,作為一個有節操、有責任心的瀏覽器,你需要處理 H5常用的幾個Scheme :
除此之外,還有各個應用自定義的scheme ,舉個例子,支付寶的支付Scheme : alipay: 。 這里的返回值,就代表你有沒有能力處理這個url,沒有的話Webkit就默認處理了。
需要注意的是,這個回調的觸發的絕大多數情況是點擊頁面的 <a href="xxxx"> a標簽,在Android中 loadUrl("http://www..com") ,是不會回調的,為什麼不會回調,各位自行理解吧。
超鏈接 <a> 標簽怎麼寫: 點我
特別說下窗口常見的兩種打開方式:
針對單頁模式的WebView框架(所有的html窗口均使用同一個WebView實例),不需要關注target的。
如果作為一個成熟的瀏覽器框架的話,是需要支持Html、JavaScript使用新窗口打開頁面,需要實現如下回調:
還有一個相關設置項: WebSettings.
此時,系統將不會再回調 shouldOverrideUrlLoading 。新窗口邏輯的具體實現機制,可以參考系統browser實現邏輯。
<b> 這里有個坑 </b>
Android 4.4版本 ,如果實現了onCreateWindow,也就是說頁面 <a> 標簽是這么寫的: <a href="http://www..com" target="_blank"> ,點擊此鏈接打開的新WebView窗口,此窗口中的url點擊,是不會觸發 shouldOverrideUrlLoading 。 這是剛替換成Chrominum內核出的一個bug。本人並沒在新版本上驗證是否已經修復。
另外,根據不同的Rom,底層實現是不一樣的,有的ROM會幫你處理各種調起scheme,也就是startActivity,有的ROM點一個url,就會拋一個intent出來,讓用戶選擇系統瀏覽器進行載入。
系統默認,提供了一個介面:
有什麼安全隱患呢?
戳這里
如果不知道Js怎麼寫, 請戳我
用PC的截圖意思一下,看出區別了吧。 這里確定、取消點擊以後就得調用 JsResult、JsPromptResult 的 confirm或者cancel。
因為安全問題,大一些的App Native與Js通信都不再用 WebView.addJavascriptInterface(Object) 了,都改用JsPrompt,因為JsPrompt中有message、有JsPromptResult可以返回給Js一些信息,所以橋選中了JsPrompt,另一個備選方案是JsConsole。
大體有這么幾種方式進行傳遞
具體方案實現時,多方面考慮使用何種方式。
還有一個比較牛逼的
系統源碼中均有方法注釋,怎麼用自己看吧。
那麼問題來了
查了下,只有這兩個相關的:
WebBackForwardList BackForwardList()
void clearHistory()
系統提供的關於歷史記錄的操作並不多,因為,不支持單條刪除啊,啊啊啊!
WebViewClient中,還有一個相關callback,當系統更新歷史記錄時回調:
void doUpdateVisitedHistory(WebView view, String url, boolean isReload)
<b>相關問題分析法:歷史棧回退錯誤的定位</b>
絕大多數回退錯誤是由於介面調用、回調中邏輯執行時序錯誤。
定位方法:利用 BackForwardList , doUpdateVisitedHistory 兩個介面在 loadUrl、onPageStart、onPageFinish 以及邏輯相關的地方調用,打log,查看歷史棧,這里注意下由於loarl是非同步的,需要考慮是否加延遲等等保證調用時機的准確。
本人曾經遇到一個問題:在WebChromeClient中的 JsPrompt回調中,直接進行WebView.goBack操作,結果發現WebView確實回退到上一個頁面,但是BackFowardList當前頁面的index未更新的問題,具體見另一個篇blog。
網上有很多關於WebView內存泄露的討論,據傳,老版本的WebView在展示大量圖片的時候,即使 WebView.destory() WebView=null ,也不會銷毀。
在新版本上,實際測試結果:compileSDKVersion 23 不會泄露。
一般,我們如何銷毀WebView比較保險?
這個問題好大。。。
暫時不介紹,另起blog進行說明。
解決方案:
實現回調 void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
首先,提幾個需要注意的點:
個人歸納總結幾點:
step1 進入開發者模式,勾選「顯示布局邊界」;
step 2,回到你想查看的界面; step 3 假如內容區只有一層基本就是H5 WebView的,多個層級,就是Native。
看到左右圖的差異了吧。
還有另一種方法,RD屌絲們看這里,特別說明,這種方法不太適合瀏覽器。 (自有內核,可能會不準確)
好了,就介紹到這里,零零散散的幾年前寫的文章,第一篇blog,如有不對的地方,還懇請大家指正。
❾ android開發中,webview常用於顯示網頁或h5頁面,一個遇到跨域方面的坑。
1.跨域cookie讀取
什麼是跨域,簡單的說就是不同的域名,我們都知道在pc上我們用瀏覽器訪問網址,不同的網址都會在本地存儲一些cookie信息,這樣就可以實現比如自扒核棚動登錄等功能,在pc上不同域名是不能相互讀取其他域下的cookie信息的(非web專業開發人員,如果理解有誤,歡迎指出)。
但是在 android 上在api 23之前,是可以跨域讀取cookie的,比如A域寫入一個userId的cookie,B域可以讀取該值。但是在23時,系統將該值設置成了false,不再讓跨域讀取了。如果你的應用有跨域讀取需求,怎麼辦?可以採用如下方式進行開啟:
/*** 設置跨域cookie讀取*/
public final void setAcceptThirdPartyCookies() {
//target 23 default false, so manual set true
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { CookieManager.getInstance().setAcceptThirdPartyCookies(webView,true);
}
}
2.http/https混合載入
在現階段,很多網站都改成了https進行訪問,https可以提升訪問網站的安全性,防止信息被竊取,如果所有的網頁都是https且網頁內的鏈接也是都是https,那就沒春則有混合載入(文本區域https,圖片文件http載入)的問題了。但是很多資源現階段還沒有改變成https訪問,往往頁面都嵌入了http的鏈接。這種混合網頁如果不進行處理,直接載入是會出現錯誤的。怎麼解決這個問題?
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
這也是一個分版本氏缺的函數,在api23之前,默認是可以混合載入的,但是在23時,默認值改成了MIXED_CONTENT_NEVER_ALLOW,因此如果你有混合載入的需求,設置setMixedContentMode為MIXED_CONTENT_ALWAYS_ALLOW。
3.無法解決跨域訪問問題,可以嘗試給webview設置如下配置,已解決該問題;
if (Build.VERSION.SDK_INT >= 16) {
Class clazz =webView.getSettings().getClass();
Method method = clazz.getMethod("", boolean.class);
if (method != null) {
method.invoke(webView.getSettings(), true);
}
}
} catch (IllegalArgumentExceptione) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
❿ Android WebView 在開發過程中有哪些坑
WebView功能強大,應用廣泛,一方面它增強了APP的上網體驗,讓APP功能更多樣化,另一方面它也引入了很多的安全問題。
已知的WebView任意代碼執行漏洞有4個。
Java代碼和網頁中的JavaScript腳本扮猜交互,在WebView控制項中實現了addJavascriptInterface介面。
網頁中的js腳本可以利用介面「myjs」調用App中的Java代碼,而Java對象繼承關系會導致很多Public的函數及getClass函數都可以在JS中被訪問,結合Java的反射機歲兄制,攻擊者還可以獲得系統類的函數,進而廳雀型可以進行任意代碼執行。