33
This commit is contained in:
@@ -0,0 +1,748 @@
|
||||
package cn.shangyu.gdxzExpert.application;
|
||||
|
||||
import static cn.shangyu.gdxzExpert.ecdemo.common.utils.FileAccessor.IMESSAGE_IMAGE;
|
||||
import static cn.shangyu.gdxzExpert.utils.Constant.uniapp_mp_appid;
|
||||
|
||||
import android.app.Activity;
|
||||
import android.app.Application;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.SharedPreferences;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Process;
|
||||
import android.os.StrictMode;
|
||||
import android.text.TextUtils;
|
||||
import android.webkit.WebView;
|
||||
|
||||
import androidx.multidex.MultiDex;
|
||||
|
||||
import com.apowersoft.dlnasender.api.listener.WxDlnaSenderInitCallback;
|
||||
import com.easefun.polyvsdk.PolyvDevMountInfo;
|
||||
import com.easefun.polyvsdk.PolyvDownloaderManager;
|
||||
import com.easefun.polyvsdk.PolyvSDKClient;
|
||||
import com.heytap.msp.push.HeytapPushManager;
|
||||
import com.huawei.hms.support.common.ActivityMgr;
|
||||
import com.netease.nim.uikit.api.NimUIKit;
|
||||
import com.netease.nim.uikit.api.UIKitOptions;
|
||||
import com.netease.nim.uikit.business.contact.core.query.PinYin;
|
||||
import com.netease.nimlib.sdk.NIMClient;
|
||||
import com.netease.nimlib.sdk.Observer;
|
||||
import com.netease.nimlib.sdk.SDKOptions;
|
||||
import com.netease.nimlib.sdk.StatusCode;
|
||||
import com.netease.nimlib.sdk.auth.AuthService;
|
||||
import com.netease.nimlib.sdk.auth.AuthServiceObserver;
|
||||
import com.netease.nimlib.sdk.auth.LoginInfo;
|
||||
import com.netease.nimlib.sdk.mixpush.NIMPushClient;
|
||||
import com.netease.nimlib.sdk.util.NIMUtil;
|
||||
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiskCache;
|
||||
import com.nostra13.universalimageloader.cache.memory.impl.WeakMemoryCache;
|
||||
import com.nostra13.universalimageloader.core.DisplayImageOptions;
|
||||
import com.nostra13.universalimageloader.core.ImageLoader;
|
||||
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
|
||||
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
|
||||
import com.nostra13.universalimageloader.utils.StorageUtils;
|
||||
import com.umeng.analytics.MobclickAgent;
|
||||
import com.umeng.commonsdk.UMConfigure;
|
||||
import com.umeng.socialize.PlatformConfig;
|
||||
import com.zhy.http.okhttp.OkHttpUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InvalidClassException;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import io.dcloud.feature.sdk.Interface.IUniMP;
|
||||
|
||||
import cn.shangyu.gdxzExpert.activity.LoginNewActivity;
|
||||
import cn.shangyu.gdxzExpert.cast.PolyvScreencastManager;
|
||||
import cn.shangyu.gdxzExpert.ecdemo.common.CCPAppManager;
|
||||
import cn.shangyu.gdxzExpert.ecdemo.common.ECPreferenceSettings;
|
||||
import cn.shangyu.gdxzExpert.ecdemo.common.ECPreferences;
|
||||
import cn.shangyu.gdxzExpert.ecdemo.common.utils.FileAccessor;
|
||||
import cn.shangyu.gdxzExpert.netease.DemoCache;
|
||||
import cn.shangyu.gdxzExpert.netease.NIMInitManager;
|
||||
import cn.shangyu.gdxzExpert.netease.NimSDKOptionConfig;
|
||||
import cn.shangyu.gdxzExpert.netease.chatroom.ChatRoomSessionHelper;
|
||||
import cn.shangyu.gdxzExpert.netease.config.DefaultContactProvider;
|
||||
import cn.shangyu.gdxzExpert.netease.config.LogoutHelper;
|
||||
import cn.shangyu.gdxzExpert.netease.config.preference.Preferences;
|
||||
import cn.shangyu.gdxzExpert.netease.config.preference.UserPreferences;
|
||||
import cn.shangyu.gdxzExpert.netease.contact.ContactHelper;
|
||||
import cn.shangyu.gdxzExpert.netease.event.DemoOnlineStateContentProvider;
|
||||
import cn.shangyu.gdxzExpert.netease.mixpush.DemoMixPushMessageHandler;
|
||||
import cn.shangyu.gdxzExpert.netease.mixpush.DemoPushContentProvider;
|
||||
import cn.shangyu.gdxzExpert.netease.session.SessionHelper;
|
||||
import cn.shangyu.gdxzExpert.polyvplayer.util.PolyvStorageUtils;
|
||||
import cn.shangyu.gdxzExpert.umeng.PushHelper;
|
||||
import cn.shangyu.gdxzExpert.utils.Constant;
|
||||
import cn.shangyu.gdxzExpert.utils.LogUtil;
|
||||
import cn.shangyu.gdxzExpert.utils.StringUtil;
|
||||
import me.jessyan.autosize.AutoSize;
|
||||
import me.jessyan.autosize.AutoSizeConfig;
|
||||
import me.jessyan.autosize.onAdaptListener;
|
||||
import okhttp3.OkHttpClient;
|
||||
|
||||
|
||||
//import com.huawei.android.hms.agent.HMSAgent;
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* BaseApplication.java
|
||||
*
|
||||
* @author gaofei
|
||||
* @date 2015-8-31 上午9:54:20 Copyright (C) 2015 河南商宇科技有限公司
|
||||
*
|
||||
* 功能说明:application
|
||||
*/
|
||||
|
||||
public class BaseApplication extends Application {
|
||||
private static Context context;// 上下文
|
||||
private static int mainThreadId;
|
||||
private static Thread mainThread;
|
||||
private static Handler handler;
|
||||
private static SharedPreferences preferences;// sp
|
||||
public Object cache;// 全局临时对象存储
|
||||
private static BaseApplication instance;
|
||||
public static Map<String, Long> timemap;
|
||||
public static Map<String, Integer> lookNum;
|
||||
public static boolean refreshExpertDetial = false;// 刷新专家详情的鲜花数量
|
||||
public static final String APP_ID = "2882303761517470793";
|
||||
public static final String APP_KEY = "5431747048793";
|
||||
// 全局 UniMP 缓存,全页面共享
|
||||
private static HashMap<String, IUniMP> mUniMPCaches = new HashMap<>();
|
||||
@Override
|
||||
protected void attachBaseContext(Context base) {
|
||||
super.attachBaseContext(base);
|
||||
MultiDex.install(this);
|
||||
}
|
||||
/**
|
||||
* 单例,返回一个实例
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static BaseApplication getInstance() {
|
||||
if (instance == null) {
|
||||
LogUtil.w("[ECApplication] instance is null.");
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
public static void addNum(String uuid, int i) {
|
||||
int newnum = i;
|
||||
if (lookNum == null) {
|
||||
lookNum = new HashMap<String, Integer>();
|
||||
}
|
||||
for (Map.Entry<String, Integer> entry : lookNum.entrySet()) {
|
||||
if (entry.getKey().equals(uuid)) {
|
||||
newnum = entry.getValue() + i;
|
||||
}
|
||||
}
|
||||
lookNum.put(uuid, newnum);
|
||||
}
|
||||
|
||||
public static Map<String, Integer> getNumMap() {
|
||||
return lookNum;
|
||||
|
||||
}
|
||||
|
||||
public static void clearMap() {
|
||||
lookNum.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取全局 UniMP 缓存
|
||||
* @return UniMP 缓存 HashMap
|
||||
*/
|
||||
public static HashMap<String, IUniMP> getUniMPCaches() {
|
||||
return mUniMPCaches;
|
||||
}
|
||||
|
||||
private static List<String> tagList = new ArrayList<>();
|
||||
|
||||
public static List<String> getTagList() {
|
||||
return tagList;
|
||||
}
|
||||
|
||||
public static void setTagList(List<String> tagList) {
|
||||
BaseApplication.tagList = tagList;
|
||||
}
|
||||
|
||||
private static Boolean notify = false;
|
||||
|
||||
public static Boolean getNotify() {
|
||||
return notify;
|
||||
}
|
||||
|
||||
public static void setNotify(Boolean notify) {
|
||||
BaseApplication.notify = notify;
|
||||
}
|
||||
|
||||
private static Boolean notifyexit = false;
|
||||
|
||||
public static Boolean getNotifyexit() {
|
||||
return notifyexit;
|
||||
}
|
||||
|
||||
public static void setNotifyexit(Boolean notifyexit) {
|
||||
BaseApplication.notifyexit = notifyexit;
|
||||
}
|
||||
|
||||
private static Boolean iscollent = false;
|
||||
|
||||
public static Boolean getIscollent() {
|
||||
return iscollent;
|
||||
}
|
||||
|
||||
public static void setIscollent(Boolean iscollent) {
|
||||
BaseApplication.iscollent = iscollent;
|
||||
}
|
||||
|
||||
// UIKit初始化标志,防止重复初始化
|
||||
private static boolean isUIKitInitialized = false;
|
||||
{
|
||||
|
||||
PlatformConfig.setWeixin("wxbf3658f5e674667c",
|
||||
"c4505a04a9910c65efea8e11ffc93f92");
|
||||
|
||||
PlatformConfig
|
||||
.setSinaWeibo("2071931330", "a7f66853db58d51374571691e5cf36a9",
|
||||
"http://sns.whalecloud.com");
|
||||
}
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
|
||||
AutoSize.initCompatMultiProcess(this);
|
||||
//如果在某些特殊情况下出现 InitProvider 未能正常实例化, 导致 AndroidAutoSize 未能完成初始化
|
||||
//可以主动调用 AutoSize.checkAndInit(this) 方法, 完成 AndroidAutoSize 的初始化后即可正常使用
|
||||
// AutoSize.checkAndInit(this);
|
||||
|
||||
// 如何控制 AndroidAutoSize 的初始化,让 AndroidAutoSize 在某些设备上不自动启动?https://github.com/JessYanCoding/AndroidAutoSize/issues/249
|
||||
|
||||
|
||||
AutoSizeConfig.getInstance()
|
||||
.setCustomFragment(true)
|
||||
.setExcludeFontScale(true)
|
||||
//区别于系统字体大小的放大比例, AndroidAutoSize 允许 APP 内部可以独立于系统字体大小之外,独自拥有全局调节 APP 字体大小的能力
|
||||
//当然, 在 APP 内您必须使用 sp 来作为字体的单位, 否则此功能无效, 不设置或将此值设为 0 则取消此功能
|
||||
// .setPrivateFontScale(0.8f)
|
||||
//屏幕适配监听器
|
||||
.setOnAdaptListener(new onAdaptListener() {
|
||||
@Override
|
||||
public void onAdaptBefore(Object target, Activity activity) {
|
||||
//使用以下代码, 可以解决横竖屏切换时的屏幕适配问题
|
||||
//使用以下代码, 可支持 Android 的分屏或缩放模式, 但前提是在分屏或缩放模式下当用户改变您 App 的窗口大小时
|
||||
//系统会重绘当前的页面, 经测试在某些机型, 某些情况下系统不会重绘当前页面, ScreenUtils.getScreenSize(activity) 的参数一定要不要传 Application!!!
|
||||
// AutoSizeConfig.getInstance().setScreenWidth(ScreenUtils.getScreenSize(activity)[0]);
|
||||
// AutoSizeConfig.getInstance().setScreenHeight(ScreenUtils.getScreenSize(activity)[1]);
|
||||
// AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptBefore!", target.getClass().getName()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAdaptAfter(Object target, Activity activity) {
|
||||
// AutoSizeLog.d(String.format(Locale.ENGLISH, "%s onAdaptAfter!", target.getClass().getName()));
|
||||
}
|
||||
});
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
|
||||
WebView.setDataDirectorySuffix(Process.myPid() + "");
|
||||
}
|
||||
context = getApplicationContext();
|
||||
// mainThreadId
|
||||
mainThreadId = android.os.Process.myTid();
|
||||
// Thread-->object
|
||||
mainThread = Thread.currentThread();
|
||||
// Handler
|
||||
handler = new Handler();//wcx以前
|
||||
|
||||
// SharedPreferences
|
||||
preferences = getSharedPreferences(Constant.SP_NAME, 0);
|
||||
|
||||
// 容联
|
||||
instance = this;
|
||||
|
||||
//
|
||||
// 崩溃处理测试环境打卡
|
||||
// if (CrashHandler.getInstance() != null) {
|
||||
// CrashHandler.getInstance().init(getApplicationContext());
|
||||
// }
|
||||
|
||||
|
||||
boolean isFirstRun=this.getSharedPreferences("share",MODE_PRIVATE).getBoolean("isFirstRun", true);
|
||||
if(!isFirstRun)//隐私权限
|
||||
{
|
||||
initYinsi();
|
||||
}
|
||||
}
|
||||
public void initYinsi()
|
||||
{
|
||||
OkHttpClient okHttpClient = new OkHttpClient.Builder()
|
||||
.connectTimeout(10000L, TimeUnit.MILLISECONDS)
|
||||
.readTimeout(10000L, TimeUnit.MILLISECONDS)
|
||||
//其他配置
|
||||
.build();
|
||||
|
||||
OkHttpUtils.initClient(okHttpClient);
|
||||
CCPAppManager.setContext(instance);
|
||||
FileAccessor.initFileAccess();
|
||||
setChattingContactId();
|
||||
hookWebView();
|
||||
|
||||
YunXininit();
|
||||
//日志开关
|
||||
UMConfigure.setLogEnabled(false);
|
||||
//预初始化
|
||||
PushHelper.preInit(this);
|
||||
initImageLoader();
|
||||
// 创建默认的ImageLoader配置参数
|
||||
// ImageLoaderConfiguration configuration = ImageLoaderConfiguration.createDefault(this);
|
||||
// ImageLoader.getInstance().init(configuration);
|
||||
|
||||
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
|
||||
StrictMode.setVmPolicy(builder.build());
|
||||
|
||||
builder.detectFileUriExposure();
|
||||
//初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
|
||||
UMConfigure.init(context, "56caa908e0f55aeff4001cd0", "Umeng", UMConfigure.DEVICE_TYPE_PHONE,
|
||||
"38088a7ef3b841e2db034b2f212a4a68");
|
||||
//统计SDK是否支持采集在子进程中打点的自定义事件,默认不支持
|
||||
UMConfigure.setProcessEvent(true);//支持多进程打点
|
||||
MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
|
||||
initPolyvCilent();
|
||||
if (NIMUtil.isMainProcess(this)) {
|
||||
//启动优化:建议在子线程中执行初始化
|
||||
new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
PushHelper.init(getApplicationContext());
|
||||
}
|
||||
}).start();
|
||||
} else {
|
||||
//若不是主进程(":channel"结尾的进程),直接初始化sdk,不可在子线程中执行
|
||||
PushHelper.init(getApplicationContext());
|
||||
}
|
||||
// // 微信设置
|
||||
// PlatformConfig.setWeixin("wxbf3658f5e674667c","c4505a04a9910c65efea8e11ffc93f92");
|
||||
// PlatformConfig.setWXFileProvider("cn.shangyu.gdxzExpert.fileprovider");
|
||||
// // QQ设置
|
||||
// PlatformConfig.setQQZone("101830139","5d63ae8858f1caab67715ccd6c18d7a5");
|
||||
// PlatformConfig.setQQFileProvider("cn.shangyu.gdxzExpert.fileprovider");
|
||||
// // 新浪微博设置
|
||||
// PlatformConfig.setSinaWeibo("3921700954","04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com");
|
||||
// PlatformConfig.setSinaFileProvider("cn.shangyu.gdxzExpert.fileprovider");
|
||||
// SpeechUtility.createUtility(context, SpeechConstant.APPID +"=5975b26b");
|
||||
initScreencast();
|
||||
}
|
||||
|
||||
public void initScreencast() {
|
||||
// TODO appId和appSecret需与包名绑定,获取方式请咨询Polyv技术支持
|
||||
PolyvScreencastManager.init(this, "kZF19ndHgR63a2b0efd7b82707734951", "2AA1A-6648B-8F35D-7FB52", new WxDlnaSenderInitCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
// 初始化单例
|
||||
PolyvScreencastManager.getInstance(BaseApplication.this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFail(int code, String msg) {
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/** 加密秘钥 */
|
||||
private String aeskey = "VXtlHmwfS2oYm0CZ";
|
||||
/** 加密向量 */
|
||||
private String iv = "2u9gDPKdX6GyQJKU";
|
||||
|
||||
public void initPolyvCilent() {
|
||||
//网络方式取得SDK加密串,(推荐)
|
||||
//网络获取到的SDK加密串可以保存在本地SharedPreference中,下次先从本地获取
|
||||
// new LoadConfigTask().execute();
|
||||
PolyvSDKClient client = PolyvSDKClient.getInstance();
|
||||
//使用SDK加密串来配置
|
||||
client.setConfig("LysMwMlSFaiHu/03UrkCrxekGbFAZSXnnNkCi9QMdJPX2J5nTOHbwB626iIKXC6YvF+KYXGL3HStxEzHThvT61d9SNXpfKBF7i6NKd1VtFVAoOs+hg4FL2m7NoRsAO05j02uGzd/d9imbZvBchKP8w==", aeskey, iv, getApplicationContext());
|
||||
//初始化SDK设置
|
||||
client.initSetting(getApplicationContext());
|
||||
//启动Bugly
|
||||
// client.initCrashReport(getApplicationContext());
|
||||
//启动Bugly后,在学员登录时设置学员id
|
||||
// client.crashReportSetUserId(userId);
|
||||
setDownloadDir();
|
||||
// 设置下载队列总数,多少个视频能同时下载。(默认是1,设置负数和0是没有限制)
|
||||
PolyvDownloaderManager.setDownloadQueueCount(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置下载视频目录
|
||||
*/
|
||||
private void setDownloadDir() {
|
||||
String rootDownloadDirName = "polyvdownload";
|
||||
ArrayList<File> externalFilesDirs = PolyvStorageUtils.getExternalFilesDirs(getApplicationContext());
|
||||
if (externalFilesDirs.size() == 0) {
|
||||
// TODO 没有可用的存储设备,后续不能使用视频缓存功能
|
||||
return;
|
||||
}
|
||||
|
||||
//SD卡会有SD卡接触不良,SD卡坏了,SD卡的状态错误的问题。
|
||||
//我们在开发中也遇到了SD卡没有权限写入的问题,但是我们确定APP是有赋予android.permission.WRITE_EXTERNAL_STORAGE权限的。
|
||||
//有些是系统问题,有些是SD卡本身的问题,这些问题需要通过重新拔插SD卡或者更新SD卡来解决。所以如果想要保存下载视频至SD卡请了解这些情况。
|
||||
File downloadDir = new File(externalFilesDirs.get(0), rootDownloadDirName);
|
||||
PolyvSDKClient.getInstance().setDownloadDir(downloadDir);
|
||||
|
||||
//兼容旧下载视频目录,如果新接入SDK,无需使用以下代码
|
||||
//获取SD卡信息
|
||||
PolyvDevMountInfo.getInstance().init(this, new PolyvDevMountInfo.OnLoadCallback() {
|
||||
|
||||
@Override
|
||||
public void callback() {
|
||||
//是否有可移除的存储介质(例如 SD 卡)或内部(不可移除)存储可供使用。
|
||||
if (!PolyvDevMountInfo.getInstance().isSDCardAvaiable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
//可移除的存储介质(例如 SD 卡),需要写入特定目录/storage/sdcard1/Android/data/包名/。
|
||||
//现在PolyvDevMountInfo.getInstance().getExternalSDCardPath()默认返回的目录路径就是/storage/sdcard1/Android/data/包名/。
|
||||
//跟PolyvDevMountInfo.getInstance().init(Context context, final OnLoadCallback callback)接口有区别,请保持同步修改。
|
||||
ArrayList<File> subDirList = new ArrayList<>();
|
||||
String externalSDCardPath = PolyvDevMountInfo.getInstance().getExternalSDCardPath();
|
||||
if (!TextUtils.isEmpty(externalSDCardPath)) {
|
||||
StringBuilder dirPath = new StringBuilder();
|
||||
dirPath.append(externalSDCardPath).append(File.separator).append("polyvdownload");
|
||||
File saveDir = new File(dirPath.toString());
|
||||
if (!saveDir.exists()) {
|
||||
saveDir.mkdirs();//创建下载目录
|
||||
}
|
||||
|
||||
//设置下载存储目录
|
||||
// PolyvSDKClient.getInstance().setDownloadDir(saveDir);
|
||||
// return;
|
||||
subDirList.add(saveDir);
|
||||
}
|
||||
|
||||
//如果没有可移除的存储介质(例如 SD 卡),那么一定有内部(不可移除)存储介质可用,都不可用的情况在前面判断过了。
|
||||
File saveDir = new File(PolyvDevMountInfo.getInstance().getInternalSDCardPath() + File.separator + "polyvdownload");
|
||||
if (!saveDir.exists()) {
|
||||
saveDir.mkdirs();//创建下载目录
|
||||
}
|
||||
|
||||
//设置下载存储目录
|
||||
// PolyvSDKClient.getInstance().setDownloadDir(saveDir);
|
||||
subDirList.add(saveDir);
|
||||
PolyvSDKClient.getInstance().setSubDirList(subDirList);
|
||||
}
|
||||
}, true);
|
||||
}
|
||||
public static Context getContext() {
|
||||
return context;
|
||||
}
|
||||
|
||||
public static int getMainThreadId() {
|
||||
return mainThreadId;
|
||||
}
|
||||
|
||||
public static Thread getMainThread() {
|
||||
return mainThread;
|
||||
}
|
||||
|
||||
public static Handler getHandler() {
|
||||
return handler;
|
||||
}
|
||||
|
||||
public static SharedPreferences getSharedPreferences() {
|
||||
return preferences;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 保存当前的聊天界面所对应的联系人、方便来消息屏蔽通知
|
||||
*/
|
||||
private void setChattingContactId() {
|
||||
try {
|
||||
ECPreferences.savePreference(
|
||||
ECPreferenceSettings.SETTING_CHATTING_CONTACTID, "", true);
|
||||
} catch (InvalidClassException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void initImageLoader() {
|
||||
// File cacheDir = StorageUtils.getOwnCacheDirectory(
|
||||
// getApplicationContext(), "gdxzExpert/image11");
|
||||
File cacheDir = StorageUtils.getOwnCacheDirectory(
|
||||
getApplicationContext(), IMESSAGE_IMAGE);
|
||||
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
|
||||
this).threadPoolSize(1)
|
||||
// 线程池内加载的数量
|
||||
.threadPriority(Thread.NORM_PRIORITY - 2)
|
||||
.memoryCache(new WeakMemoryCache())
|
||||
// .denyCacheImageMultipleSizesInMemory()
|
||||
.diskCacheFileNameGenerator(CCPAppManager.md5FileNameGenerator)
|
||||
// 将保存的时候的URI名称用MD5 加密
|
||||
.tasksProcessingOrder(QueueProcessingType.LIFO)
|
||||
.diskCache(
|
||||
new UnlimitedDiskCache(cacheDir, null,
|
||||
CCPAppManager.md5FileNameGenerator))// 自定义缓存路径
|
||||
// .diskCache(new UnlimitedDiskCache(cacheDir))//自定义缓存路径
|
||||
.defaultDisplayImageOptions(DisplayImageOptions.createSimple())
|
||||
// .writeDebugLogs() // Remove for release app
|
||||
.build();// 开始构建
|
||||
ImageLoader.getInstance().init(config);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public void onLowMemory() {
|
||||
super.onLowMemory();
|
||||
}
|
||||
|
||||
public static List<Activity> addCards;
|
||||
|
||||
public static void addActivity(Activity ma) {
|
||||
if (addCards == null) {
|
||||
addCards = new ArrayList<Activity>();
|
||||
}
|
||||
addCards.add(ma);
|
||||
}
|
||||
|
||||
public static void finishActivity() {
|
||||
if (addCards != null) {
|
||||
for (int i = 0; i < addCards.size(); i++) {
|
||||
addCards.get(i).finish();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// private void initX5WebView() {
|
||||
//
|
||||
// //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。
|
||||
// QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
|
||||
// @Override
|
||||
// public void onViewInitFinished(boolean arg0) {
|
||||
// //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
|
||||
// Log.d("app", " onViewInitFinished is " + arg0);
|
||||
//
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onCoreInitFinished() {
|
||||
// }
|
||||
// };
|
||||
// //x5内核初始化接口
|
||||
// QbSdk.initX5Environment(getApplicationContext(), cb);
|
||||
//
|
||||
// }
|
||||
|
||||
public static void hookWebView() {
|
||||
int sdkInt = Build.VERSION.SDK_INT;
|
||||
try {
|
||||
Class<?> factoryClass = Class.forName("android.webkit.WebViewFactory");
|
||||
Field field = factoryClass.getDeclaredField("sProviderInstance");
|
||||
field.setAccessible(true);
|
||||
Object sProviderInstance = field.get(null);
|
||||
if (sProviderInstance != null) {
|
||||
LogUtil.i("sProviderInstance isn't null");
|
||||
return;
|
||||
}
|
||||
Method getProviderClassMethod;
|
||||
if (sdkInt > 22) {
|
||||
getProviderClassMethod = factoryClass.getDeclaredMethod("getProviderClass");
|
||||
} else if (sdkInt == 22) {
|
||||
getProviderClassMethod = factoryClass.getDeclaredMethod("getFactoryClass");
|
||||
} else {
|
||||
LogUtil.i("Don't need to Hook WebView");
|
||||
return;
|
||||
}
|
||||
getProviderClassMethod.setAccessible(true);
|
||||
Class<?> providerClass = (Class<?>) getProviderClassMethod.invoke(factoryClass);
|
||||
Class<?> delegateClass = Class.forName("android.webkit.WebViewDelegate");
|
||||
Constructor<?> providerConstructor = providerClass.getConstructor(delegateClass);
|
||||
if (providerConstructor != null) {
|
||||
providerConstructor.setAccessible(true);
|
||||
Constructor<?> declaredConstructor = delegateClass.getDeclaredConstructor();
|
||||
declaredConstructor.setAccessible(true);
|
||||
sProviderInstance = providerConstructor.newInstance(declaredConstructor.newInstance());
|
||||
LogUtil.i("sProviderInstance:{}", sProviderInstance+"");
|
||||
field.set("sProviderInstance", sProviderInstance);
|
||||
}
|
||||
LogUtil.i("Hook done!");
|
||||
} catch (Throwable e) {
|
||||
LogUtil.i(e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 云信初始化
|
||||
*/
|
||||
public void YunXininit()
|
||||
{
|
||||
DemoCache.setContext(this);
|
||||
|
||||
// 4.6.0 开始,第三方推送配置入口改为 SDKOption#mixPushConfig,旧版配置方式依旧支持。
|
||||
|
||||
SDKOptions sdkOptions = NimSDKOptionConfig.getSDKOptions(this);
|
||||
sdkOptions.disableAwake=true;
|
||||
NIMClient.init(this, getLoginInfo(), sdkOptions);
|
||||
// crash handler
|
||||
// AppCrashHandler.getInstance(this);
|
||||
|
||||
// 以下逻辑只在主进程初始化时执行
|
||||
if (NIMUtil.isMainProcess(this)) {
|
||||
// 华为推送
|
||||
ActivityMgr.INST.init(this);
|
||||
// // 初始化OPPO PUSH服务,创建默认通道
|
||||
HeytapPushManager.init(this, false);
|
||||
|
||||
|
||||
// 注册自定义推送消息处理,这个是可选项
|
||||
NIMPushClient.registerMixPushMessageHandler(new DemoMixPushMessageHandler());
|
||||
|
||||
// 初始化红包模块,在初始化UIKit模块之前执行
|
||||
// NIMRedPacketClient.init(this);
|
||||
// init pinyin
|
||||
PinYin.init(this);
|
||||
PinYin.validate();
|
||||
// 初始化UIKit模块
|
||||
initUIKit();
|
||||
// 初始化消息提醒
|
||||
NIMClient.toggleNotification(UserPreferences.getNotificationToggle());
|
||||
//关闭撤回消息提醒
|
||||
// NIMClient.toggleRevokeMessageNotification(false);
|
||||
// 云信sdk相关业务初始化
|
||||
NIMInitManager.getInstance().init(true);
|
||||
NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus(userStatusObserver, true);
|
||||
// 初始化音视频模块
|
||||
// initAVChatKit();
|
||||
// // 初始化rts模块
|
||||
// initRTSKit();
|
||||
|
||||
}
|
||||
//初始化融合 SDK 中的七鱼业务关业务
|
||||
// initMixSdk();
|
||||
|
||||
|
||||
|
||||
}
|
||||
/**
|
||||
* 用户状态变化
|
||||
*/
|
||||
Observer<StatusCode> userStatusObserver = new Observer<StatusCode>() {
|
||||
|
||||
@Override
|
||||
public void onEvent(StatusCode code) {
|
||||
if (code.wontAutoLogin()) {
|
||||
|
||||
if(code!=StatusCode.PWD_ERROR)
|
||||
{
|
||||
|
||||
IUniMP uniapp_MP = BaseApplication.getUniMPCaches().get(uniapp_mp_appid);
|
||||
if(uniapp_MP != null && uniapp_MP.isRunning()){
|
||||
uniapp_MP.closeUniMP();
|
||||
}
|
||||
|
||||
LogoutHelper.logout();
|
||||
showlogout();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
};
|
||||
private void showlogout()
|
||||
{
|
||||
|
||||
|
||||
|
||||
String phone="ios";
|
||||
switch(NIMClient.getService(AuthService.class).getKickedClientType())
|
||||
{
|
||||
case 1:
|
||||
phone="android";
|
||||
break;
|
||||
case 2:
|
||||
phone="ios";
|
||||
break;
|
||||
case 16:
|
||||
phone="web";
|
||||
break;
|
||||
default:
|
||||
phone="";
|
||||
break;
|
||||
|
||||
}
|
||||
if(!StringUtil.isEmpty(phone))
|
||||
{
|
||||
|
||||
Intent intent = new Intent(getApplicationContext(), LoginNewActivity.class);
|
||||
intent.putExtra("kick_out",phone);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private LoginInfo getLoginInfo() {
|
||||
String account = Preferences.getUserAccount();
|
||||
String token = Preferences.getUserToken();
|
||||
|
||||
if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
|
||||
DemoCache.setAccount(account.toLowerCase());
|
||||
return new LoginInfo(account, token);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
private void initUIKit() {
|
||||
// 防止重复初始化
|
||||
if (isUIKitInitialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 初始化
|
||||
// NimUIKit.init(this, buildUIKitOptions());
|
||||
NimUIKit.init(this, buildUIKitOptions(),null,new DefaultContactProvider());
|
||||
// 设置地理位置提供者。如果需要发送地理位置消息,该参数必须提供。如果不需要,可以忽略。
|
||||
// NimUIKit.setLocationProvider(new NimDemoLocationProvider());
|
||||
|
||||
// IM 会话窗口的定制初始化。
|
||||
SessionHelper.init();
|
||||
|
||||
// 聊天室聊天窗口的定制初始化。
|
||||
ChatRoomSessionHelper.init();
|
||||
|
||||
// 通讯录列表定制初始化
|
||||
ContactHelper.init();
|
||||
|
||||
// 添加自定义推送文案以及选项,请开发者在各端(Android、IOS、PC、Web)消息发送时保持一致,以免出现通知不一致的情况
|
||||
NimUIKit.setCustomPushContentProvider(new DemoPushContentProvider());
|
||||
|
||||
NimUIKit.setOnlineStateContentProvider(new DemoOnlineStateContentProvider());
|
||||
|
||||
isUIKitInitialized = true;
|
||||
LogUtil.i("UIKit初始化成功");
|
||||
} catch (Exception e) {
|
||||
LogUtil.e("UIKit初始化失败: " + e.getMessage());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
private UIKitOptions buildUIKitOptions() {
|
||||
UIKitOptions options = new UIKitOptions();
|
||||
// 设置app图片/音频/日志等缓存目录
|
||||
options.appCacheDir = NimSDKOptionConfig.getAppCacheDir(this) + "/app";
|
||||
return options;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user