Files
expert-app/app/src/main/java/cn/shangyu/gdxzExpert/utils/UniappUtil.java
T
2026-11-03 11:10:38 +08:00

366 lines
17 KiB
Java

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("小程序更新失败,请稍后重试");
}
});
}
});
}
}