package com.haochuan.hciptvbasic.webview; import android.app.Activity; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.text.TextUtils; import android.webkit.JavascriptInterface; import android.webkit.WebView; import com.haochuan.core.Logger; import com.haochuan.core.util.HandlerUtil; import com.haochuan.hciptvbasic.BaseWebActivity; import com.haochuan.hciptvbasic.BuildConfig; import com.haochuan.core.util.JSONUtil; import com.haochuan.core.util.JsUtil; import com.haochuan.core.util.MacUtil; import com.haochuan.core.util.MathUtil; import com.haochuan.core.util.ToolsUtil; import org.json.JSONObject; import org.w3c.dom.Text; import static com.haochuan.core.util.MessageCode.EXCEPTION_ERROR; import static com.haochuan.core.util.MessageCode.SUCCESS; public class UtilToJS { private Context context; //MainActivity 句柄 private WebView webView; private ToolsUtil toolsUtil; //将遥控返回按键事件传递给前端 private String JS_EVENT_BACK = "javascript:onBackEvent()"; //将日志传递给js private String JS_EVENT_LOG = "javascript:onLog('%s')"; //将response传递给js private String JS_EVENT_RESPONSE ="javascript:onWebRequestResponse('%s','%s')"; /** * 兼容旧智慧平台接口用 * 前端调用apk http请求回调事件 *
* 形参1:表示前端调用apk方法时传入的code,String字符串 *
* 形参2:表示apk请求过程--(0:开始请求;1:请求成功;-1:请求失败;-2:发生异常;2:请求结束),String字符串 *
* 形参3:表示apk请求过程中的结果,String字符串 */ public static final String JS_EVENT_HTTP_CONNECT = "javascript:onHttpConnect(\"%s\", \"%s\", \"%s\")"; public UtilToJS(Context context, WebView webView){ this.context = context; this.webView = webView; toolsUtil = new ToolsUtil(); } /*------------------------------------功能性函数-----------------------------------------*/ /* * 将log传递给前端 * */ public void logToJs(String log){ Logger.d("UtilToJS,logToJs(),log:" + log); JsUtil.evaluateJavascript(context,webView, String.format(JS_EVENT_LOG,log)); } /* * webView对象获取"返回"按键事件 * */ public void onBackPressed(){ Logger.d("UtilToJS,onBackPressed()"); JsUtil.evaluateJavascript(context,webView, JS_EVENT_BACK); } /*---------------------------------获取本地参数--------------------------*/ /* * 获取intent启动参数 * */ @JavascriptInterface public String getIntentJson(){ Logger.d("UtilToJS,getIntentJson()"); return toolsUtil.getIntentJson(context); } @JavascriptInterface public String getLocalParamsByJson(){ try{ Logger.d("UtilToJS,getLocalParamsByJson()"); JSONObject localParamsJson = new JSONObject(); localParamsJson.put("version_code",BuildConfig.VERSION_CODE); localParamsJson.put("version_name",BuildConfig.VERSION_NAME); localParamsJson.put("mac",MacUtil.getMac(context)); localParamsJson.put("user_id",getUserName()); String paramJsonStr = localParamsJson.toString(); Logger.d("UtilToJS,getLocalParamsByJson(),paramJsonStr:" + paramJsonStr); return paramJsonStr; }catch (Exception e){ e.printStackTrace(); return ""; } } /*-----------------------------操作APK-------------------------------------*/ /* * 退出app * */ @JavascriptInterface public void appExit(){ try{ HandlerUtil.runOnUiThread(() -> { Logger.d("UtilToJS,appExit()"); Activity activity =(Activity)context; if(activity instanceof BaseWebActivity){ BaseWebActivity baseWebActivity = (BaseWebActivity)activity; baseWebActivity.AppExit(); }else{ android.os.Process.killProcess(android.os.Process.myPid()); //获取PID System.exit(0); } }); }catch (Exception e){ e.printStackTrace(); } } /*---------------------------通过客户端请求接口------------------------*/ /* *js 通过apk客户端访问网络接口 *@param contentType 网络类型,详情参考网络请求的content-type *@param paramJson 请求参数集,格式为json字符串 *@param headJson 请求头部集,格式为json字符串 *@param method 请求方法,1,get;2,post *@param ignoreResult 是否忽略结果,true,忽略;false,不忽略. *@param tag 透传参数,将在结果回调中一并返回,主要区别多个并发请求 * */ @JavascriptInterface public int clientWebRequest(String paramsJson){ try{ Logger.d("clientWebRequest(),paramsJson" + paramsJson); JSONObject requestParams = new JSONObject(paramsJson); String url = JSONUtil.getString(requestParams,"url",""); String methodStr = JSONUtil.getString(requestParams,"method","1"); int method = 0; if(MathUtil.isDigitsOnly(methodStr)){ method = Integer.parseInt(methodStr); if( method <0 || method > 1 ){ Logger.w("clientWebRequest 请求参数method必须为0或者1,目前重置为0"); method = 0; } }else{ Logger.w("clientWebRequest 请求参数method必须为数字,目前重置为0"); } String contentType = JSONUtil.getString(requestParams,"content_type","application/json"); String headJson = JSONUtil.getString(requestParams,"head_json","{}"); String paramJson = JSONUtil.getString(requestParams,"param_json","{}"); String ignore = JSONUtil.getString(requestParams,"ignore_result","0"); boolean ignoreResult = TextUtils.equals(ignore,"1"); String tag = JSONUtil.getString(requestParams,"tag",""); toolsUtil.clientWebRequest(url, method, contentType, headJson,paramJson, ignoreResult, tag, (int what,String response,String tag1)->{ Logger.d(String.format("response:%s;tag:%s",response,tag1)); JsUtil.evaluateJavascript(context,webView, String.format(JS_EVENT_RESPONSE,response,tag1)); }); return SUCCESS; }catch (Exception e){ e.printStackTrace(); return EXCEPTION_ERROR; } } /*-----------------------------本地盒子参数获取------------------------------------*/ /** * 获取userName * @return */ private String getUserNameFromSTB(){ try{ Uri uri = Uri.parse("content://stbconfig/authentication"); Cursor mCursor = context.getContentResolver().query(uri,null,null,null,null); if(mCursor != null){ String userName = ""; while (mCursor.moveToNext()){ //获取username String name = mCursor.getString(mCursor.getColumnIndex("name")); if("username".equals(name)){ userName = mCursor.getString(mCursor.getColumnIndex("value")); break; } } return userName; }else{ return ""; } }catch (Exception e){ e.printStackTrace(); return ""; } } /** * 返回用户名 * @return */ private String getUserName(){ String userName = getUserNameFromSTB(); if(TextUtils.isEmpty(userName)){ return MacUtil.getMac(context); } return userName; } }