372 lines
15 KiB
Java
372 lines
15 KiB
Java
package com.shayu.phonelive;
|
||
|
||
import static com.yunbao.live.socket.SocketClient.mSocketHandler;
|
||
|
||
import android.app.Activity;
|
||
import android.app.ActivityManager;
|
||
import android.content.Context;
|
||
import android.net.http.HttpResponseCache;
|
||
import android.os.Build;
|
||
import android.os.Bundle;
|
||
import android.os.Handler;
|
||
import android.os.Looper;
|
||
import android.os.Message;
|
||
import android.os.Process;
|
||
import android.text.TextUtils;
|
||
import android.util.Log;
|
||
|
||
import androidx.annotation.NonNull;
|
||
import androidx.annotation.Nullable;
|
||
|
||
import com.alibaba.android.arouter.launcher.ARouter;
|
||
import com.alibaba.fastjson.JSON;
|
||
import com.alibaba.fastjson.JSONObject;
|
||
import com.blankj.utilcode.util.Utils;
|
||
import com.facebook.appevents.AppEventsLogger;
|
||
import com.fm.openinstall.OpenInstall;
|
||
import com.google.gson.Gson;
|
||
import com.shayu.phonelive.utils.LogUtils;
|
||
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
|
||
import com.tencent.imsdk.v2.V2TIMManager;
|
||
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
|
||
import com.tencent.imsdk.v2.V2TIMUserInfo;
|
||
import com.umeng.analytics.MobclickAgent;
|
||
import com.umeng.commonsdk.UMConfigure;
|
||
import com.yunbao.common.BuildConfig;
|
||
import com.yunbao.common.CommonAppConfig;
|
||
import com.yunbao.common.CommonAppContext;
|
||
import com.yunbao.common.Constants;
|
||
import com.yunbao.common.bean.AnchorStartLiveBean;
|
||
import com.yunbao.common.bean.CrashSaveBean;
|
||
import com.yunbao.common.event.SudGameSocketImEvent;
|
||
import com.yunbao.common.manager.imrongcloud.InstructorSendReward;
|
||
import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider;
|
||
import com.yunbao.common.manager.imrongcloud.MessageIMManager;
|
||
import com.yunbao.common.manager.imrongcloud.RecommendLiveRoom;
|
||
import com.yunbao.common.manager.imrongcloud.RongcloudIMManager;
|
||
import com.yunbao.common.message.content.MessageChatTipsContent;
|
||
import com.yunbao.common.provider.MessageChatTipsItemProvider;
|
||
import com.yunbao.common.utils.AppManager;
|
||
import com.yunbao.common.utils.Bus;
|
||
import com.yunbao.common.utils.GoogleUtils;
|
||
import com.yunbao.common.utils.L;
|
||
import com.yunbao.common.utils.SpUtil;
|
||
import com.yunbao.live.socket.SocketReceiveBean;
|
||
import com.yunbao.live.socket.SocketRyClient;
|
||
import com.yunbao.live.utils.LiveImDeletUtil;
|
||
import com.yunbao.live.views.PortraitLiveManager;
|
||
import com.yunbao.live.views.RecommendLiveRoomProvider;
|
||
import com.yunbao.main.activity.MsgSettActivity;
|
||
|
||
import org.greenrobot.eventbus.EventBus;
|
||
|
||
import java.io.File;
|
||
import java.io.IOException;
|
||
import java.lang.ref.WeakReference;
|
||
import java.util.ArrayList;
|
||
import java.util.Arrays;
|
||
import java.util.List;
|
||
|
||
import io.rong.imkit.config.RongConfigCenter;
|
||
import io.rong.imlib.RongIMClient;
|
||
import io.rong.imlib.model.Conversation;
|
||
import io.rong.imlib.model.MessageContent;
|
||
import io.rong.message.TextMessage;
|
||
|
||
//import cn.tillusory.sdk.TiSDK;
|
||
|
||
//import com.squareup.leakcanary.LeakCanary;
|
||
|
||
|
||
/**
|
||
* Created by cxf on 2017/8/3.
|
||
*/
|
||
|
||
public class AppContext extends CommonAppContext {
|
||
|
||
public static AppContext sInstance;
|
||
public LiveImDeletUtil liveImDeletUtil;
|
||
private final static List<WeakReference<Activity>> activities = new ArrayList<>();
|
||
|
||
|
||
private static final class AdjustLifecycleCallbacks implements ActivityLifecycleCallbacks {
|
||
@Override
|
||
public void onActivityResumed(Activity activity) {
|
||
}
|
||
|
||
@Override
|
||
public void onActivityPaused(Activity activity) {
|
||
}
|
||
|
||
@Override
|
||
public void onActivityStopped(@NonNull Activity activity) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onActivityDestroyed(@NonNull Activity activity) {
|
||
for (WeakReference<Activity> reference : activities) {
|
||
if (reference.get() == activity) {
|
||
activities.remove(reference);
|
||
return;
|
||
}
|
||
}
|
||
AppManager.getInstance().removeActivity(activity);
|
||
}
|
||
|
||
@Override
|
||
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
|
||
activities.add(new WeakReference<>(activity));
|
||
CrashSaveBean.getInstance().setActivitySize(activities);
|
||
AppManager.getInstance().addActivity(activity);
|
||
}
|
||
|
||
@Override
|
||
public void onActivityStarted(@NonNull Activity activity) {
|
||
|
||
}
|
||
|
||
}
|
||
|
||
@Override
|
||
public void onCreate() {
|
||
super.onCreate();
|
||
if (!isMainProcess()) {
|
||
return;
|
||
}
|
||
CrashSaveBean.getInstance().setStartTime(System.currentTimeMillis());
|
||
//注册全局异常捕获
|
||
registerError();
|
||
registerFirebaseCrash();
|
||
LogUtils.start(this);
|
||
sInstance = this;
|
||
L.setDeBug(BuildConfig.DEBUG);
|
||
AppEventsLogger.activateApp(this);
|
||
|
||
File httpCacheDir = new File(getCacheDir(), "https");
|
||
try {
|
||
HttpResponseCache.install(httpCacheDir, 1024 * 1024 * 128);
|
||
} catch (IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
//初始化 ARouter
|
||
if (BuildConfig.DEBUG) {
|
||
ARouter.openLog();
|
||
ARouter.openDebug();
|
||
}
|
||
ARouter.init(this);
|
||
|
||
//初始化 邀请码库
|
||
if (isMainProcess()) {
|
||
OpenInstall.init(this);
|
||
}
|
||
//设置LOG开关,默认为false
|
||
UMConfigure.setLogEnabled(true);
|
||
|
||
|
||
//友盟正式初始化
|
||
UMConfigure.init(getApplicationContext(), "64e40ee55488fe7b3afa2c96", "PDLive", UMConfigure.DEVICE_TYPE_PHONE, "64e40ee55488fe7b3afa2c96");
|
||
|
||
//集成umeng-crash-vx.x.x.aar,则需要关闭原有统计SDK异常捕获功能
|
||
MobclickAgent.setCatchUncaughtExceptions(false);
|
||
//PushSDK初始化(如使用推送SDK,必须调用此方法)
|
||
|
||
//统计SDK是否支持采集在子进程中打点的自定义事件,默认不支持
|
||
UMConfigure.setProcessEvent(true);//支持多进程打点
|
||
MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
|
||
UMConfigure.submitPolicyGrantResult(getApplicationContext(), true);
|
||
|
||
registerActivityLifecycleCallbacks(new AdjustLifecycleCallbacks());
|
||
//初始化 AndroidUtilCode
|
||
Utils.init(this);
|
||
liveImDeletUtil = new LiveImDeletUtil();
|
||
|
||
//初始化融云
|
||
RongcloudIMManager.initRongIM(this);
|
||
ArrayList<Class<? extends MessageContent>> myMessages = new ArrayList<>();
|
||
myMessages.add(RecommendLiveRoom.class);
|
||
myMessages.add(InstructorSendReward.class);
|
||
myMessages.add(MessageChatTipsContent.class);
|
||
|
||
RongIMClient.registerMessageType(myMessages);
|
||
// 注册自定义消息模板
|
||
RongConfigCenter.conversationConfig().addMessageProvider(new InstructorSendRewardProvider(getApplicationContext()));
|
||
RongConfigCenter.conversationConfig().addMessageProvider(new RecommendLiveRoomProvider(getApplicationContext()));
|
||
RongConfigCenter.conversationConfig().addMessageProvider(new MessageChatTipsItemProvider(getApplicationContext()));
|
||
|
||
RongcloudIMManager.addRongcloudIMOnReceiveMessageListener(new RongIMClient.OnReceiveMessageWrapperListener() {
|
||
@Override
|
||
public boolean onReceived(io.rong.imlib.model.Message message, int i, boolean b, boolean b1) {
|
||
Log.e("wewe", message.getConversationType() + "112121");
|
||
MessageIMManager.get(sInstance).getSystemForRongcloud(message);
|
||
//融云直播间聊天
|
||
Message msg = Message.obtain();
|
||
msg.what = Constants.SOCKET_WHAT_BROADCAST;
|
||
try {
|
||
if (!"".equals(message.getContent()) && message.getContent() != null) {
|
||
TextMessage content = (TextMessage) message.getContent();
|
||
if (content.getContent().contains("_method_")) {
|
||
msg.obj = content.getContent();
|
||
//观众页面
|
||
if (SocketRyClient.mSocketHandler != null && (TextUtils.equals("__system__", message.getTargetId()) || ("g" + PortraitLiveManager.liveID).contains(message.getTargetId()))) {
|
||
SocketRyClient.mSocketHandler.sendMessage(msg);
|
||
} else if (content.getContent().contains("LivePK_anchorStartLiveNotify")) {//开播通知
|
||
SocketReceiveBean received = JSON.parseObject(content.getContent(), SocketReceiveBean.class);
|
||
JSONObject map = received.getMsg().getJSONObject(0);
|
||
sendStartAnchorLive(map);
|
||
} else if (message.getTargetId().contains("v")) {
|
||
String contentJson = ((TextMessage) message.getContent()).getContent();
|
||
Log.e("wewe", contentJson);
|
||
SudGameSocketImEvent sudGameSocketImEvent = new Gson().fromJson(contentJson, SudGameSocketImEvent.class);
|
||
Bus.get().post(sudGameSocketImEvent);
|
||
}
|
||
//主播页面
|
||
if (TextUtils.isEmpty(PortraitLiveManager.liveID) && SocketRyClient.mSocketHandler != null) {
|
||
SocketRyClient.mSocketHandler.sendMessage(msg);
|
||
}
|
||
|
||
} else if (message.getConversationType() == Conversation.ConversationType.PRIVATE) {//私聊信息
|
||
EventBus.getDefault().post(message);
|
||
}
|
||
}
|
||
} catch (Exception e) {
|
||
e.printStackTrace();
|
||
}
|
||
return false;
|
||
}
|
||
|
||
private void sendStartAnchorLive(JSONObject map) {
|
||
AnchorStartLiveBean bean = new AnchorStartLiveBean();
|
||
bean.setAnchorName(map.getString("anchorName"));
|
||
bean.setRoomId(map.getString("roomid"));
|
||
bean.setAvatar(map.getString("avatar"));
|
||
EventBus.getDefault().post(bean);
|
||
}
|
||
});
|
||
|
||
|
||
//监听im消息
|
||
V2TIMManager.getInstance().addSimpleMsgListener(new V2TIMSimpleMsgListener() {
|
||
@Override
|
||
public void onRecvGroupTextMessage(String msgID, String groupID, V2TIMGroupMemberInfo sender, String text) {
|
||
super.onRecvGroupTextMessage(msgID, groupID, sender, text);
|
||
Log.e("asasas", text);
|
||
Message msg = Message.obtain();
|
||
msg.what = Constants.SOCKET_WHAT_BROADCAST;
|
||
msg.obj = text;
|
||
if (mSocketHandler != null && Ingroup == 1) {
|
||
mSocketHandler.sendMessage(msg);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public void onRecvC2CTextMessage(String msgID, V2TIMUserInfo sender, String text) {
|
||
super.onRecvC2CTextMessage(msgID, sender, text);
|
||
Message msg = Message.obtain();
|
||
msg.what = Constants.SOCKET_WHAT_BROADCAST;
|
||
msg.obj = text;
|
||
if (mSocketHandler != null) {
|
||
CommonAppContext.Ingroup = 1;
|
||
mSocketHandler.sendMessage(msg);
|
||
}
|
||
}
|
||
|
||
});
|
||
configSPApp();
|
||
//初始化美颜SDK
|
||
// FaceManager.initFaceUnity(this);
|
||
}
|
||
|
||
/**
|
||
* 配置SharedPreferences默认值
|
||
*/
|
||
private void configSPApp() {
|
||
if (!SpUtil.getInstance().isExists(MsgSettActivity.SWITCH_PRIVATE_CHAT_MSG)) {
|
||
SpUtil.getInstance().setBooleanValue(MsgSettActivity.SWITCH_PRIVATE_CHAT_MSG, true);
|
||
}
|
||
}
|
||
|
||
|
||
public boolean isMainProcess() {
|
||
int pid = android.os.Process.myPid();
|
||
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
|
||
if (activityManager.getRunningAppProcesses() == null) {
|
||
return true;
|
||
}
|
||
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager.getRunningAppProcesses()) {
|
||
if (appProcess.pid == pid) {
|
||
return getApplicationInfo().packageName.equals(appProcess.processName);
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
|
||
@Override
|
||
public void onTerminate() {
|
||
RongcloudIMManager.removeRongcloudIMOnReceiveMessageListener();
|
||
super.onTerminate();
|
||
}
|
||
|
||
/**
|
||
* 注册全局异常捕获,有需要时可以在onCreate调用
|
||
*/
|
||
private void registerError() {
|
||
NeverCrashUtils.getInstance().setDebugMode(BuildConfig.DEBUG).setMainCrashHandler((t, e) -> {
|
||
Log.e("ApplicationError", "主线程异常");//此处log只是展示,当debug为true时,主类内部log会打印异常信息
|
||
e.printStackTrace();
|
||
AppManager.runDebugCode(() -> {
|
||
//闪退后finish所有Activity并且杀死进程
|
||
for (WeakReference<Activity> activity : activities) {
|
||
if (activity != null && activity.get() != null) {
|
||
activity.get().finish();
|
||
}
|
||
}
|
||
Process.killProcess(Process.myPid());
|
||
System.exit(0);
|
||
setFirebaseCrashData();
|
||
new Handler(Looper.getMainLooper()).postDelayed(() -> {
|
||
throw new RuntimeException(e);
|
||
}, 100);
|
||
});
|
||
|
||
}).setUncaughtCrashHandler((t, e) -> {
|
||
Log.e("ApplicationError", "子线程异常");//此处log只是展示,当debug为true时,主类内部log会打印异常信息
|
||
e.printStackTrace();
|
||
}).register(this);
|
||
}
|
||
|
||
public void registerFirebaseCrash() {
|
||
if (!CommonAppConfig.IS_UPLOAD_ERROR_LOG) {
|
||
return;
|
||
}
|
||
if (CommonAppConfig.IS_GOOGLE_PLAY != 2) {
|
||
GoogleUtils.newInstance(this).initializeApp(this);
|
||
}
|
||
}
|
||
|
||
|
||
public static void setFirebaseCrashData() {
|
||
if (!CommonAppConfig.IS_UPLOAD_ERROR_LOG) {
|
||
return;
|
||
}
|
||
String uid = CommonAppConfig.getInstance().getUid();
|
||
|
||
if (CommonAppConfig.IS_GOOGLE_PLAY != 2) {
|
||
GoogleUtils.newInstance(sInstance).setFirebaseCrashData(
|
||
uid,
|
||
SpUtil.getInstance().getStringValue(SpUtil.USER_INFO),
|
||
String.valueOf(CommonAppConfig.IS_GOOGLE_PLAY),
|
||
Arrays.toString(Build.SUPPORTED_ABIS),
|
||
String.valueOf(CrashSaveBean.getInstance().getStartTime()),
|
||
String.valueOf(CrashSaveBean.getInstance().getEnterRoom()),
|
||
String.valueOf(CrashSaveBean.getInstance().getSlidingRoom()),
|
||
String.valueOf(CrashSaveBean.getInstance().getPlaySvga()), CrashSaveBean.getInstance().getActivitySize());
|
||
}
|
||
}
|
||
}
|