「Fix Skin」

1、修复皮肤包多次下载同一个皮肤包导致下载的产物与云端产物md5不一致。
This commit is contained in:
xyz
2024-12-24 18:16:18 +08:00
parent 0d928c6680
commit 99a93c2f9f
2 changed files with 57 additions and 5 deletions

View File

@@ -144,13 +144,22 @@ public class SkinManager extends Observable {
public void downloadSkin(Context context, Skin skin, SkinLoadListener skinLoadListener) {
File theme = new File(FileUtils.getExternalAppDirectory(context), "theme");
if (theme.exists() && theme.isFile()) {
Log.w(TAG, "皮肤包 目录已存在,但是文件类型,删除。");
theme.delete();
theme.mkdirs();
}
theme.mkdirs();
if (!theme.exists()) {
Log.w(TAG, "皮肤包 存储目录不存在,创建 " + theme.getAbsolutePath());
theme.mkdirs();
}
// 打印文件夹内的文件
FileUtils.listFilesForFolder(theme);
// 获取皮肤插件文件对象
File skinFile = skin.getSkinFile(theme);
// 判断是否存在
if (skinFile.exists()) {
if (FileUtils.fileIsExists(theme, skin.getSkinFileName())) {
// 检验皮肤包完整性即MD5是否一致不一致则删除
String localSkinFileMd5 = SkinUtils.getSkinMD5(skinFile);
if (!TextUtils.equals(localSkinFileMd5, skin.md5)) {
@@ -188,7 +197,7 @@ public class SkinManager extends Observable {
//皮肤包的md5校验 防止下载文件损坏(但是会减慢速度。从数据库查询已下载皮肤表数据库中保留md5字段)
String localSkinFileMd5 = SkinUtils.getSkinMD5(skinFile);
if (TextUtils.equals(localSkinFileMd5, skin.md5)) {
Log.d(TAG, "皮肤包 MD5 校验成功,本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 删除其它皮肤包。");
Log.d(TAG, "皮肤包 MD5 校验成功,本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 删除其它皮肤包。");
// 加载指定皮肤包
SkinManager.getInstance().loadSkin(skin.getPathLocal());
// 校验文件签名没问题后删除其他主题
@@ -196,8 +205,8 @@ public class SkinManager extends Observable {
// 回调给使用方成功
skinLoadListener.onLoadSuccess();
} else {
Log.e(TAG, "皮肤包 皮肤文件 MD5校验出错, 本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 不一致。");
Toast.makeText(mApplication, "皮肤文件校验出错,本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 不一致。", Toast.LENGTH_LONG).show();
Log.e(TAG, "皮肤包 皮肤文件 MD5校验出错, 本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 不一致,删除皮肤包");
Toast.makeText(mApplication, "皮肤文件校验出错,本地文件 MD5 = " + localSkinFileMd5 + " 与云端文件 MD5 = " + skin.md5 + " 不一致,删除皮肤包", Toast.LENGTH_LONG).show();
// TODO 删除本地皮肤文件并重新下载这个操作比较危险需要严格保证配置文件中的md5与实际皮肤包一致否则将是灾难
skinFile.delete();

View File

@@ -103,4 +103,47 @@ public class FileUtils {
return false;
}
}
/**
* 递归打印文件夹内的文件
*
* @param folder
*/
public static void listFilesForFolder(final File folder) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
// 如果是目录,则递归调用本方法
listFilesForFolder(fileEntry);
} else {
// 如果是文件,则打印文件名
Log.d(TAG, "递归打印文件夹内的文件:" + fileEntry.getAbsolutePath());
}
}
}
/**
* 递归查询指定文件是否存在
*
* @param folder
* @param fileName
*/
public static boolean fileIsExists(final File folder, final String fileName) {
for (final File fileEntry : folder.listFiles()) {
if (fileEntry.isDirectory()) {
// 如果是目录,则递归调用本方法
listFilesForFolder(fileEntry);
} else {
if (fileEntry.getName().equals(fileName)) {
// 如果是文件,则打印文件名
Log.w(TAG, "递归查询指定文件是否存在:已存在," + fileEntry.getAbsolutePath());
return true;
}
}
}
Log.w(TAG, "递归查询指定文件是否存在不存在fileName = " + fileName);
return false;
}
}