Skip to content

Instantly share code, notes, and snippets.

@330132662
Created October 14, 2020 01:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 330132662/1f3aac8a98b305596b8fe1aa8737f7d2 to your computer and use it in GitHub Desktop.
Save 330132662/1f3aac8a98b305596b8fe1aa8737f7d2 to your computer and use it in GitHub Desktop.
js 接口
package com.blue.tooth.lock;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.ConsoleMessage;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.blue.tooth.lock.util.AppCache;
import com.blue.tooth.lock.util.BleSendDataUtil;
import com.blue.tooth.lock.util.ToastUtils;
import com.meihua.passivelock.BLEConnectCallback;
import com.meihua.passivelock.BLETools;
import com.meihua.passivelock.BleLockProCallback;
import com.meihua.passivelock.LogInfoVo;
import com.meihua.passivelock.TaskDataVo;
import com.meihua.passivelock.fastble.BleManager;
import com.meihua.passivelock.fastble.data.BleDevice;
import com.tencent.bugly.beta.Beta;
import java.util.concurrent.locks.Lock;
/**
* author: jiangliqiang
* date: 2020/09/21
* 连接钥匙
* 1 需要实现BLEConnectCallback 蓝牙连接的回调接口
* 2 需要实现BleLockProCallback 锁具通信的回调接口
*/
public class ConnectKeyAct extends Activity implements View.OnClickListener, BLEConnectCallback, BleLockProCallback {
private WebView mWebView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.act_lock_detail);
Beta.checkUpgrade();
this.buildView();
this.buildListener();
this.connect();
initView();
}
@SuppressLint("SetJavaScriptEnabled")
private void initView() {
//加载网页链接
String url = "http://zhuoc.zczny.com/index/people/index";
// String url = "http://srg.quanjing-vr.com/index.php?s=/wap/index/index2";
//加载本地assets目录下的网页
// webView.loadUrl("file:///android_asset/keithxiaoy.html");
//加载手机本地的html页面
// webView.loadUrl("content://com.android.htmlfileprovider/sdcard/keithxiaoy.html");
//加载 HTML 页面的一小段内容。参数1:需要截取展示的内容、参数2:展示内容的类型、参数3:字节码
// webView.loadData(String data, String mimeType, String encoding)
WebSettings webSettings = mWebView.getSettings();
//如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
webSettings.setJavaScriptEnabled(true);
// 若加载的 html 里有JS 在执行动画等操作,会造成资源浪费(CPU、电量)
// 在 onStop 和 onResume 里分别把 setJavaScriptEnabled() 给设置成 false 和 true 即可
//支持插件
// webSettings.setPluginsEnabled(true);
//设置自适应屏幕,两者合用
webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
//缩放操作
webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件
//其他细节操作
webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
webSettings.setAllowFileAccess(true); //设置可以访问文件
webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.d("KeithXiaoY", "开始加载");
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d("KeithXiaoY", "加载结束");
}
// 链接跳转都会走这个方法
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.d("KeithXiaoY", "Url:" + url);
view.loadUrl(url);// 强制在当前 WebView 中加载 url
return true;
}
});
mWebView.clearCache(true);
mWebView.clearHistory();
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
Log.d("KeithXiaoY", "newProgress:" + newProgress);
}
@Override
public void onReceivedTitle(WebView view, String title) {
super.onReceivedTitle(view, title);
Log.d("KeithXiaoY", "标题:" + title);
}
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
ToastUtils.show(getApplicationContext(), "onJsAlert");
connect();
return super.onJsAlert(view, url, message, result);
}
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
ToastUtils.show(getApplicationContext(), consoleMessage.message());
return super.onConsoleMessage(consoleMessage);
}
});
initJsApi();
mWebView.loadUrl(url);
}
private void initJsApi() {
//核心方法, 用于处理JavaScript被执行后的回调
// mWebView.addJavascriptInterface(new AndroidtoJs(this), "zhuochuang");
mWebView.addJavascriptInterface(new AndroidApi(), "zhuochuang");
}
class AndroidApi {
@JavascriptInterface
public void conncetBle() {
connect(); //连接操作,用不到了 2020年9月27日10:39:19
}
@JavascriptInterface
public void initLock(String mLockCode) {
initKey(mLockCode);// 初始化锁
}
@JavascriptInterface
public void authLock(String userId, String start, String end) {
ToastUtils.show(getApplicationContext(), "authLock");
authAction(userId, start, end);// 授权
}
/**
* 清除授权
*/
@JavascriptInterface
public void clearAuthApi() {
clearAuth(); // 清除授权
}
@JavascriptInterface
public void clearLock(String lockCode) {
clearLockApi(lockCode); // 清除授权
}
@JavascriptInterface
public void getLockInfo() {
getLockInfoApi(); // 清除授权
}
@JavascriptInterface
public void disConnect() {
bleTools.disConnect(); // 清除授权
}
}
private void clearLockApi(String lockCode) {
type = 3;
// BleSendDataUtil.resetLock(bleTools, LOCK_CODE, mac);
BleSendDataUtil.resetLock(bleTools, lockCode, mac);
}
private void clearAuth() {
log.setText("准备清空授权");
type = 2;
Log.i(TAG, "cancelAuth");
BleSendDataUtil.cleanAuth(bleTools);
}
private void getLockInfoApi() {
bleTools.setLockRespCallBack(new BleLockProCallback() {
@Override
public void bindKeyCallback(boolean b) {
}
@Override
public void verificationTimeCallback(boolean b, boolean b1) {
}
@Override
public void dumpEnergyCallBack(int i) {
}
@Override
public void authKeyCallBack(boolean b) {
}
@Override
public void initLockCallBack(boolean b) {
}
@Override
public void getKeyLogCallBack(LogInfoVo logInfoVo) {
if (logInfoVo != null) {
Log.d("LOCKK", logInfoVo.lockCode);
Log.d("LOCKK", logInfoVo.lockMac);
Log.d("LOCKK", logInfoVo.logNub);
Log.d("LOCKK", logInfoVo.toString());
}
}
@Override
public void lockInfoCallBack(String s) {
ToastUtils.show(ConnectKeyAct.this, s, Toast.LENGTH_LONG);
}
});
bleTools.getLockInfo();
bleTools.getLockLog();
}
private void buildView() {
mWebView = findViewById(R.id.web);
lockName = findViewById(R.id.lockName);
lockMac = findViewById(R.id.lockMac);
electricNum = findViewById(R.id.electricNum);
connectStatus = findViewById(R.id.connectStatus);
initLock = findViewById(R.id.initLock);
auth = findViewById(R.id.auth);
cancelAuth = findViewById(R.id.cancelAuth);
loadText = findViewById(R.id.loadText);
iv_running = findViewById(R.id.iv_running);
loadingBox = findViewById(R.id.loadingBox);
lockCodeEt = findViewById(R.id.lockCodeEt);
clearLock = findViewById(R.id.clearLock);
back = findViewById(R.id.back);
log = findViewById(R.id.log);
lockCode = findViewById(R.id.lockCode);
getLockInfo = findViewById(R.id.getLockInfo);
getOpenLockInfo = findViewById(R.id.getOpenLockInfo);
Bundle bundle = getIntent().getExtras();
String name = bundle.getString("name");
mac = bundle.getString("mac");
lockName.setText("锁具名称:" + name);
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {
mWebView.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void buildListener() {
initLock.setOnClickListener(this);
auth.setOnClickListener(this);
cancelAuth.setOnClickListener(this);
back.setOnClickListener(this);
getOpenLockInfo.setOnClickListener(this);
getLockInfo.setOnClickListener(this);
clearLock.setOnClickListener(this);
}
;
private void connect() {
loadText.setText("正在连接蓝牙");
loadingBox.setVisibility(View.VISIBLE);
this.startScanAnim();
if (bleTools == null) {
bleTools = new BLETools();
bleTools.setConnectCallBack(this);
bleTools.setLockRespCallBack(this);
}
bleTools.connect(AppCache.getBleDevice());
}
private void startScanAnim() {
iv_running.setVisibility(View.VISIBLE);
anim = (AnimationDrawable) iv_running.getDrawable();
iv_running.post(new Runnable() {
@Override
public void run() {
anim.start();
}
});
}
@Override
protected void onResume() {
super.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (connectDevice != null) {
BleManager.getInstance().disconnect(connectDevice);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.initLock:
initKey("");
break;
case R.id.auth:
authAction("99999", "", "");
break;
case R.id.cancelAuth:
clearAuth();
break;
case R.id.getOpenLockInfo:
log.setText("准备获取日志");
logSb.setLength(0);
BleSendDataUtil.getKeyLogCallBack(bleTools);
break;
case R.id.back:
finish();
break;
case R.id.getLockInfo:
bleTools.getLockInfo();
break;
case R.id.clearLock:
clearLockApi(LOCK_CODE);
break;
}
}
private void initKey(String mLockCode) {
log.setText("准备向锁授权");
if (mLockCode.equals("")) {
mLockCode = LOCK_CODE;
}
// String edLockCode = lockCodeEt.getText().toString();
// if(edLockCode!=null&&!edLockCode.equals("")){
// mLockCode = edLockCode;
// }
Log.i(TAG, "mLockCode:" + mLockCode);
BleSendDataUtil.initLock(bleTools, mLockCode);
}
/**
* @param userId 999
* @param start 20200922120000
* @param end 20201222120000
*/
private void authAction(String userId, String start, String end) {
// log.setText("准备授权");
ToastUtils.show(this, "欢迎" + userId);
type = 1;
String lockCode = LOCK_CODE;
lockCode = lockCode.replaceAll(":", "");
BleSendDataUtil.authAction(bleTools, userId, lockCode, mac, start, end);
// BleSendDataUtil.authAction(bleTools,USERID,lockCode,mac,"20200922120000","20201222120000");
}
//蓝牙连接成功
@Override
public void connectSuccess(BleDevice bleDevice) {
anim.stop();
loadingBox.setVisibility(View.GONE);
this.connectDevice = bleDevice;
connectStatus.setText("连接状态:连接成功");
BleSendDataUtil.bindKey(bleTools, USERID);
}
private void enabledButton() {
initLock.setEnabled(true);
initLock.setBackgroundResource(R.drawable.login_btn_selector);
auth.setEnabled(true);
auth.setBackgroundResource(R.drawable.login_btn_selector);
cancelAuth.setEnabled(true);
cancelAuth.setBackgroundResource(R.drawable.login_btn_selector);
getOpenLockInfo.setEnabled(true);
getOpenLockInfo.setBackgroundResource(R.drawable.login_btn_selector);
getLockInfo.setEnabled(true);
getLockInfo.setBackgroundResource(R.drawable.login_btn_selector);
clearLock.setEnabled(true);
clearLock.setBackgroundResource(R.drawable.login_btn_selector);
}
//蓝牙连接失败
@Override
public void connectFailed() {
anim.stop();
loadingBox.setVisibility(View.GONE);
connectDevice = null;
connectStatus.setText("连接状态:连接失败");
}
//蓝牙断开连接
@Override
public void onDisConnected(BleDevice bleDevice) {
loadingBox.setVisibility(View.GONE);
connectDevice = null;
connectStatus.setText("连接状态:断开");
}
//用户id与钥匙绑定回调
@Override
public void bindKeyCallback(boolean isBindSuccess) {
if (isBindSuccess) {
log.setText("钥匙绑定成功");
BleSendDataUtil.setKeyTime(bleTools);
} else {
log.setText("钥匙绑定失败");
}
}
//校时回调
@Override
public void verificationTimeCallback(boolean isVerificationTimeSuccess, boolean isOnline) {
if (isVerificationTimeSuccess) {
log.setText("时间校验成功");
} else {
log.setText("时间校验失败");
}
BleSendDataUtil.getElectricity(bleTools);
}
//电量回调
@Override
public void dumpEnergyCallBack(int dumpEnergy) {
if (dumpEnergy > 100) {
dumpEnergy = 100;
}
electricNum.setText("锁具电量:" + dumpEnergy + "%");
enabledButton();
}
//授权回调
@Override
public void authKeyCallBack(boolean isAuthSuccess) {
Log.i(TAG, "isAuthSuccess:" + isAuthSuccess);
String msg = "";
if (isAuthSuccess) {
if (type == 3) {
Toast.makeText(this, "将钥匙插入锁芯,听到 滴滴 两声代表清除成功", Toast.LENGTH_LONG);
finish();
return;
}
if (type == 1) {
msg = "授权成功";
log.setText(msg);
} else if (type == 2) {
msg = "清除授权成功";
log.setText(msg);
}
} else {
if (type == 1) {
msg = "授权失败";
} else if (type == 2) {
msg = "清除授权失败";
} else if (type == 3) {
msg = "清除锁芯失败";
}
log.setText(msg);
}
}
//初始化锁具回调
@Override
public void initLockCallBack(boolean isSuccess) {
if (isSuccess) {
log.setText("初始化锁具成功");
} else {
log.setText("初始化锁具失败");
}
}
@Override
public void getKeyLogCallBack(LogInfoVo logInfoVo) {
if (logInfoVo == null) {
if (logSb.length() == 0) {
log.setText("没有日志");
}
return;
}
logSb.append("用户:").append(logInfoVo.logNub).append(",");
logSb.append(logInfoVo.openTime);
if (logInfoVo.openType.equals("00")) {
if (logInfoVo.result.equals("01")) {
logSb.append(" 关锁成功");
} else {
logSb.append(" 关锁失败");
}
} else if (logInfoVo.openType.equals("01")) {
if (logInfoVo.result.equals("01")) {
logSb.append(" 开锁成功");
} else {
logSb.append(" 开锁失败");
}
} else if (logInfoVo.openType.equals("01")) {
logSb.append(" 清除锁识别号");
} else {
logSb.append(" 执行:").append(logInfoVo.openType);
}
logSb.append("\r\n");
log.setText(logSb.toString());
BleSendDataUtil.getKeyLogCallBack(bleTools);//重复读取日志,直到logInfoVo为空
}
@Override
public void lockInfoCallBack(String lockMac) {
lockCode.setText("锁具信息:" + lockMac);
// log.setText("锁具mac-16进制:" + lockMac);
}
//蓝牙相关
private BLETools bleTools;
private BleDevice connectDevice;//连接成功的蓝牙
private AnimationDrawable anim;
private final String TAG = "ConnectKeyAct:";
private final String USERID = "9999";//99999999
private final String LOCK_CODE = "0050:0001:0010:0000:1a2b:0000:0000:0000";//0033:0001:0008:0000:1d25:0000:0000:0000
private String mac;
private int type = 0;
private StringBuffer logSb = new StringBuffer();
private TextView loadText;
private ImageView iv_running;
private TextView log;
private TextView lockName;
private TextView lockMac;
private TextView electricNum;
private TextView connectStatus;
private Button initLock;
private Button auth;
private Button cancelAuth;
private Button getOpenLockInfo;
private LinearLayout loadingBox;
private Button getLockInfo;
private Button clearLock;
private TextView back;
private EditText lockCodeEt;
private TextView lockCode;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment