package com.secondworld.univeralsdk; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.AssetManager; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map; /** * Created by Administrator on 2018/6/14 0014. */ public class FileUtil { private static final String TAG = "H2Engine_FileUtil"; private static Boolean IsDoingCopyBuildin = false; public static void copyOneAssetsInOneFunc(final Activity activity) { if (IsDoingCopyBuildin) return; IsDoingCopyBuildin = true; new Thread(new Runnable() { @Override public void run() { String[] _fileNames = new String[]{ "builtin_assetbundle", "builtin_assetbundle.manifest", "builtin/musics", "builtin/musics.manifest", "builtin/prefabs", "builtin/prefabs.manifest", "builtin/sprites", "builtin/sprites.manifest", "builtin/animationclips", "builtin/animationclips.manifest", "builtin/materials", "builtin/materials.manifest", "builtin/scriptableobjects", "builtin/scriptableobjects.manifest", "builtin/font", "builtin/font.manifest", "config/Contact.txt", "config/HelpInfo.txt", "config/PriorBundle.txt", "config/PriorLanguage.txt", "config/ApkUpdateUrl.txt", }; for (String _fileName : _fileNames) { copy(activity, _fileName); } } }).start(); } /** * Unity随包资源(StreamingAssets)拷贝至 persistentDataPath 路径下 */ public static void copyAssets(final Activity activity) { // 判断是否已经执行过 SharedPreferences _sp = activity.getPreferences(Context.MODE_PRIVATE); Boolean _isCopied = hasCopy(activity); LogUtil.i(TAG, "是否已经执行过拷贝逻辑: " + _isCopied); // 获取当前包的版本号 final String _currentVer = UniversalUtil.GetVersionName(activity); // 已经拷贝过, 则再次判断一次版本号 // 如果版本号不相同, 则重新进行拷贝 // 获取本地存储的版本号 String _installVer = _sp.getString(StaticDefine.LS_KEY_VERSION, ""); if (!_installVer.equals(_currentVer)) { LogUtil.i(TAG, "版本比较过后发现不同: " + _installVer + " != " + _currentVer); SharedPreferences.Editor _editor = _sp.edit(); // 存储此次的版本信息 _editor.putString(StaticDefine.LS_KEY_VERSION, _currentVer); _editor.apply(); if (_isCopied) { // 将本地存储修改为未拷贝过 deleteRecord(activity); _isCopied = false; } } if (_isCopied) { Map _msg = new HashMap<>(); _msg.put("code", CodeA2U.AssetCopyFinished); UniversalUtil.sendMessageToUnity(_msg); return; } new Thread(new Runnable() { @Override public void run() { String _dest = activity.getExternalFilesDir("").getAbsolutePath(); AssetManager _assetMgr = activity.getAssets(); try { String[] _fileNames = _assetMgr.list("android"); if (_fileNames != null) { for (String _fileName : _fileNames) { copy(activity, "android" + File.separator + _fileName, _dest + File.separator + _fileName); } } recordCopy(activity); Map _msg = new HashMap<>(); _msg.put("code", CodeA2U.AssetCopyFinished); UniversalUtil.sendMessageToUnity(_msg); } catch (Exception e) { e.printStackTrace(); } } }).start(); } public static void copy(Context context, String fileName) { String _originalPath = "android" + File.separator + fileName; String _destPath = context.getExternalFilesDir( "").getAbsolutePath() + File.separator + fileName; String _destDir = _destPath.substring(0, _destPath.lastIndexOf('/') + 1); File _file = new File(_destDir); if (!_file.exists()) { LogUtil.i(TAG, "单独拷贝 => 不存在指定路径: " + _destDir + ", 这里创建..."); _file.mkdir(); } try { InputStream _is = context.getAssets().open(_originalPath); FileOutputStream _fos = new FileOutputStream(new File(_destPath)); byte[] _buffer = new byte[1024]; int _byteCount; while ((_byteCount = _is.read(_buffer)) != -1) { _fos.write(_buffer, 0, _byteCount); } _fos.flush(); _is.close(); _fos.close(); LogUtil.i("FileUtil", "单独拷贝 => 文件: " + _originalPath + " 已拷贝至: " + _destPath); } catch (Exception e) { e.printStackTrace(); } } public static void copy(Context context, String original, String dest) { try { String _fileNames[] = context.getAssets().list(original); if (_fileNames.length > 0) { File _dir = new File(dest); _dir.mkdir(); LogUtil.i("FileUtil", "[" + original + "] 是一个文件夹, 创建文件夹: [" + dest + "]"); for (String _fileName : _fileNames) { copy(context, original + File.separator + _fileName, dest + File.separator + _fileName); } } else { InputStream _is = context.getAssets().open(original); FileOutputStream _fos = new FileOutputStream(new File(dest)); byte[] _buffer = new byte[1024]; int _byteCount; while ((_byteCount = _is.read(_buffer)) != -1) { _fos.write(_buffer, 0, _byteCount); } _fos.flush(); _is.close(); _fos.close(); LogUtil.i("FileUtil", "文件: " + original + " 已拷贝至: " + dest); } } catch (Exception e) { e.printStackTrace(); } } public static String getFileNameWithoutExtension(String fileName) { return fileName.substring(0, fileName.lastIndexOf(".")); } private static boolean hasCopy(Context context) { File _file = new File(context.getExternalFilesDir(""), "/assetCopyFinish.txt"); return _file.exists(); } private static void deleteRecord(Context context) { File _file = new File(context.getExternalFilesDir(""), "/assetCopyFinish.txt"); if (_file.exists()) { _file.delete(); } } private static void recordCopy(Context context) { File _file = new File(context.getExternalFilesDir(""), "/assetCopyFinish.txt"); try { FileOutputStream _fos = new FileOutputStream(_file); Writer _writer = new OutputStreamWriter(_fos, "UTF-8"); _writer.write(1); _writer.close(); _fos.close(); } catch (IOException e) { e.printStackTrace(); } } }