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