「Fix Skin」
1、修复皮肤包多次下载同一个皮肤包导致下载的产物与云端产物md5不一致。
This commit is contained in:
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user