优化下载直播插件流程

This commit is contained in:
zlzw 2023-06-25 11:31:19 +08:00
parent cef94a248e
commit fd06243c22
3 changed files with 89 additions and 23 deletions

View File

@ -26,7 +26,6 @@ import com.google.firebase.FirebaseApp;
import com.google.firebase.analytics.FirebaseAnalytics; import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.crashlytics.FirebaseCrashlytics; import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.shayu.phonelive.utils.LogUtils; import com.shayu.phonelive.utils.LogUtils;
import com.shayu.phonelive.utils.PluginManager;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo; import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener; import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
@ -249,7 +248,7 @@ public class AppContext extends CommonAppContext {
configSPApp(); configSPApp();
//初始化美颜SDK //初始化美颜SDK
// FaceManager.initFaceUnity(this); // FaceManager.initFaceUnity(this);
PluginManager.getInstance().loadAnchorPlugin();
} }
/** /**

View File

@ -1,20 +1,22 @@
package com.shayu.phonelive.utils; package com.yunbao.common.utils;
import static com.yunbao.faceunity.utils.FURenderer.BUNDLE_AI_FACE;
import static com.yunbao.faceunity.utils.FaceUnityConfig.BUNDLE_FACE_BEAUTIFICATION;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Build; import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.util.Log; import android.util.Log;
import com.yunbao.common.CommonAppContext; import com.yunbao.common.CommonAppContext;
import com.yunbao.common.utils.DownloadUtil;
import com.yunbao.common.utils.StringUtil;
import com.yunbao.faceunity.utils.FileUtils;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays; import java.util.Arrays;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
@ -25,7 +27,7 @@ import java.util.zip.ZipInputStream;
public class PluginManager { public class PluginManager {
private static PluginManager manager; private static PluginManager manager;
private static final String TAG = "插件管理器"; private static final String TAG = "插件管理器";
private String anchorPluginDownloadUrl = "http://192.168.137.1:12345/shares/ce47aa99-3e73-4a79-8a2f-e17a2d527953"; private String anchorPluginDownloadUrl = "http://nas.cnmglz.com:9999/apk/pluginsForAnchor-release.apk";
private PluginManager() { private PluginManager() {
} }
@ -44,16 +46,20 @@ public class PluginManager {
this.anchorPluginDownloadUrl = anchorPluginDownloadUrl; this.anchorPluginDownloadUrl = anchorPluginDownloadUrl;
} }
public boolean isDownloadApk() {
return new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download" + File.separator + "anchorPlugin.apk").exists();
}
/** /**
* 加载主播插件 * 加载主播插件
*/ */
public void loadAnchorPlugin() { public void loadAnchorPlugin(DialogInterface.OnDismissListener dismissListener) {
new Thread(() -> { new Thread(() -> {
try { try {
if (Arrays.asList(CommonAppContext.sInstance.getAssets().list("")).contains("anchorPlugin.apk")) { if (Arrays.asList(CommonAppContext.sInstance.getAssets().list("")).contains("anchorPlugin.apk")) {
FileUtils.copyAssetsFile(CommonAppContext.sInstance,"anchorPlugin.apk","anchorPlugin.apk",CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download"); copyAssetsFile(CommonAppContext.sInstance, "anchorPlugin.apk", "anchorPlugin.apk", CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download");
Log.d(TAG, "解压assets下的文件");
} }
Log.d(TAG,"解压assets下的文件");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -63,12 +69,15 @@ public class PluginManager {
Log.e(TAG, "主播下载地址为空"); Log.e(TAG, "主播下载地址为空");
return; return;
} }
downloadAnchorSdk(); downloadAnchorSdk(dismissListener);
return; return;
} }
String outDir = CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin"; String outDir = CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin";
loadFaceSo(sdk, outDir); loadFaceSo(sdk, outDir);
loadFaceBundle(sdk, outDir); loadFaceBundle(sdk, outDir);
new Handler(Looper.getMainLooper()).post(() -> {
dismissListener.onDismiss(null);
});
}).start(); }).start();
} }
@ -79,7 +88,9 @@ public class PluginManager {
* @param outDir 解压路径 * @param outDir 解压路径
*/ */
private void loadFaceSo(File plugin, String outDir) { private void loadFaceSo(File plugin, String outDir) {
if(!new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin"+File.separator+"lib").exists()) {
unzip(plugin.getAbsolutePath(), outDir, ".so"); unzip(plugin.getAbsolutePath(), outDir, ".so");
}
String[] abis = Build.SUPPORTED_ABIS; String[] abis = Build.SUPPORTED_ABIS;
String abi = Arrays.asList(abis).contains("arm64-v8a") ? "arm64-v8a" : "armeabi-v7a"; String abi = Arrays.asList(abis).contains("arm64-v8a") ? "arm64-v8a" : "armeabi-v7a";
File plugins = new File(outDir + File.separator + "lib" + File.separator + abi); File plugins = new File(outDir + File.separator + "lib" + File.separator + abi);
@ -94,9 +105,17 @@ public class PluginManager {
* @param outDir 解压路径 * @param outDir 解压路径
*/ */
private void loadFaceBundle(File plugin, String outDir) { private void loadFaceBundle(File plugin, String outDir) {
if(!new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin"+File.separator+"assets").exists()) {
unzip(plugin.getAbsolutePath(), outDir, ".bundle"); unzip(plugin.getAbsolutePath(), outDir, ".bundle");
BUNDLE_AI_FACE = outDir + File.separator + "assets" + File.separator + BUNDLE_AI_FACE; }
BUNDLE_FACE_BEAUTIFICATION = outDir + File.separator + "assets" + File.separator + BUNDLE_FACE_BEAUTIFICATION; try {
Object BUNDLE_AI_FACE = Class.forName("com.yunbao.faceunity.utils.FURenderer").getField("BUNDLE_AI_FACE").get(null);
Object BUNDLE_FACE_BEAUTIFICATION = Class.forName("com.yunbao.faceunity.utils.FaceUnityConfig").getField("BUNDLE_FACE_BEAUTIFICATION").get(null);
Class.forName("com.yunbao.faceunity.utils.FURenderer").getField("BUNDLE_AI_FACE").set(null, outDir + File.separator + "assets" + File.separator + BUNDLE_AI_FACE);
Class.forName("com.yunbao.faceunity.utils.FaceUnityConfig").getField("BUNDLE_FACE_BEAUTIFICATION").set(null, outDir + File.separator + "assets" + File.separator + BUNDLE_FACE_BEAUTIFICATION);
} catch (Exception e) {
e.printStackTrace();
}
} }
/** /**
@ -109,22 +128,22 @@ public class PluginManager {
file += ".so"; file += ".so";
if (new File(dir.getAbsolutePath() + File.separator + file).exists()) { if (new File(dir.getAbsolutePath() + File.separator + file).exists()) {
System.load(dir + File.separator + file); System.load(dir + File.separator + file);
Log.d(TAG, "加载成功 "+dir + File.separator + file ); Log.d(TAG, "加载成功 " + dir + File.separator + file);
} else { } else {
Log.e(TAG, "不存在 "+dir + File.separator + file ); Log.e(TAG, "不存在 " + dir + File.separator + file);
} }
} }
/** /**
* 下载主播插件包 * 下载主播插件包
*/ */
private void downloadAnchorSdk() { private void downloadAnchorSdk(DialogInterface.OnDismissListener dismissListener) {
String downloadDir = new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download").getAbsolutePath(); String downloadDir = new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download").getAbsolutePath();
new DownloadUtil().download("plugin", downloadDir, "anchorPlugin.apk", anchorPluginDownloadUrl, new DownloadUtil.Callback() { new DownloadUtil().download("plugin", downloadDir, "anchorPlugin.apk", anchorPluginDownloadUrl, new DownloadUtil.Callback() {
@Override @Override
public void onSuccess(File file) { public void onSuccess(File file) {
Log.d(TAG, "下载成功 "+file ); Log.d(TAG, "下载成功 " + file);
loadAnchorPlugin(); loadAnchorPlugin(dismissListener);
} }
@Override @Override
@ -195,4 +214,33 @@ public class PluginManager {
} }
} }
public static String copyAssetsFile(Context context, String assetsPath, String fileName, String saveFileDir) {
File fileDir = new File(saveFileDir);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File file = new File(fileDir, fileName);
if (file.exists()) {
return file.getAbsolutePath();
}
try {
InputStream inputStream = context.getAssets().open(assetsPath);
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(inputStream);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] byteArray = new byte[1024];
int bytes = bis.read(byteArray);
while (bytes > 0) {
bos.write(byteArray, 0, bytes);
bos.flush();
bytes = bis.read(byteArray);
}
bos.close();
fos.close();
return file.getAbsolutePath();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
} }

View File

@ -4,6 +4,7 @@ import android.Manifest;
import android.animation.Animator; import android.animation.Animator;
import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.app.Dialog;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
@ -23,6 +24,8 @@ import com.yunbao.common.activity.AbsActivity;
import com.yunbao.common.dialog.AbsDialogFragment; import com.yunbao.common.dialog.AbsDialogFragment;
import com.yunbao.common.http.HttpCallback; import com.yunbao.common.http.HttpCallback;
import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.IMLoginManager;
import com.yunbao.common.utils.DialogUitl;
import com.yunbao.common.utils.PluginManager;
import com.yunbao.common.utils.ProcessResultUtil; import com.yunbao.common.utils.ProcessResultUtil;
import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.ToastUtil;
import com.yunbao.live.LiveConfig; import com.yunbao.live.LiveConfig;
@ -213,7 +216,23 @@ public class MainStartDialogFragment extends AbsDialogFragment implements View.O
} }
}; };
} }
if (PluginManager.getInstance().isDownloadApk()) {
PluginManager.getInstance().loadAnchorPlugin(it -> {
LiveHttpUtil.getLiveSdk(mGetLiveSdkCallback); LiveHttpUtil.getLiveSdk(mGetLiveSdkCallback);
});
} else {
DialogUitl.showSimpleDialog(mContext, "需要下载开播插件,是否下载", new DialogUitl.SimpleCallback() {
@Override
public void onConfirmClick(Dialog dialog, String content) {
Dialog downloadDialog = DialogUitl.loadingDialog(mContext, "下载中");
downloadDialog.show();
PluginManager.getInstance().loadAnchorPlugin(it -> {
LiveHttpUtil.getLiveSdk(mGetLiveSdkCallback);
downloadDialog.dismiss();
});
}
});
}
} else { } else {
LiveAnchorActivity.forward(mContext, CommonAppConfig.LIVE_SDK_USED, LiveConfig.getDefaultKsyConfig()); LiveAnchorActivity.forward(mContext, CommonAppConfig.LIVE_SDK_USED, LiveConfig.getDefaultKsyConfig());
} }