Android WebView 使用Authorization、Cookie
初始化Webview
void initWebView() {
webview = viewBinding.webDetail;
webview.setBackgroundColor(0); //背景透明
//webview.setLayerType(View.LAYER_TYPE_SOFTWARE,null); //关闭硬件加速
WebSettings webSettings = webview.getSettings();//声明WebSettings子类
//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
// 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)
// 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
/**
* 用WebView显示图片,可使用这个参数 设置网页布局类型:
* 1、LayoutAlgorithm.NARROW_COLUMNS : 适应内容大小
* 2、LayoutAlgorithm.SINGLE_COLUMN:适应屏幕,内容将自动缩放
*/
webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//缩放操作
webSettings.setSupportZoom(false); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(false); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(true); //隐藏原生的缩放控件
//其他细节操作
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存
webSettings.setAllowFileAccess(true); //设置可以访问文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
webSettings.setAllowFileAccessFromFileURLs(true); // 允许通过 file url 加载的 Javascript 读取其他的本地文件,包括其他的文件和 http,https 等其他的源,Android 4.1 之前默认是true,在 Android 4.1 及以后默认是false,也就是禁止
webSettings.setAllowUniversalAccessFromFileURLs(true); // 如果此设置是允许,则 setAllowFileAccessFromFileURLs 不起做用
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//这部分代码好像并不会触发
Map<String, String> Headers = request.getRequestHeaders();
for (String value : Headers.values()) {
Log.e("myweb", "Value = " value);
}//
String bearer = "Bearer " httpConfig.access_token;
HashMap headerMap = new HashMap<String, String>();
headerMap.put("Authorization", bearer);
Log.e("myweb", "url:" request.getUrl().toString());
Log.e("myweb", "Authorization :" bearer);
view.loadUrl(request.getUrl().toString(), headerMap);
return super.shouldOverrideUrlLoading(view, request);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//这部分代码好像并不会触发
String bearer = "Bearer " httpConfig.access_token;
HashMap headerMap = new HashMap<String, String>();
headerMap.put("Authorization", bearer);
Log.e("myweb", "url:" url);
Log.e("myweb", "Authorization :" bearer);
view.loadUrl(url, headerMap);
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//设定加载开始的操作
showLoading();//自定义加载框
}
@Override
public void onPageFinished(WebView view, String url) {
//设定加载结束的操作
hideLoading();//自定义加载框
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
Log.e("myweb", "错误url:" request.getUrl().toString());
Log.e("myweb", "错误代码:" error.getErrorCode());
Log.e("myweb", "错误代码:" error.getDescription());
}
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
//该方法处理https请求
handler.proceed(); //表示等待证书响应
// handler.cancel(); //表示挂起连接,为默认方式
// handler.handleMessage(null); //可做其他处理
}
//
@Nullable
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
//请求中携带Authorization的关键二
Log.i("myweb", "请求资源 " request.getUrl());
WebResourceRequest request1 = new WebResourceRequest() {
@Override
public Uri getUrl() {
return request.getUrl();
}
@Override
public boolean isForMainFrame() {
return request.isForMainFrame();
}
@Override
public boolean isRedirect() {
return request.isRedirect();
}
@Override
public boolean hasGesture() {
return request.hasGesture();
}
@Override
public String getMethod() {
return request.getMethod();
}
@Override
public Map<String, String> getRequestHeaders() {
Map<String, String> Headers = request.getRequestHeaders();
String bearer = "Bearer " httpConfig.access_token;
Headers.put("Authorization", bearer);
return Headers;
}
};
for (Map.Entry<String, String> entry : request1.getRequestHeaders().entrySet()) {
Log.w("myweb", entry.getKey() ":" entry.getValue());
}
//请求携带Cookie的关键代码
CookieSyncManager.createInstance(TransactionDetailActivity.this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);
CookieSyncManager.getInstance().sync();
return super.shouldInterceptRequest(view, request1);
}
});
webview.setWebChromeClient(new WebChromeClient() {
//获取网站标题
@Override
public void onReceivedTitle(WebView view, String title) {
Log.i("myweb", "标题:" title);
}
//获取加载进度
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress < 100) {
String progress = newProgress "%";
System.out.println(progress);
} else if (newProgress == 100) {
String progress = newProgress "%";
System.out.println(progress);
}
}
});
}
关键代码:设置拦截连接中的Authorization、Cookie
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
//请求中携带Authorization的关键二
Log.i("myweb", "请求资源 " request.getUrl());
WebResourceRequest request1 = new WebResourceRequest() {
@Override
public Uri getUrl() {
return request.getUrl();
}
@Override
public boolean isForMainFrame() {
return request.isForMainFrame();
}
@Override
public boolean isRedirect() {
return request.isRedirect();
}
@Override
public boolean hasGesture() {
return request.hasGesture();
}
@Override
public String getMethod() {
return request.getMethod();
}
@Override
public Map<String, String> getRequestHeaders() {
Map<String, String> Headers = request.getRequestHeaders();
String bearer = "Bearer " httpConfig.access_token;
Headers.put("Authorization", bearer);
return Headers;
}
};
for (Map.Entry<String, String> entry : request1.getRequestHeaders().entrySet()) {
Log.w("myweb", entry.getKey() ":" entry.getValue());
}
//请求携带Cookie的关键代码
CookieSyncManager.createInstance(TransactionDetailActivity.this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(request.getUrl().toString(), httpConfig.SESSION);
CookieSyncManager.getInstance().sync();
return super.shouldInterceptRequest(view, request1);
}
});
使用
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initWebView();
String bearer = "Bearer " httpConfig.access_token;
Map headerMap = new HashMap<String, String>();
headerMap.put("Authorization", bearer);
String param = getIntent().getStringExtra("param");
String URL = "http://" api.DomainName "/oct/oct_apply?" param;
webview.loadUrl(URL, headerMap);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
if (webview != null) {
webview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
webview.clearHistory();
webview.clearCache(true);
((ViewGroup) webview.getParent()).removeView(webview);
webview.destroy();
webview = null;
}
super.onDestroy();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (webview != null) {
webview.getSettings().setJavaScriptEnabled(true);
webview.reload();
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
if (webview != null)
webview.getSettings().setJavaScriptEnabled(false);
}
@Override
protected void onStart() {
super.onStart();
}
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfagic
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01