package cn.shangyu.gdxzExpert.utils; import static com.taobao.accs.ACCSManager.mContext; import static cn.shangyu.gdxzExpert.utils.Constant.token; import static cn.shangyu.gdxzExpert.utils.Constant.uniapp_mp_appid; import static cn.shangyu.gdxzExpert.utils.HttpMD5SendInfoUtil.sendJsonPostParamTokenMD5; import static cn.shangyu.gdxzExpert.utils.UIUtils.getContext; import static cn.shangyu.gdxzExpert.utils.Url.url_path; import static cn.shangyu.gdxzExpert.utils.Url.weurl; import android.content.Context; import android.content.Intent; import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.util.Log; import android.widget.Toast; import org.json.JSONException; import org.json.JSONObject; import java.io.File; import cn.shangyu.gdxzExpert.activity.BindWeChatActivity; import cn.shangyu.gdxzExpert.activity.CaseDetailActivity; import cn.shangyu.gdxzExpert.activity.CasediscussionActivity; import cn.shangyu.gdxzExpert.activity.CourseActivity; import cn.shangyu.gdxzExpert.activity.EditPhoneActivity; import cn.shangyu.gdxzExpert.activity.GDLiveBroadcastActivity; import cn.shangyu.gdxzExpert.activity.GanDanHospitalActivity; import cn.shangyu.gdxzExpert.activity.GandanConsultActivity; import cn.shangyu.gdxzExpert.activity.GroupingActivity; import cn.shangyu.gdxzExpert.activity.MyAccount2Activity; import cn.shangyu.gdxzExpert.activity.MyCicleActivity; import cn.shangyu.gdxzExpert.activity.MyCoursewareActivity; import cn.shangyu.gdxzExpert.activity.MyDownLoadsActivity; import cn.shangyu.gdxzExpert.activity.MyFlowerActivity; import cn.shangyu.gdxzExpert.activity.MyLibraryActivity; import cn.shangyu.gdxzExpert.activity.MyPatientActivity; import cn.shangyu.gdxzExpert.activity.MyQrCodeActivity; import cn.shangyu.gdxzExpert.activity.MyScientificResearchActivity; import cn.shangyu.gdxzExpert.activity.NewsDetailActivity; import cn.shangyu.gdxzExpert.activity.OrderListActivity; import cn.shangyu.gdxzExpert.activity.OutofPatientNoticeActivity; import cn.shangyu.gdxzExpert.activity.PublicConsultationActivity; import cn.shangyu.gdxzExpert.activity.ResearchActivity; import cn.shangyu.gdxzExpert.activity.SendGroupMsgListActivity; import cn.shangyu.gdxzExpert.activity.SendMindActivity; import cn.shangyu.gdxzExpert.activity.SettingVersionActivity; import cn.shangyu.gdxzExpert.activity.TestingActivity; import cn.shangyu.gdxzExpert.application.BaseApplication; import cn.shangyu.gdxzExpert.bean.SimpleBean; import cn.shangyu.gdxzExpert.bean.UniappMpCheckWgt; import cn.shangyu.gdxzExpert.big.activity.BiggNewPatientActivity; import cn.shangyu.gdxzExpert.big.activity.NormNewPatientActivity; import cn.shangyu.gdxzExpert.http.OnCallBackFromNet; import cn.shangyu.gdxzExpert.polyvplayer.MyDownLoadVideoActivity; import cn.shangyu.gdxzExpert.polyvplayer.QualityCourseActivity; import cn.shangyu.gdxzExpert.splash.UniappSplashView; import cn.shangyu.gdxzExpert.view.CommonProgressDialog; import io.dcloud.feature.sdk.DCUniMPSDK; import io.dcloud.feature.sdk.Interface.IUniMP; import io.dcloud.feature.unimp.config.IUniMPReleaseCallBack; import io.dcloud.feature.unimp.config.UniMPOpenConfiguration; import io.dcloud.feature.unimp.config.UniMPReleaseConfiguration; public class UniappUtil { private static String lastUniMPToken = ""; /** * 判断目标路径是否允许游客模式(未登录)访问 * 覆盖:肝胆视频、肝胆新闻(肝胆时讯)、肝胆课件及其详情页 */ public static boolean isGuestAllowedPath(String targetPath) { if (StringUtil.isEmpty(targetPath)) { return false; } return targetPath.startsWith("/pages_app/video/video") || targetPath.startsWith("/pages_app/videoDetail/videoDetail") || targetPath.startsWith("/pages_app/liveReplay/liveReplay") || targetPath.startsWith("/pages_app/replayList/replayList") || targetPath.startsWith("/pages_app/newsList/newsList") || targetPath.startsWith("/pages_app/news/news") || targetPath.startsWith("/pages_app/webview/webviewClass") || targetPath.startsWith("/pages_app/webview/webview") || targetPath.startsWith("/pages_app/ppt/ppt") || targetPath.startsWith("/pages_app/pptDetail/pptDetail"); } /** * 展示uniapp mp - 公共方法 * @param context 上下文 * @param targetPath */ public static void showUniMp(Context context, String targetPath, com.alibaba.fastjson.JSONObject pageParams) { try { if (!isGuestAllowedPath(targetPath) && !UIUtils.checkLoginAndJump(context)) { return; } checkWgt(context, targetPath, pageParams); } catch (Exception e) { e.printStackTrace(); } } //打开小程序 public static void show(Context context, String targetPath, com.alibaba.fastjson.JSONObject pageParams) { try { // 确保在主线程中执行,避免在后台线程中创建 Handler 导致异常 if (Looper.myLooper() == Looper.getMainLooper()) { // 已经在主线程,直接执行 showInternal(context, targetPath, pageParams); } else { // 不在主线程,切换到主线程执行 Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(new Runnable() { @Override public void run() { showInternal(context, targetPath, pageParams); } }); } } catch (Exception e) { e.printStackTrace(); } } private static void showInternal(Context context, String targetPath, com.alibaba.fastjson.JSONObject pageParams) { try { if (!isGuestAllowedPath(targetPath) && !UIUtils.checkLoginAndJump(context)) { return; } String uuid = SharePrefUtil.getString(context, Constant.uuid, ""); if(!isGuestAllowedPath(targetPath) && StringUtil.isEmpty(uuid)){ return; } String access_token = UIUtils.isLogined() ? SharePrefUtil.getString(context, "access_token", "") : ""; String QueryString = StringUtil.toQueryString(pageParams); JSONObject userInfo = new JSONObject(); userInfo.put("uuid", SharePrefUtil.getString(context, Constant.uuid, "")); userInfo.put("realName", SharePrefUtil.getString(context, Constant.realName, "")); userInfo.put("mobile", SharePrefUtil.getString(context, "mobile", "")); userInfo.put("photo", SharePrefUtil.getString(context, Constant.photo, "")); userInfo.put("qrcode", SharePrefUtil.getString(context, "qrcode", "")); userInfo.put("hospitalUuid", SharePrefUtil.getString(context, "hospitalUuid", "")); userInfo.put("hospitalName", SharePrefUtil.getString(context, "hospitalName", "")); userInfo.put("officeUuid", SharePrefUtil.getString(context, "officeUuid", "")); userInfo.put("officeName", SharePrefUtil.getString(context, "officeName", "")); userInfo.put("officePhone", SharePrefUtil.getString(context, "officePhone", "")); userInfo.put("positionUuid", SharePrefUtil.getString(context, "positionUuid", "")); userInfo.put("positionName", SharePrefUtil.getString(context, "positionName", "")); try { userInfo.put("isStar", SharePrefUtil.getString(context, "isStar", "")); }catch (Exception e){ userInfo.put("isStar", SharePrefUtil.getInt(context, "isStar", 0)); } String app_version = UpdateVersionUtils.getVersionName(); UniMPOpenConfiguration uniMPOpenConfiguration = new UniMPOpenConfiguration(); uniMPOpenConfiguration.splashClass = UniappSplashView.class; uniMPOpenConfiguration.extraData.put("darkmode", "light"); uniMPOpenConfiguration.extraData.put("apiHost", url_path); uniMPOpenConfiguration.extraData.put("token", access_token); uniMPOpenConfiguration.extraData.put("app_version", app_version); uniMPOpenConfiguration.extraData.put("userInfo", userInfo); IUniMP uniapp_MP_cash = BaseApplication.getUniMPCaches().get(uniapp_mp_appid); Log.d("UniappUtil","uniapp_MP_cash="+uniapp_MP_cash); if(uniapp_MP_cash != null){ Log.d("UniappUtil","uniapp_MP_cash.isRunning()="+uniapp_MP_cash.isRunning()); } //存在但是不在运行 if(uniapp_MP_cash != null && (!uniapp_MP_cash.isRunning() || !StringUtil.equals(lastUniMPToken, access_token))){ BaseApplication.getUniMPCaches().remove(uniapp_mp_appid); uniapp_MP_cash.closeUniMP(); uniapp_MP_cash = null; } if(false && uniapp_MP_cash != null && !uniapp_MP_cash.isRunning()){ BaseApplication.getUniMPCaches().remove(uniapp_mp_appid); uniapp_MP_cash.closeUniMP(); } if(uniapp_MP_cash != null && uniapp_MP_cash.isRunning()){ uniapp_MP_cash.sendUniMPEvent("goPage", targetPath+QueryString); uniapp_MP_cash.showUniMP(); }else{ if(StringUtil.notEmpty(targetPath)){ uniMPOpenConfiguration.extraData.put("targetPath", targetPath+QueryString); } // 优先使用传入的context(如果是Activity),否则使用mContext Context openContext = context; if (!(openContext instanceof android.app.Activity)) { // 如果传入的不是Activity,尝试从AppManager获取当前Activity android.app.Activity currentActivity = cn.shangyu.gdxzExpert.base.AppManager.getAppManager().currentActivity(); if (currentActivity != null) { openContext = currentActivity; } else { // 如果还是获取不到,使用mContext作为fallback openContext = mContext; } } IUniMP uniapp_MP = DCUniMPSDK.getInstance().openUniMP(openContext, uniapp_mp_appid, uniMPOpenConfiguration); lastUniMPToken = access_token != null ? access_token : ""; BaseApplication.getUniMPCaches().put(uniapp_MP.getAppid(), uniapp_MP); } } catch (Exception e) { e.printStackTrace(); } } public static void closeUniMP(){ IUniMP uniapp_MP = BaseApplication.getUniMPCaches().get(uniapp_mp_appid); if(uniapp_MP != null && uniapp_MP.isRunning()){ uniapp_MP.closeUniMP(); BaseApplication.getUniMPCaches().remove(uniapp_mp_appid); } } private static void checkWgt(Context context, String targetPath, com.alibaba.fastjson.JSONObject pageParams) throws JSONException { JSONObject jsonObject = DCUniMPSDK.getInstance().getAppVersionInfo(uniapp_mp_appid); if(jsonObject != null) { Integer current_version_code = Integer.parseInt(jsonObject.getString("code")); Log.d("checkWgt",current_version_code+",当前版本"); HttpMD5SendInfoUtil.sendHttp(Url.checkUniappWgt, null, new OnCallBackFromNet() { @Override public void onCallbackFromThread(String resultJson) { Log.d("checkWgt",resultJson); UniappMpCheckWgt checkWgt = GsonTools.fromGsonToBean(resultJson,UniappMpCheckWgt.class); if(checkWgt.getData() != null){ Log.d("checkWgt", checkWgt.getData().toString()); Integer new_version_code = checkWgt.getData().getVersion_code(); if(new_version_code != null && new_version_code > current_version_code){ Log.d("checkWgt", "去更新"); updateWgt(context, uniapp_mp_appid, checkWgt.getData().getUrl(), targetPath, pageParams); }else{ Log.d("checkWgt", "直接打开"); //真正打开小程序 show(context, targetPath, pageParams); } }else{ //真正打开小程序 show(context, targetPath, pageParams); } } @Override public void onCallBackFromThread(String resultJson, int resultCode) { } }); }else{ //真正打开小程序 show(context, targetPath, pageParams); } } /** * 热更新uniapp小程序 */ private static void updateWgt(Context context, String uniapp_appid, String wgtUrl, String targetPath, com.alibaba.fastjson.JSONObject pageParams) { // 替换真实的下载地址 final String wgtName = uniapp_appid + ".wgt"; String downFilePath = context.getExternalCacheDir().getPath(); // 确保使用主线程的 Looper 创建 Handler,避免在子线程中直接 new Handler() 导致异常 Handler uiHandler = new Handler(Looper.getMainLooper()); // 使用 final 数组来存储对话框引用,以便在内部类中访问 final CommonProgressDialog[] progressDialogRef = new CommonProgressDialog[1]; // 在主线程中创建和显示进度对话框 uiHandler.post(new Runnable() { @Override public void run() { CommonProgressDialog progressDialog = new CommonProgressDialog(context); progressDialog.setMessage("更新中"); progressDialog.setMax(100); progressDialog.setProgress(0); progressDialog.setCancelable(false); progressDialog.show(); progressDialogRef[0] = progressDialog; } }); UniappDownloadUtil.get().download(context, wgtUrl, downFilePath, wgtName, new UniappDownloadUtil.OnDownloadListener() { @Override public void onDownloadSuccess(File file) { UniMPReleaseConfiguration uniMPReleaseConfiguration = new UniMPReleaseConfiguration(); uniMPReleaseConfiguration.wgtPath = file.getPath(); // 没有密码可以不写 // uniMPReleaseConfiguration.password = "789456123"; uiHandler.post(new Runnable() { @Override public void run() { // 关闭进度对话框 if (progressDialogRef[0] != null && progressDialogRef[0].isShowing()) { progressDialogRef[0].dismiss(); } DCUniMPSDK.getInstance().releaseWgtToRunPath(uniapp_appid, uniMPReleaseConfiguration, new IUniMPReleaseCallBack() { @Override public void onCallBack(int code, Object pArgs) { if(code ==1) { //释放wgt完成 try { IUniMP uniMP = BaseApplication.getUniMPCaches().get(uniapp_appid); if(uniMP != null && uniMP.isRunning()){ uniMP.closeUniMP(); } //打开小程序 show(context, targetPath, pageParams); } catch (Exception e) { e.printStackTrace(); } } else{ //释放wgt失败 } } }); } }); } @Override public void onDownloading(int progress) { // Log.i("checkWgt", progress+""); final int finalProgress = progress; uiHandler.post(new Runnable() { @Override public void run() { // 更新进度对话框 if (progressDialogRef[0] != null && progressDialogRef[0].isShowing()) { progressDialogRef[0].setProgress(finalProgress); progressDialogRef[0].setMessage("更新中,请稍后"); } } }); } @Override public void onDownloadFailed() { Log.e("unimp", "downFilePath === onDownloadFailed"); uiHandler.post(new Runnable() { @Override public void run() { // 关闭进度对话框 if (progressDialogRef[0] != null && progressDialogRef[0].isShowing()) { progressDialogRef[0].dismiss(); } // 显示失败提示 ToastUtil.showToast("小程序更新失败,请稍后重试"); } }); } }); } }