1.這個三方庫用例也很多,使用方式也很簡單富玷,先看一下git網(wǎng)址
git傳送門:https://github.com/lzyzsd/JsBridge
2.使用方式,直接依賴
compile 'com.github.lzyzsd:jsbridge:1.0.4'
3.直接在自己的webview中寫吧磁携,我先把代碼放過來
private void initView() {
webView = (BridgeWebView) findViewById(R.id.webview);
back = (LinearLayout) findViewById(R.id.back);
title = (TextView) findViewById(R.id.title);
rightBtn_click = (RelativeLayout) findViewById(R.id.rightBtn_click);
rightBtn = (ImageView) findViewById(R.id.rightBtn);
rightBtn_click.setVisibility(View.VISIBLE);
rightBtn.setImageResource(R.mipmap.share);
//返回
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
WebViewActivity.this.setResult(RESULT_OK);
if (webView.canGoBack()) {
webView.goBack();
} else {
finish();
}
}
});
//分享
rightBtn_click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (!TextUtils.isEmpty(shareurl)) {
//分享標題
sharename = title.getText().toString();
if (TextUtils.isEmpty(sharename)) {
sharename = getResources().getString(R.string.app_name);
}
ShareDialog shareDialog = new ShareDialog(WebViewActivity.this);
shareDialog.share(shareurl, sharename, sharesrc, sharedes, null, true);
shareDialog.show();
} else {
ToastUtils.showToast(WebViewActivity.this, getString(R.string.data_err));
}
}
});
progressBar = new ProgressBar(context, null, android.R.attr.progressBarStyleHorizontal);
}
private void initEvent() {
WebSettings websettings = webView.getSettings();
websettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
websettings.setLoadsImagesAutomatically(true);
websettings.setJavaScriptEnabled(true);
websettings.setUseWideViewPort(true);
websettings.setSupportZoom(true);
websettings.setSupportMultipleWindows(true);
websettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
websettings.setBuiltInZoomControls(true);
websettings.setSupportZoom(true);
websettings.setJavaScriptCanOpenWindowsAutomatically(true);
websettings.setAppCacheEnabled(true);
webView.setDefaultHandler(new DefaultHandler());
webView.setWebViewClient(new MyWebViewClient(webView));
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
if (newProgress == 100) {
progressBar.setVisibility(View.GONE);
} else {
if (progressBar.getVisibility() != View.VISIBLE) {
progressBar.setVisibility(View.VISIBLE);
}
progressBar.setProgress(newProgress);
}
super.onProgressChanged(view, newProgress);
}
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType, String capture) {
this.openFileChooser(uploadMsg);
}
@SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg, String AcceptType) {
this.openFileChooser(uploadMsg);
}
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
initPermission();
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
mUploadMessageArray = filePathCallback;
initPermission();
return true;
}
});
webView.loadUrl(url);
webView.registerHandler("save", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
if (!TextUtils.isEmpty(data)) {
if (data.endsWith(".png") || data.endsWith(".jpg") || data.endsWith("jpeg")) {
DownLoadManager.downLoadImage(context, data);
} else {
ToastUtils.showToast(WebViewActivity.this, getResources().getString(R.string.okgofail));
}
}
function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");
}
});
webView.registerHandler("goLogin", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
if (!TextUtils.isEmpty(data)) {
CommonUtils.toLogin(WebViewActivity.this);
}
function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");
}
});
webView.registerHandler("toBookDetail", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
if (!TextUtils.isEmpty(data)) {
WebViewBean webViewBean = new Gson().fromJson(data, new TypeToken<WebViewBean>() {
}.getType());
if (!TextUtils.isEmpty(webViewBean.getBookId())) {
Intent intent = new Intent(WebViewActivity.this, BookDetailActivity.class);
intent.putExtra(SPUtils.K_BOOKID, webViewBean.getBookId());
intent.putExtra(SPUtils.K_TITLE, "");
startActivity(intent);
} else {
showToast(getResources().getString(R.string.okgofail));
}
}
function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");
}
});
}
private class MyWebViewClient extends BridgeWebViewClient {
public MyWebViewClient(BridgeWebView webView) {
super(webView);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
//獲取HTML的title
String titles = view.getTitle();
if (!TextUtils.isEmpty(titles)) {
title.setText(titles);
sharename = titles;
}
if (TextUtils.isEmpty(sharedes)) {
sharedes = getResources().getString(R.string.app_name);
}
//加載結束后去掉加載框
dismissLoading();
if (!WebViewActivity.this.isDestroyed() || !WebViewActivity.this.isFinishing()) {
webView.callHandler("checkAPP", "android", new CallBackFunction() {
@Override
public void onCallBack(String data) {
Log.i(TAG, "回傳結果:" + data);
}
});
}
}
}
/**
* Back鍵控制網(wǎng)頁后退
*
* @param
* @param
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KEYCODE_BACK) && webView.canGoBack()) {
webView.goBack();
return true;
}
WebViewActivity.this.setResult(RESULT_OK);
return super.onKeyDown(keyCode, event);
}
/**
* 在 Activity 銷毀( WebView )的時候酌摇,先讓 WebView 加載null內(nèi)容,然后移除 WebView驰坊,再銷毀 WebView匾二,最后置空。
*
* @param
* @param
*/
@Override
protected void onDestroy() {
if (webView != null) {
webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
webView.clearHistory();
((ViewGroup) webView.getParent()).removeView(webView);
webView.destroy();
webView = null;
}
super.onDestroy();
}
private void initPermission() {
// 申請權限。
PermissionUtils.permission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE).callBack(new PermissionUtils.PermissionCallBack() {
@Override
public void onGranted(PermissionUtils permissionUtils) {
PictureSelector.create(WebViewActivity.this)
.openGallery(PictureMimeType.ofImage())
.maxSelectNum(Integer.MAX_VALUE)// 最大圖片選擇數(shù)量 int
.isCamera(true)// 是否顯示拍照按鈕
.isZoomAnim(true)// 圖片列表點擊 縮放效果 默認true
// .enableCrop(true)// 是否裁剪
.compress(true)// 是否壓縮
.synOrAsy(true)//同步true或異步false 壓縮 默認同步
// .withAspectRatio(3, 2)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定義
.glideOverride(160, 160)// glide 加載寬高察藐,越小圖片列表越流暢皮璧,但會影響列表圖片瀏覽的清晰度
.hideBottomControls(true)// 是否顯示uCrop工具欄,默認不顯示
.isGif(false)// 是否顯示gif圖片
// .freeStyleCropEnabled(true)// 裁剪框是否可拖拽
// .circleDimmedLayer(true)// 是否圓形裁剪
// .showCropFrame(false)// 是否顯示裁剪矩形邊框 圓形裁剪時建議設為false
// .showCropGrid(true)// 是否顯示裁剪矩形網(wǎng)格 圓形裁剪時建議設為false
// .selectionMedia(selectList)// 是否傳入已選圖片
.forResult(PictureConfig.CHOOSE_REQUEST);
}
@Override
public void onDenied(PermissionUtils permissionUtils) {
ToastTintUtils.error("請打開您的相機和存儲權限");
}
}).request();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PictureConfig.CHOOSE_REQUEST:
// 圖片選擇結果回調(diào)
selectList = PictureSelector.obtainMultipleResult(data);
// 例如 LocalMedia 里面返回三種path
// 1.media.getPath(); 為原圖path
// 2.media.getCutPath();為裁剪后path分飞,需判斷media.isCut();是否為true
// 3.media.getCompressPath();為壓縮后path悴务,需判斷media.isCompressed();是否為true
// 如果裁剪并壓縮了,已取壓縮路徑為準譬猫,因為是先裁剪后壓縮的
List<Uri> list = new ArrayList<>();
for (LocalMedia media : selectList) {
Log.i("圖片-----》", media.getPath());
iconPath = media.getPath();
list.add(Uri.fromFile(new File(iconPath)));
}
if (list != null && list.size() > 0) {
if (mUploadMessageArray != null) {
// Uri[] uris = new Uri[]{Uri.fromFile(new File(iconPath))};
Uri[] uris = new Uri[list.size()];
for (int i = 0; i < list.size(); i++) {
uris[i] = list.get(i);
}
Logger.e("ttt" + uris.toString());
mUploadMessageArray.onReceiveValue(uris);
mUploadMessageArray = null;
} else if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(Uri.fromFile(new File(iconPath)));
mUploadMessage = null;
} else {
Toast.makeText(context, "獲取圖片失敗讯檐,請稍后重試", Toast.LENGTH_LONG).show();
}
} else {
cancelFilePathCallback();
}
break;
}
}
/**
* 取消mFilePathCallback回調(diào)
*/
private void cancelFilePathCallback() {
if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(null);
mUploadMessage = null;
} else if (mUploadMessageArray != null) {
mUploadMessageArray.onReceiveValue(null);
mUploadMessageArray = null;
}
}
4.這份代碼是基本的生命webview在布局中要寫的
<com.github.lzyzsd.jsbridge.BridgeWebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
這個代碼有選擇相冊的功能,還有寫的句柄染服,來回調(diào)用用的别洪,先說訪問相冊,這個跟iOS沒法比柳刮,我們要自己寫調(diào)起相冊的功能挖垛,使用的是一個三方庫,選擇照片后回調(diào)秉颗,這里說一下痢毒,避免選擇后不能再次選擇問題,所以有了一個取消mFilePathCallback回調(diào)
其次句柄:
HTML調(diào)用我的方法站宗,首先我注冊一個方法闸准,等他觸發(fā)
webView.registerHandler("save", new BridgeHandler() {
@Override
public void handler(String data, CallBackFunction function) {
Log.e(TAG, "handler = ImagesFromWeb, data from web = " + data);
if (!TextUtils.isEmpty(data)) {
if (data.endsWith(".png") || data.endsWith(".jpg") || data.endsWith("jpeg")) {
DownLoadManager.downLoadImage(context, data);
} else {
ToastUtils.showToast(WebViewActivity.this, getResources().getString(R.string.okgofail));
}
}
function.onCallBack("ImagesFromWeb exe, response data 中文 from Java");
}
});
然后是HTML注冊方法,APP調(diào)用
webView.callHandler("checkAPP", "android", new CallBackFunction() {
@Override
public void onCallBack(String data) {
Log.i(TAG, "回傳結果:" + data);
}
});
基本用法就這樣梢灭,記得訪問相冊的時候判斷一下權限