package com.zenglb.baselib.jsbridge; import android.content.Intent; import android.webkit.WebView; import android.widget.Toast; import com.zenglb.baselib.base.BaseWebViewActivity; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; import java.util.Map; /** * 这个类中的方法都是JS 通过Bridge 来调用的,使用前需要注入 * 里面的所有的方法(除了方法名字)都必须满足一定的规则! */ public class BridgeImpl implements IBridge { private static Map<Integer,Callback> callbackCache=new HashMap(); //缓存callback,onActResult 用 public static String fliterTAG="MY.intent.action.XXXXXXXXXX"; /** * 从缓存的CallBack cache 中移除某个callback! */ public static Callback getCallback(Integer key) { Callback callback=callbackCache.get(key); callbackCache.remove(key); return callback; } /** * 调用新的Activity处理需要的数据结果,需要在Activity接收数据 * @param webView * @param tag */ private static void callNewActForResult(WebView webView,int tag){ Intent intent=new Intent(); intent.setAction(fliterTAG); intent.putExtra("code",tag); webView.getContext().sendBroadcast(intent); } /** * * * @param webView * @param param * @param callback */ public static void getImage(WebView webView, JSONObject param, final Callback callback) { callbackCache.put(BaseWebViewActivity.GET_IMG_REQUEST_CODE,callback); callNewActForResult(webView,BaseWebViewActivity.GET_IMG_REQUEST_CODE); } /** * 扫码回传给JS,这个处理和其他的有些不一样,需要新启动一个Activity 来获取数据 * * @param webView * @param param * @param callback */ public static void scanQRCode(WebView webView, JSONObject param, final Callback callback) { callbackCache.put(BaseWebViewActivity.ZXING_REQUEST_CODE,callback); callNewActForResult(webView,BaseWebViewActivity.ZXING_REQUEST_CODE); } /** * 处理通用的错误,比如调用了本地并不存在的方法! * * * @param code -1 不存在的Native方法 -2 * @param callback */ public static void returnCommonEor(WebView webView, final Integer code, final Callback callback) { if (null != callback) { try { callback.apply(returnJSONObject(code, "调用本地方法失败", null)); //这里回调js 没有任何的意义呀! } catch (Exception e) { e.printStackTrace(); } } } public static void showToast(WebView webView, JSONObject param, final Callback callback) { String message = param.optString("msg"); Toast.makeText(webView.getContext(), message, Toast.LENGTH_SHORT).show(); if (null != callback) { try { JSONObject object = new JSONObject(); object.put("key", "value11111111"); callback.apply(returnJSONObject(0, "ok", object)); //这里回调js 没有任何的意义呀! } catch (Exception e) { e.printStackTrace(); } } } /** * 测试在子线程中完成操作 * * @param webView * @param param * @param callback */ public static void testThread(WebView webView, JSONObject param, final Callback callback) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); JSONObject object = new JSONObject(); object.put("key", "value"); callback.apply(returnJSONObject(0, "ok", object)); } catch (InterruptedException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } } }).start(); } /** * * @param code * @param msg * @param result * @return */ public static JSONObject returnJSONObject(int code, String msg, JSONObject result) { JSONObject object = new JSONObject(); try { object.put("code", code); object.put("msg", msg); object.putOpt("result", result); return object; } catch (JSONException e) { e.printStackTrace(); } return null; } }