最新项目中需要嵌入几个 H5 的界面,APP 的登入功能也放在 H5 端,第一次登入后,后续可以免登陆。使用 WebView 实现以上简单功能当中出现的问题和解决方法。
首先声明一个 WebView
private WebView mWebView;
在定义两个 Url 变量,一个是登陆的 一个是登陆之后的
public static final String ENTRANCE_URL_LOGIN = "http://xxx.xxx.xxx.xxx/trouble/admin_login.aspx"; //登陆url
public static final String ENTRANCE_URL_HOME = "http://xxx.xxx.xxx.xxx/trouble/manager/index.aspx"; //登陆后调整的url
在 onCreate 中创建
@SuppressLint("JavascriptInterface")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login_web_view);
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
String CookieStr = cookieManager.getCookie(ENTRANCE_URL_HOME); //获取cookie
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
SharedPreferences cookid = getSharedPreferences("UserConfiguration",MODE_PRIVATE);//存储Cookie信息
webSettings.setJavaScriptEnabled(true);//打开js支持
/**
* 打开js接口給H5调用,参数1为本地类名,参数2为别名;h5用window.别名.类名里的方法名才能调用方法里面的内容,例如:window.android.back();
* */
mWebView.addJavascriptInterface(new JsInteration(), "JSInterface");
mWebView.setWebViewClient(new WebViewClient());
mWebView.setWebChromeClient(new WebChromeClient());
// 开启Javascript脚本
webSettings.setJavaScriptEnabled(true);
// 判断Cookie是否存在
if(TextUtils.isEmpty(CookieStr)) {
mWebView.loadUrl(ENTRANCE_URL_LOGIN);
} else{
//同步Cookie给WebView
syncCookie(ENTRANCE_URL_HOME,CookieStr);
mWebView.loadUrl(ENTRANCE_URL_HOME);
}
//使用SharedPreferences存储
SharedPreferences.Editor editor =cookid.edit();
editor.putString("cookid",cookieManager.getCookie(ENTRANCE_URL_HOME));
editor.commit();
Log.d(TAG, "onCreate cookie:" + CookieStr);
}
以上有加 JS 支持,要是没用可以删掉。
syncCookie 同步 Cookie 方法
/**
* 将cookie同步到WebView
* @param url WebView要加载的url
* @param cookie 要同步的cookie
* @return true 同步cookie成功,false同步cookie失败
* @Author JPH
*/
public static boolean syncCookie(String url,String cookie) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(context);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);//如果没有特殊需求,这里只需要将session id以"key=value"形式作为cookie即可
String newCookie = cookieManager.getCookie(url);
return TextUtils.isEmpty(newCookie)?false:true;
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="9"
/>
</LinearLayout>
到这里就可以实现基本的功能