diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinAttribute.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinAttribute.java index 228f53e..3f08ebf 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinAttribute.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinAttribute.java @@ -131,7 +131,7 @@ public class SkinAttribute { * @param typeface 字体 */ public void applySkin(Typeface typeface) { - Log.d(TAG, "applySkin() called with: typeface = [" + typeface + "] view = [" + view + "] Parent = " + view.getParent()); + //Log.d(TAG, "applySkin() called with: typeface = [" + typeface + "] view = [" + view + "] Parent = " + view.getParent()); //applySkinTypeface(typeface); applySkinViewSupport(); try { @@ -226,7 +226,7 @@ public class SkinAttribute { private void applySkinTypeface(final Typeface typeface) { if (view instanceof TextView) { - Log.d(TAG, "applySkinTypeface() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); + //Log.d(TAG, "applySkinTypeface() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); //post 防止某些控件的属性设置是在构造函数调用完成之后进行的。 mHandler.post(new Runnable() { @Override @@ -239,7 +239,7 @@ public class SkinAttribute { private void applyText(final String textStr) { if (view instanceof TextView) { - Log.d(TAG, "applyText() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); + //Log.d(TAG, "applyText() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); //post 防止某些控件的属性设置是在构造函数调用完成之后进行的。 mHandler.post(new Runnable() { @Override @@ -252,7 +252,7 @@ public class SkinAttribute { private void applyHintText(final String textStr) { if (view instanceof EditText) { - Log.d(TAG, "applyHintText() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); + //Log.d(TAG, "applyHintText() called with: view = [" + ((TextView) view).getText() + "] Parent = " + view.getParent()); //post 防止某些控件的属性设置是在构造函数调用完成之后进行的。 mHandler.post(new Runnable() { @Override diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java index ccd19b1..4ff4a12 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/SkinManager.java @@ -20,6 +20,8 @@ import java.io.File; import java.lang.reflect.Method; import java.util.Observable; +import dalvik.system.DexClassLoader; + /** * donghongyu */ @@ -61,34 +63,39 @@ public class SkinManager extends Observable { /** * 加载皮肤包 并 更新 * - * @param path 皮肤包路径 + * @param skinPath 皮肤包路径 */ - public void loadSkin(String path) { - Log.d(TAG, "加载皮肤路径:" + path); + public void loadSkin(String skinPath) { + Log.d(TAG, "加载皮肤路径:" + skinPath); //还原默认皮肤包 - if (TextUtils.isEmpty(path)) { + if (TextUtils.isEmpty(skinPath)) { SkinPreference.getInstance().setSkin(""); SkinResources.getInstance().reset(); } // 加载指定目录下的皮肤 else { try { + // 通过反射获取AssetManager AssetManager assetManager = AssetManager.class.newInstance(); - // 添加资源进入资源管理器 + // 获取插件APK的AssetManager Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); addAssetPath.setAccessible(true); - addAssetPath.invoke(assetManager, path); + int result = (int) addAssetPath.invoke(assetManager, skinPath); + if (result == 0) { + Log.e(TAG, "加载皮肤APK失败:" + skinPath); + } + // 获取当前Resources Resources resources = application.getResources(); - // 横竖、语言 + // 获取皮肤插件的 Resources 横竖、语言 Resources skinResource = new Resources(assetManager, resources.getDisplayMetrics(), resources.getConfiguration()); - //获取外部Apk(皮肤包) 包名 + // 获取外部Apk(皮肤包) 包名 PackageManager mPm = application.getPackageManager(); - PackageInfo info = mPm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES); + PackageInfo info = mPm.getPackageArchiveInfo(skinPath, PackageManager.GET_ACTIVITIES); String packageName = info.packageName; SkinResources.getInstance().applySkin(skinResource, packageName); //保存当前使用的皮肤包 - SkinPreference.getInstance().setSkin(path); + SkinPreference.getInstance().setSkin(skinPath); } catch (Exception e) { e.printStackTrace(); } @@ -145,6 +152,7 @@ public class SkinManager extends Observable { //皮肤包的md5校验 防止下载文件损坏(但是会减慢速度。从数据库查询已下载皮肤表数据库中保留md5字段) if (TextUtils.equals(SkinUtils.getSkinMD5(skinFile), skin.md5)) { Log.d("SkinActivity", "校验成功,修改文件名。"); + } else { Log.e("SkinActivity", "皮肤文件校验出错,本地文件MD5 与云端文件MD5 不一致。"); Toast.makeText(mApplication, "皮肤文件校验出错,本地文件MD5 与云端文件MD5 不一致。", Toast.LENGTH_SHORT).show(); diff --git a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java index 9074adf..e0c885b 100644 --- a/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java +++ b/libraries/mogo-skin/src/main/java/com/mogo/skin/utils/SkinResources.java @@ -8,6 +8,8 @@ import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.Log; +import java.io.DataInputStream; +import java.io.IOException; import java.io.InputStream; /** @@ -72,6 +74,7 @@ public class SkinResources { /** * 获取皮肤中的Raw文件InputStream + * * @param resId * @return */ @@ -83,7 +86,51 @@ public class SkinResources { if (skinId == 0) { return mAppResources.openRawResource(resId); } - return mSkinResources.openRawResource(resId); + return mSkinResources.openRawResource(skinId); + } + + /** + * 获取Raw的byte[] + * @param resId + * @return + */ + public byte[] getRawResourceBytes(int resId) { + byte[] totBuffer = null; + DataInputStream dis = null; + try { + dis = new DataInputStream(getRawInputStream(resId)); + int curTotSize = 64 * 1024; + totBuffer = new byte[curTotSize]; + byte[] buffer = new byte[1024]; + int size = 0; + int totSize = 0; + try { + while ((size = dis.read(buffer)) >= 0) { + if (totSize + size > curTotSize) { + curTotSize = (totSize + size) * 3 / 2; + byte[] newTotBuffer = new byte[curTotSize]; + System.arraycopy(totBuffer, 0, newTotBuffer, 0, totSize); + totBuffer = newTotBuffer; + } + System.arraycopy(buffer, 0, totBuffer, totSize, size); + totSize += size; + } + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (dis != null) { + try { + dis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return totBuffer; } public int getColor(int resId) {