From e0669e98cfc1eb4688b7b83bdc0ec5f2344221d8 Mon Sep 17 00:00:00 2001 From: zlzw <583819556@qq.com> Date: Sat, 29 Jun 2024 10:11:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8A=E6=8A=A5=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utils/net/StickerDownloadHelper.java | 2 +- app/build.gradle | 8 +- .../java/com/shayu/phonelive/AppContext.java | 2 +- common/build.gradle | 2 + .../java/com/yunbao/common/bean/QiniuLog.java | 16 ++ .../yunbao/common/http/CommonHttpUtil.java | 16 ++ .../com/yunbao/common/http/PDLiveApi.java | 5 + .../common/http/live/LiveNetManager.java | 26 +++ .../com/yunbao/common/upload/UploadBean.java | 1 + .../yunbao/common/upload/UploadQnImpl.java | 28 ++- .../main/java/com/yunbao/common/utils/L.java | 13 +- .../java/com/yunbao/common/utils/LogUtil.java | 166 +++++++++--------- .../com/yunbao/common}/utils/LogUtils.java | 56 +++++- .../com/yunbao/common}/utils/ZipUtils.java | 49 ++++-- live/build.gradle | 2 +- .../yunbao/main/activity/MainActivity.java | 17 ++ .../yunbao/main/adapter/SettingAdapter.java | 2 +- 17 files changed, 301 insertions(+), 110 deletions(-) create mode 100644 common/src/main/java/com/yunbao/common/bean/QiniuLog.java rename {app/src/main/java/com/shayu/phonelive => common/src/main/java/com/yunbao/common}/utils/LogUtils.java (62%) rename {FaceUnity/src/main/java/com/yunbao/faceunity => common/src/main/java/com/yunbao/common}/utils/ZipUtils.java (86%) diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/net/StickerDownloadHelper.java b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/net/StickerDownloadHelper.java index 393cf0dc3..ec95d8f25 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/net/StickerDownloadHelper.java +++ b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/net/StickerDownloadHelper.java @@ -13,7 +13,7 @@ import com.google.gson.JsonObject; import com.yunbao.faceunity.entity.net.FineStickerEntity; import com.yunbao.faceunity.utils.FaceUnityData; import com.yunbao.faceunity.utils.FileUtils; -import com.yunbao.faceunity.utils.ZipUtils; +import com.yunbao.common.utils.ZipUtils; import java.io.File; import java.util.ArrayList; diff --git a/app/build.gradle b/app/build.gradle index 8a4c9350e..ba03faba9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -88,12 +88,12 @@ android { applicationVariants.all { variant -> println "清空build文件夹"; - /* for (final def project in rootProject.getAllprojects()) { + for (final def project in rootProject.getAllprojects()) { def name = variant.name.replace('Debug', '').replace('Release', '').toLowerCase() - delete project.buildDir + //delete project.buildDir delete project.rootDir.absolutePath+File.separator+"app"+File.separator+name - println project.buildDir - }*/ + //println project.buildDir + } //delete project.rootDir.absolutePath + File.separator + "outputs" String variantName = variant.name.capitalize() def processManifestTask = project.tasks.getByName("process${variantName}Manifest") diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java index a5d232ec0..b08d81f4a 100644 --- a/app/src/main/java/com/shayu/phonelive/AppContext.java +++ b/app/src/main/java/com/shayu/phonelive/AppContext.java @@ -25,7 +25,7 @@ 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.yunbao.common.utils.LogUtils; import com.tencent.imsdk.v2.V2TIMGroupMemberInfo; import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSimpleMsgListener; diff --git a/common/build.gradle b/common/build.gradle index fdc222cf4..39c0f0dd1 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -235,4 +235,6 @@ dependencies { //ExoPlayer,腾讯的播放器不支持无缝切换 api 'com.google.android.exoplayer:exoplayer:2.18.2' api 'com.google.android.exoplayer:exoplayer-core:2.18.2@aar' + + api rootProject.ext.dependencies["blank-utilcode"] } diff --git a/common/src/main/java/com/yunbao/common/bean/QiniuLog.java b/common/src/main/java/com/yunbao/common/bean/QiniuLog.java new file mode 100644 index 000000000..b861eda2e --- /dev/null +++ b/common/src/main/java/com/yunbao/common/bean/QiniuLog.java @@ -0,0 +1,16 @@ +package com.yunbao.common.bean; + +import com.alibaba.fastjson.annotation.JSONField; + +public class QiniuLog extends BaseModel{ + @JSONField(name = "log_type") + private int log_type; + + public int getLog_type() { + return log_type; + } + + public void setLog_type(int log_type) { + this.log_type = log_type; + } +} diff --git a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java index 50237cf73..5d725d932 100644 --- a/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java +++ b/common/src/main/java/com/yunbao/common/http/CommonHttpUtil.java @@ -8,6 +8,7 @@ import android.util.Log; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.blankj.utilcode.util.DeviceUtils; import com.lzy.okgo.OkGo; import com.lzy.okgo.callback.StringCallback; import com.lzy.okgo.model.Response; @@ -28,6 +29,7 @@ import com.yunbao.common.utils.AppManager; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.L; import com.yunbao.common.utils.SpUtil; +import com.yunbao.common.utils.StringUtil; import com.yunbao.common.utils.ToastUtil; import com.yunbao.common.utils.VersionUtil; import com.yunbao.common.utils.WordUtil; @@ -459,6 +461,20 @@ public class CommonHttpUtil { .params("token", CommonAppConfig.getInstance().getToken()) .params("ext", isImg ? ".jpeg" : ".mp4") .execute(callback); + } /** + * 上传文件 获取七牛云token的接口 + */ + public static void getUploadQiNiuTokenLog(HttpCallback callback,String fileName) { + String uid = CommonAppConfig.getInstance().getUid(); + if(StringUtil.isEmpty(uid)){ + uid="NotLogin_"+ DeviceUtils.getUniqueDeviceId(); + } + HttpClient.getInstance().get("Pdluserhome.getQiNiuToken3", "Pdluserhome.getQiNiuToken3") + .params("uid",uid) + .params("token", CommonAppConfig.getInstance().getToken()) + .params("file_name", fileName) + .params("ext", ".zip") + .execute(callback); } // // //埋点唯一性 diff --git a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java index e0e42ce10..cda5437c1 100644 --- a/common/src/main/java/com/yunbao/common/http/PDLiveApi.java +++ b/common/src/main/java/com/yunbao/common/http/PDLiveApi.java @@ -57,6 +57,7 @@ import com.yunbao.common.bean.PrankGiftBean; import com.yunbao.common.bean.PrankGiftResultBean; import com.yunbao.common.bean.PrankHttpTurntableBean; import com.yunbao.common.bean.PrankProgressBean; +import com.yunbao.common.bean.QiniuLog; import com.yunbao.common.bean.QuickGiftSendGiftModel; import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.bean.RankPkInfoBean; @@ -1261,4 +1262,8 @@ public interface PDLiveApi { @Query("anchor_id")String anchor_id, @Query("gift_id")String gift_id ); + @GET("/api/public/?service=Tx.androidQiniuLog") + Observable> getPrankList( + @Query("type")String type + ); } diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java index 29fa05c34..0aa79bb7d 100644 --- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java +++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java @@ -57,6 +57,7 @@ import com.yunbao.common.bean.PrankGiftBean; import com.yunbao.common.bean.PrankGiftResultBean; import com.yunbao.common.bean.PrankHttpTurntableBean; import com.yunbao.common.bean.PrankProgressBean; +import com.yunbao.common.bean.QiniuLog; import com.yunbao.common.bean.QuickGiftSendGiftModel; import com.yunbao.common.bean.RandomPkUserBean; import com.yunbao.common.bean.RankPkInfoBean; @@ -3237,6 +3238,31 @@ public class LiveNetManager { } + /** + * 上报日志相关 + * @param type 1为查询,3为删除 + * @param callback + */ + public void getLogUpdateStatus(String type, HttpCallbackcallback) { + API.get().pdLiveApi(mContext) + .getPrankList(type) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(listResponseModel -> { + if (callback != null) { + callback.onSuccess(listResponseModel.getData().getInfo()); + } + }, new Consumer() { + @Override + public void accept(Throwable throwable) throws Exception { + throwable.printStackTrace(); + if (callback != null) { + callback.onError(mContext.getString(R.string.net_error)); + } + } + }).isDisposed(); + + } public void updateFile(File file, HttpCallback callback) { MultipartBody.Part uploadFile = createUploadFile(file); diff --git a/common/src/main/java/com/yunbao/common/upload/UploadBean.java b/common/src/main/java/com/yunbao/common/upload/UploadBean.java index 920f3a570..86dd42845 100644 --- a/common/src/main/java/com/yunbao/common/upload/UploadBean.java +++ b/common/src/main/java/com/yunbao/common/upload/UploadBean.java @@ -11,6 +11,7 @@ public class UploadBean { public static final int IMG = 0; public static final int VIDEO = 1; public static final int VOICE = 2; + public static final int LOG = 3; private File mOriginFile;//要被上传的源文件 private File mCompressFile;//压缩后的图片文件 private String mRemoteFileName;//上传成功后在云存储上的文件名字 diff --git a/common/src/main/java/com/yunbao/common/upload/UploadQnImpl.java b/common/src/main/java/com/yunbao/common/upload/UploadQnImpl.java index 6b1134b26..a01ed1f0e 100644 --- a/common/src/main/java/com/yunbao/common/upload/UploadQnImpl.java +++ b/common/src/main/java/com/yunbao/common/upload/UploadQnImpl.java @@ -1,5 +1,7 @@ package com.yunbao.common.upload; +import static java.text.DateFormat.DEFAULT; + import android.content.Context; import android.text.TextUtils; @@ -11,6 +13,7 @@ import com.qiniu.android.storage.UpCompletionHandler; import com.qiniu.android.storage.UploadManager; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; +import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.utils.L; import com.yunbao.common.utils.StringUtil; @@ -18,7 +21,10 @@ import org.json.JSONException; import org.json.JSONObject; import java.io.File; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; +import java.util.Locale; import top.zibin.luban.Luban; @@ -72,6 +78,8 @@ public class UploadQnImpl implements UploadStrategy { compressedFile.delete(); } } + } else if (uploadBean.getType() == UploadBean.LOG) { + uploadBean.getOriginFile().delete(); } mIndex++; if (mIndex < mList.size()) { @@ -90,6 +98,10 @@ public class UploadQnImpl implements UploadStrategy { @Override public void upload(List list, boolean needCompress, UploadCallback callback, boolean isImg) { + upload(list, needCompress, callback, isImg, false); + } + + public void upload(List list, boolean needCompress, UploadCallback callback, boolean isImg, boolean isLog) { System.err.println("-------upload------>" + list.size()); if (callback == null) { return; @@ -127,7 +139,11 @@ public class UploadQnImpl implements UploadStrategy { } }; } - CommonHttpUtil.getUploadQiNiuToken(mGetUploadTokenCallback, isImg); + if (isLog) { + CommonHttpUtil.getUploadQiNiuTokenLog(mGetUploadTokenCallback, list.get(0).getOriginFile().getName()); + } else { + CommonHttpUtil.getUploadQiNiuToken(mGetUploadTokenCallback, isImg); + } } @Override @@ -159,8 +175,16 @@ public class UploadQnImpl implements UploadStrategy { bean.setRemoteFileName(StringUtil.contact(StringUtil.generateFileName(), ".mp4")); } else if (bean.getType() == UploadBean.VOICE) { bean.setRemoteFileName(StringUtil.contact(StringUtil.generateFileName(), ".m4a")); + } else if (bean.getType() == UploadBean.LOG) { + bean.setRemoteFileName("logs/" + + IMLoginManager.get(mContext).getUserInfo().getId() + + "/" + + SimpleDateFormat.getDateInstance(DEFAULT, Locale.CHINA).format(new Date()) + + "/" + + bean.getOriginFile().getName() + ); } - System.err.println("-------mIndex >= bean.getType() == UploadBean.IMG------>" + bean); + System.err.println("-------mIndex >= bean.getType() == " + bean.getType() + "------>" + bean); upload(bean); /*if (bean.getType() == UploadBean.IMG && mNeedCompress) { System.err.println("-------UploadBean.IMG && mNeedCompress------>" + bean + "UploadBean.IMG:" + UploadBean.IMG + "__mNeedCompress" + mNeedCompress); diff --git a/common/src/main/java/com/yunbao/common/utils/L.java b/common/src/main/java/com/yunbao/common/utils/L.java index 7d4a2dc93..c1eaf1fab 100644 --- a/common/src/main/java/com/yunbao/common/utils/L.java +++ b/common/src/main/java/com/yunbao/common/utils/L.java @@ -2,6 +2,11 @@ package com.yunbao.common.utils; import android.util.Log; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.UUID; + /** * Created by cxf on 2017/8/3. */ @@ -24,13 +29,19 @@ public class L { } } + final static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); + public static void e(String tag, String s) { if (sDeBug) { Log.e(tag, s); + } else { + String uuid = UUID.randomUUID().toString(); + Log.e(tag, uuid); + LogUtils.addSafeLog(dateFormat.format(new Date()) + " [" + uuid + "|" + tag + "] " + s); } } public static void setDeBug(boolean deBug) { - sDeBug = deBug; + sDeBug = false; } } diff --git a/common/src/main/java/com/yunbao/common/utils/LogUtil.java b/common/src/main/java/com/yunbao/common/utils/LogUtil.java index d94e6e365..b4656c18e 100644 --- a/common/src/main/java/com/yunbao/common/utils/LogUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/LogUtil.java @@ -24,28 +24,25 @@ import com.lzy.okgo.request.PostRequest; import com.lzy.okserver.OkUpload; import com.lzy.okserver.upload.UploadListener; import com.lzy.okserver.upload.UploadTask; +import com.yunbao.common.BuildConfig; import com.yunbao.common.CommonAppConfig; -import com.yunbao.common.bean.IMLoginModel; -import com.yunbao.common.manager.IMLoginManager; +import com.yunbao.common.http.live.LiveNetManager; +import com.yunbao.common.upload.UploadBean; +import com.yunbao.common.upload.UploadCallback; +import com.yunbao.common.upload.UploadQnImpl; -import java.io.BufferedOutputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.WritableByteChannel; import java.nio.file.Files; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Locale; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; import okhttp3.Call; import okhttp3.Callback; @@ -149,91 +146,57 @@ public class LogUtil { public static void shareFile(Context context) { - try { - IMLoginModel bean = IMLoginManager.get(context).getUserInfo(); - boolean isAnchor = false; - if (bean != null) { - isAnchor = bean.anchorUserType(); - } - //有debug文件或主播才允许 - if (!new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "pdlive.debug").exists() && !isAnchor) { - return; - } - } catch (Exception e) { - return; - } - /* if (PermissionChecker.checkCallingOrSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PERMISSION_GRANTED) { - ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); - return; - }*/ String title = "[PDLIVE]" + CommonAppConfig.getInstance().getUid() + "_"; String today = title + SimpleDateFormat.getDateInstance(DEFAULT, Locale.CHINA).format(new Date()); - File dir = new File(context.getDir("files", Context.MODE_PRIVATE).getAbsolutePath() + File.separator); + File dir = new File("/data/data/" + context.getPackageName() + File.separator); File zip = new File(context.getDir("files", Context.MODE_PRIVATE).getAbsolutePath() + File.separator + today + ".zip"); - try { - ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zip))); - FileInputStream fis = null; - WritableByteChannel writableByteChannel = Channels.newChannel(zos); - if (dir.listFiles() != null) { - for (File file : dir.listFiles()) { - if (file.getName().endsWith(".log")) { - ZipEntry entry = new ZipEntry(file.getName()); - zos.putNextEntry(entry); - fis = new FileInputStream(file); - FileChannel channel = fis.getChannel(); - channel.transferTo(0, file.length() - 1, writableByteChannel); - fis.close(); + List filters = getFiltersList(context.getPackageName()); + filters.add(context.getPackageName() + File.separator + "app_files" + File.separator + today + ".zip"); + List srcList = new ArrayList<>(); + srcList.add(dir.getAbsolutePath()); + srcList.add(context.getExternalFilesDir("").getAbsolutePath()); + LogUtils.endSafeLog(); + ZipUtils.zipFolder(srcList, zip.getAbsolutePath(), filters, new Runnable() { + @Override + public void run() { + System.out.println("!!!!!!!!!!!!!!!!!!!"); + if (BuildConfig.DEBUG) { + return; } + UploadQnImpl mUploadStrategy = new UploadQnImpl(context); + List list = new ArrayList<>(); + list.add(new UploadBean(zip, UploadBean.LOG)); + mUploadStrategy.upload(list, false, new UploadCallback() { + @Override + public void onFinish(List list, boolean success) { + if (success) { + LiveNetManager.get(context).getLogUpdateStatus("3", null); + } + LogUtils.startSafeLog(context); + } + }, false, true); } - } - zos.close(); - writableByteChannel.close(); + }); } catch (Exception e) { e.printStackTrace(); } - if (zip.exists()) { - DialogUitl.showSimpleDialog(context, "上报日志", new DialogUitl.SimpleCallback() { - @Override - public void onConfirmClick(Dialog dialog, String content) { - new Thread(new Runnable() { - @Override - public void run() { - uploadLog(zip); - } - }).start(); - dialog.dismiss(); - ToastUtil.show("OK"); - Intent share = new Intent(Intent.ACTION_SEND); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", zip); - share.putExtra(Intent.EXTRA_STREAM, contentUri); - share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - } else { - share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(zip)); - } - share.setType("application/vnd.ms-excel"); - share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); - context.startActivity(Intent.createChooser(share, "分享文件")); - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && CommonAppConfig.IS_GOOGLE_PLAY == 0) { - if (!Environment.isExternalStorageManager()) { - Intent intent = new Intent(ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); - context.startActivity(intent); - } - } - File out = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + zip.getName()); - try { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - Files.copy(zip.toPath(), out.toPath()); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - }); + } - } + private static @NonNull List getFiltersList(String packageName) { + List filters = new ArrayList<>(); + filters.add(packageName + File.separator + "files" + File.separator + "gif"); + filters.add(packageName + File.separator + "app_textures"); + filters.add(packageName + File.separator + "app_webview"); + filters.add(packageName + File.separator + "code_cache"); + filters.add(packageName + File.separator + "databases"); + filters.add(packageName + File.separator + "cache" + File.separator + "https"); + filters.add(packageName + File.separator + "cache" + File.separator + "image"); + filters.add(packageName + File.separator + "cache" + File.separator + "jtechCache"); + filters.add(packageName + File.separator + "cache" + File.separator + "picasso-cache"); + filters.add(packageName + File.separator + "cache" + File.separator + "svga"); + filters.add(packageName + File.separator + "cache" + File.separator + "WebView"); + return filters; } private static String TAG = "Upload"; @@ -251,7 +214,9 @@ public class LogUtil { body.put("appVersion", CommonAppConfig.getInstance().getVersion()); OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.SECONDS).build(); - Request request = new Request.Builder().url("https://newht.yaoulive.com/index.php/api/error_log/report") //无法接受文件 + Request request = new Request.Builder() + .url("https://tools.yutou233.cn/public/file/request.do")//临时上报地址,可接受文件 + //.url("https://newht.yaoulive.com/index.php/api/error_log/report") //无法接受文件 .post(requestBody).build(); client.newCall(request).enqueue(new Callback() { @Override @@ -269,5 +234,32 @@ public class LogUtil { }); } - + private static void openShareDialog(Context context, File zip) { + Intent share = new Intent(Intent.ACTION_SEND); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", zip); + share.putExtra(Intent.EXTRA_STREAM, contentUri); + share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + } else { + share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(zip)); + } + share.setType("application/vnd.ms-excel"); + share.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + context.startActivity(Intent.createChooser(share, "分享文件")); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && CommonAppConfig.IS_GOOGLE_PLAY == 0) { + if (!Environment.isExternalStorageManager()) { + Intent intent = new Intent(ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); + context.startActivity(intent); + } + } + File out = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + zip.getName()); + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Files.copy(zip.toPath(), out.toPath()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/app/src/main/java/com/shayu/phonelive/utils/LogUtils.java b/common/src/main/java/com/yunbao/common/utils/LogUtils.java similarity index 62% rename from app/src/main/java/com/shayu/phonelive/utils/LogUtils.java rename to common/src/main/java/com/yunbao/common/utils/LogUtils.java index b2dc80e1c..81826b03a 100644 --- a/app/src/main/java/com/shayu/phonelive/utils/LogUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/LogUtils.java @@ -1,4 +1,4 @@ -package com.shayu.phonelive.utils; +package com.yunbao.common.utils; import static java.text.DateFormat.DEFAULT; @@ -17,8 +17,11 @@ import java.util.Calendar; import java.util.Date; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.LinkedBlockingQueue; public class LogUtils { + private static final LinkedBlockingQueue QUEUE = new LinkedBlockingQueue<>(); + /** * 采集所有日志 */ @@ -68,7 +71,58 @@ public class LogUtils { } } }).start(); + startSafeLog(context); + } + private static Thread safeThread; + private static boolean writerSafeLog = true; + + public static void startSafeLog(Context context) { + if (safeThread != null && safeThread.isAlive()) { + return; + } + safeThread = new Thread(new Runnable() { + @Override + public void run() { + try { + String title = CommonAppConfig.getInstance().getUid() + "_"; + String today = title + SimpleDateFormat.getDateInstance(DEFAULT, Locale.CHINA).format(new Date()); + File saveFile = new File(context.getDir("files", Context.MODE_PRIVATE).getAbsolutePath() + File.separator + today + ".safe"); + saveFile.createNewFile(); + FileOutputStream os = new FileOutputStream(saveFile, true); + PrintWriter writer = new PrintWriter(os); + while (writerSafeLog) { + if (!QUEUE.isEmpty()) { + writer.append(QUEUE.poll()).write("\n"); + writer.flush(); + } else { + Thread.sleep(1000); + } + } + while (!QUEUE.isEmpty()){ + writer.append(QUEUE.poll()).write("\n"); + writer.flush(); + } + writer.flush(); + writer.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + safeThread.setName("safeLog"); + safeThread.start(); + } + + public static void addSafeLog(String log) { + QUEUE.offer(log); + } + + public static void endSafeLog() { + writerSafeLog = false; + while (!QUEUE.isEmpty()){ + + } } /** diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/ZipUtils.java b/common/src/main/java/com/yunbao/common/utils/ZipUtils.java similarity index 86% rename from FaceUnity/src/main/java/com/yunbao/faceunity/utils/ZipUtils.java rename to common/src/main/java/com/yunbao/common/utils/ZipUtils.java index 22cbfa3af..8ccc839dc 100644 --- a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/ZipUtils.java +++ b/common/src/main/java/com/yunbao/common/utils/ZipUtils.java @@ -1,10 +1,11 @@ -package com.yunbao.faceunity.utils; +package com.yunbao.common.utils; import android.util.Log; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; @@ -151,16 +152,36 @@ public class ZipUtils { * @param zipFileString 解压完成的Zip路径 * @throws Exception */ - public static void zipFolder(String srcFileString, String zipFileString) throws Exception { + public static void zipFolder(List srcFileString, String zipFileString, List filters, Runnable runnable) throws Exception { + if (filters == null) { + filters = new ArrayList<>(); + } + filters.add(new File(zipFileString).getAbsolutePath()); + final List tmp = new ArrayList<>(filters); //创建ZIP ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString)); - //创建文件 - File file = new File(srcFileString); - //压缩 - zipFiles(file.getParent() + File.separator, file.getName(), outZip); - //完成和关闭 - outZip.finish(); - outZip.close(); + + new Thread(new Runnable() { + @Override + public void run() { + try { + for (String src : srcFileString) { + File file = new File(src); + //压缩 + zipFiles(file.getParent() + File.separator, file.getName(), outZip, tmp); + } + //创建文件 + //完成和关闭 + outZip.finish(); + outZip.close(); + runnable.run(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + + } /** @@ -171,9 +192,15 @@ public class ZipUtils { * @param zipOutputSteam * @throws Exception */ - private static void zipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam) throws Exception { + private static void zipFiles(String folderString, String fileString, ZipOutputStream zipOutputSteam, List filters) throws Exception { if (zipOutputSteam == null) return; + for (String filter : filters) { + if (fileString.startsWith(filter)) { + return; + } + } + System.out.println("压缩文件:" + folderString + "|" + fileString); File file = new File(folderString + fileString); if (file.isFile()) { ZipEntry zipEntry = new ZipEntry(fileString); @@ -196,7 +223,7 @@ public class ZipUtils { } //子文件和递归 for (int i = 0; i < fileList.length; i++) { - zipFiles(folderString, fileString + File.separator + fileList[i], zipOutputSteam); + zipFiles(folderString, fileString + File.separator + fileList[i], zipOutputSteam, filters); } } } diff --git a/live/build.gradle b/live/build.gradle index ec3783654..2fca16a93 100644 --- a/live/build.gradle +++ b/live/build.gradle @@ -1 +1 @@ -apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' apply from: "../package_config.gradle" android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a","x86","x86_64" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path:':lib_faceunity')//声网-新娱美颜 api project(path:':FaceUnity')//融云-新娱美颜 api project(path:':common')//公共库 api project(':Share')//分享 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 api rootProject.ext.dependencies["blank-utilcode"] implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" } \ No newline at end of file +apply plugin: 'com.android.library' apply plugin: 'img-optimizer' apply plugin: 'kotlin-android' apply from: "../package_config.gradle" android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false packagingOptions { pickFirst "lib/armeabi/libyuvutils.so" pickFirst "lib/arm64-v8a/libyuvutils.so" pickFirst "lib/armeabi-v7a/libyuvutils.so" pickFirst "lib/armeabi/libyuvtools.so" pickFirst "lib/arm64-v8a/libyuvtools.so" pickFirst "lib/armeabi-v7a/libyuvtools.so" exclude "lib/arm64-v8a/libmmcv_api_handgesture.so" exclude "lib/arm64-v8a/libmmcv_api_express.so" exclude "lib/arm64-v8a/libMediaEncoder.so" exclude "lib/arm64-v8a/libarcore_sdk_c.so" exclude "lib/arm64-v8a/libmediadecoder.so" exclude "lib/arm64-v8a/libMediaMuxer.so" exclude "lib/arm64-v8a/libarcore_sdk_jni.so" exclude "lib/arm64-v8a/libMediaUtils.so" exclude "lib/arm64-v8a/libcosmosffmpeg.so" } defaultConfig { minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName manifestPlaceholders = rootProject.ext.manifestPlaceholders ndk { abiFilters "armeabi-v7a", "arm64-v8a","x86","x86_64" } javaCompileOptions { annotationProcessorOptions { arguments = [AROUTER_MODULE_NAME: project.getName()] } } } aaptOptions { cruncherEnabled = false useNewCruncher = false } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } kotlinOptions { allWarningsAsErrors = true } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } repositories { flatDir { dirs 'libs', '../libs' } mavenCentral() } dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.0.0' implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) implementation (name:'../libs/beautysdk-202202241203',ext:'aar') implementation (name:'../libs/svgaplayer-release-v1.2.1',ext:'aar') //socket.io implementation('io.socket:socket.io-client:1.0.0') { exclude group: 'org.json', module: 'json' } //common api project(path:':lib_faceunity')//声网-新娱美颜 api project(path:':FaceUnity')//融云-新娱美颜 api project(path:':common')//公共库 api project(':Share')//分享 annotationProcessor rootProject.ext.dependencies["arouter-compiler"] //工具 implementation 'com.eightbitlab:blurview:1.6.6' implementation 'com.google.code.gson:gson:2.8.6' implementation "com.getkeepsafe.relinker:relinker:1.4.4" } \ No newline at end of file diff --git a/main/src/main/java/com/yunbao/main/activity/MainActivity.java b/main/src/main/java/com/yunbao/main/activity/MainActivity.java index 3f88fe0bc..5764d71db 100644 --- a/main/src/main/java/com/yunbao/main/activity/MainActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/MainActivity.java @@ -50,7 +50,9 @@ import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSDKConfig; import com.tencent.imsdk.v2.V2TIMSDKListener; import com.tencent.imsdk.v2.V2TIMUserFullInfo; +import com.yunbao.common.bean.QiniuLog; import com.yunbao.common.glide.ImgLoader; +import com.yunbao.common.utils.LogUtil; import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; @@ -561,6 +563,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene checkVersion(); //获取声网Token getSwToken(); + initLogUpdate(); } private void getSwToken() { @@ -1626,6 +1629,20 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene }); } + private void initLogUpdate(){ + LiveNetManager.get(mContext) + .getLogUpdateStatus("1", new com.yunbao.common.http.base.HttpCallback() { + @Override + public void onSuccess(QiniuLog data) { + if(data.getLog_type()==1){ + LogUtil.shareFile(mContext); + } + } + @Override + public void onError(String error) { + } + }); + } } diff --git a/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java b/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java index d14408af4..9341bcd8e 100644 --- a/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java +++ b/main/src/main/java/com/yunbao/main/adapter/SettingAdapter.java @@ -55,7 +55,7 @@ public class SettingAdapter extends RecyclerView.Adapter { int position = (int) tag; SettingBean bean = mList.get(position); if (bean.getId() == 19) { - LogUtil.shareFile(context); + } if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(bean, position);