感谢大神:https://github.com/Justson/AgentWeb
AgentWeb 介绍
AgentWeb 是一个高度封装的 Android WebView ,简单易用 , 带有进度条 、 支持文件上传 、 下载 、 简化 Javascript 通信 、 链式调用 、 加强 Web 安全的库 。让你几行代码集成一个小型浏览器在你的应用 。更多使用请参照上面的 sample 。 下载 AgentWeb
前言
WebView 可谓是每个应用必备的一个控件了 ,但是它不是一个完善的控件 , 比如说自身就不支持下载和上传文件以及全屏视频等等 , 在这些地方或多或少都会踩到坑 ,AgentWeb 就是为了帮用户减少没必要踩的坑 , 让用户轻轻松松一句话就完成所有 Web 页面的渲染与交互 。
AgentWeb 功能
- 支持进度条以及自定义进度条
- 支持文件下载
- 支持文件下载断点续传
- 支持下载通知形式提示进度
- 简化 Javascript 通信
- 支持 Android 4.4 Kitkat 以及其他版本文件上传
- 支持注入 Cookies
- 加强 Web 安全
- 支持全屏播放视频
- 兼容低版本 Js 安全通信
- 更省电 。
- 支持调起微信支付
- 支持调起支付宝(请参照sample)
- 默认支持定位
为什么要使用 AgentWeb ?
Web | 文件下载 | 文件上传 | Js 通信 | 断点续传 | 使用简易度 | 进度条 | 线程安全 | 全屏视频 |
---|---|---|---|---|---|---|---|---|
WebView | 不支持 | 不支持 | 支持 | 不支持 | 麻烦 | 没有 | 不安全 | 不支持 |
AgentWeb | 支持 | 支持 | 更简洁 | 支持 | 简洁 | 有 | 安全 | 支持 |
引入
-
Gradle
compile 'com.just.agentweb:agentweb:1.2.3'
-
Maven
<dependency> <groupId>com.just.agentweb</groupId> <artifactId>agentweb</artifactId> <version>1.2.3</version> <type>pom</type> </dependency>
使用
为什么说它简洁易用吗 ? 下面京东效果图 , 只需一句话 !
mAgentWeb = AgentWeb.with(this)//传入Activity
.setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))//传入AgentWeb 的父控件 ,如果父控件为 RelativeLayout , 那么第二参数需要传入 RelativeLayout.LayoutParams
.useDefaultIndicator()// 使用默认进度条
.defaultProgressBarColor() // 使用默认进度条颜色
.setReceivedTitleCallback(mCallback) //设置 Web 页面的 title 回调
.createAgentWeb()//
.ready()
.go("http://www.jd.com");
里面没有一句 Setting , 甚至连 WebChromeClient 都不用配置就有进度条 。
效果图
<a href="https://github.com/Justson/AgentWeb/raw/master/img/jd.png">-
调用 Javascript 方法拼接太麻烦 ? 请看 。
//Javascript 方法
function callByAndroid(){
console.log("callByAndroid")
}
//Android 端
mAgentWeb.getJsEntraceAccess().quickCallJs("callByAndroid");
//结果
consoleMessage:callByAndroid lineNumber:27
-
Javascript 调 Java ?
//Android 端 , AndroidInterface 是一个注入类 ,里面有一个无参数方法:callAndroid
mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(mAgentWeb,this));
//在 Js 里就能通过
window.android.callAndroid() //调用 Java 层的 AndroidInterface 类里 callAndroid 方法
-
事件处理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (mAgentWeb.handleKeyEvent(keyCode, event)) {
return true;
}
return super.onKeyDown(keyCode, event);
}
-
跟随 Activity Or Fragment 生命周期 , 释放 CPU 更省电 。
@Override
protected void onPause() {
mAgentWeb.getWebLifeCycle().onPause();
super.onPause();
}
@Override
protected void onResume() {
mAgentWeb.getWebLifeCycle().onResume();
super.onResume();
}
-
文件上传处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mAgentWeb.uploadFileResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
}
-
全屏视频播放
<!--如果你的应用需要用到视频 , 那么请你在使用 AgentWeb 的 Activity 对应的清单文件里加入如下配置-->
android:hardwareAccelerated="true"
android:configChanges="orientation|screenSize"
-
定位
<!--AgentWeb 是默认启动定位的 , 请在你的 AndroidManifest 文件里面加入如下权限 。-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
-
WebChromeClient Or WebViewClient 处理业务逻辑
// AgentWeb 保持了 WebView 的使用 ,
mAgentWeb = AgentWeb.with(this)//
.setAgentWebParent(mLinearLayout,new LinearLayout.LayoutParams(-1,-1) )//
.useDefaultIndicator()//
.defaultProgressBarColor()
.setReceivedTitleCallback(mCallback)
.setWebChromeClient(mWebChromeClient)
.setWebViewClient(mWebViewClient)
.setSecutityType(AgentWeb.SecurityType.strict)
.createAgentWeb()//
.ready()
.go(getUrl());
//WebViewClient
private WebViewClient mWebViewClient=new WebViewClient(){
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
//do you work
}
};
//WebChromeClient
private WebChromeClient mWebChromeClient=new WebChromeClient(){
@Override
public void onProgressChanged(WebView view, int newProgress) {
//do you work
}
};
-
获取 WebView
WebView mWebView=mAgentWeb.getWebCreator().get();
-
同步 Cookie
AgentWebConfig.syncCookies("http://www.jd.com","ID=XXXX")
-
查看 Cookies
String cookies=AgentWebConfig.getCookiesByUrl(targetUrl);
混淆
如果你的项目需要加入混淆 , 请加入如下配置
-keep class com.just.library.** {
*;
}
-dontwarn com.just.library.**
Java 注入类不要混淆 , 例如 App 里面的 AndroidInterface 类 , 需要 Keep 。
-keepclassmembers class com.just.library.agentweb.AndroidInterface{ *; }