小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
生活随笔
收集整理的這篇文章主要介紹了
小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Util.java,使用最廣泛~
代碼中很多地方,都寫了注釋說明~基本不需要怎么解釋了~
package net.micode.fileexplorer.util;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet;import net.micode.fileexplorer.FileViewActivity; import net.micode.fileexplorer.GlobalConsts; import net.micode.fileexplorer.R; import net.micode.fileexplorer.model.FavoriteItem; import net.micode.fileexplorer.model.FileInfo; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Environment; import android.util.Log; import android.view.ActionMode; import android.view.View; import android.widget.TextView; /**工具類,包含了很多通用的工具方法,被項目中的很多類調(diào)用。*/ public class Util {//這個文件夾里面存儲的內(nèi)容是app2sd產(chǎn)生的文件夾,也就是是你手機上所有安裝到SD卡的應(yīng)用程序的緩存文件夾。//androidsecure文件夾可以刪除嗎?//如果刪除之后,軟件不能正常使用,和系統(tǒng)沒有關(guān)系。//刪的話除了會可能導(dǎo)致移動至sd卡的程序損壞,數(shù)據(jù)丟失,并不會造成什么嚴重后果。只要把移動到sd卡的損壞程序卸載,重裝,手機就完全沒有損傷,文件夾也會在再次app2sd時自動重建的。private static String ANDROID_SECURE = "/mnt/sdcard/.android_secure";//android.util.Log.log第1個參數(shù),用到“tag”,和log4j中Logger.getLogger(getClass())用法不太一樣private static final String LOG_TAG = "Util";//獲得SD卡的存儲狀態(tài),“mounted”表示已經(jīng)就緒public static boolean isSDCardReady() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}// if path1 contains path2public static boolean containsPath(String path1, String path2) {String path = path2;while (path != null) {if (path.equalsIgnoreCase(path1))return true;if (path.equals(GlobalConsts.ROOT_PATH))break;path = new File(path).getParent();}return false;}//2個路徑相加的時候,是否需要加上文件分隔符public static String makePath(String path1, String path2) {if (path1.endsWith(File.separator))return path1 + path2;return path1 + File.separator + path2;}//獲得SD卡的存儲目錄public static String getSdDirectory() {return Environment.getExternalStorageDirectory().getPath();}//判斷1個文件是否為“普通文件”,ANDROID_SECURE下的文件都不是普通的public static boolean isNormalFile(String fullName) {return !fullName.equals(ANDROID_SECURE);}//根據(jù)文件路徑,獲得Java文件File,再包裝成FileInfopublic static FileInfo GetFileInfo(String filePath) {File lFile = new File(filePath);if (!lFile.exists())return null;FileInfo lFileInfo = new FileInfo();lFileInfo.canRead = lFile.canRead();lFileInfo.canWrite = lFile.canWrite();lFileInfo.isHidden = lFile.isHidden();lFileInfo.fileName = Util.getNameFromFilepath(filePath);lFileInfo.ModifiedDate = lFile.lastModified();lFileInfo.IsDir = lFile.isDirectory();lFileInfo.filePath = filePath;lFileInfo.fileSize = lFile.length();return lFileInfo;}//根據(jù)File對象,和FilenameFilter等選項,獲得包裝的FileInfo//需要注意多少,如果File是個目錄,Count就是當(dāng)前目錄下的文件的個數(shù)。如果是普通文件,就計算文件大小。//這個時候,我們知道Count字段的含義了public static FileInfo GetFileInfo(File f, FilenameFilter filter,boolean showHidden) {FileInfo lFileInfo = new FileInfo();String filePath = f.getPath();File lFile = new File(filePath);lFileInfo.canRead = lFile.canRead();lFileInfo.canWrite = lFile.canWrite();lFileInfo.isHidden = lFile.isHidden();lFileInfo.fileName = f.getName();lFileInfo.ModifiedDate = lFile.lastModified();lFileInfo.IsDir = lFile.isDirectory();lFileInfo.filePath = filePath;if (lFileInfo.IsDir) {int lCount = 0;File[] files = lFile.listFiles(filter);// null means we cannot access this dirif (files == null) {return null;}for (File child : files) {if ((!child.isHidden() || showHidden)&& Util.isNormalFile(child.getAbsolutePath())) {lCount++;}}lFileInfo.Count = lCount;} else {lFileInfo.fileSize = lFile.length();}return lFileInfo;}/** 采用了新的辦法獲取APK圖標(biāo),之前的失敗是因為android中存在的一個BUG,通過 appInfo.publicSourceDir =* apkPath;來修正這個問題,詳情參見:* http://code.google.com/p/android/issues/detail?id=9151*/public static Drawable getApkIcon(Context context, String apkPath) {//Android系統(tǒng)為我們提供了很多服務(wù)管理類,包括ActivityManager、PowerManager(電源管理)、AudioManager(音頻管理)。//PackageManager主要是管理應(yīng)用程序包,通過它就可以獲取應(yīng)用程序信息PackageManager pm = context.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);if (info != null) {ApplicationInfo appInfo = info.applicationInfo;appInfo.sourceDir = apkPath;appInfo.publicSourceDir = apkPath;try {return appInfo.loadIcon(pm);} catch (OutOfMemoryError e) {Log.e(LOG_TAG, e.toString());}}return null;}//獲得文件的擴展名public static String getExtFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(dotPosition + 1, filename.length());}return "";}//獲得去掉“文件后綴”的文件名字,比如“C:/a/b/c.png”,輸出“C:/a/b/c”public static String getNameFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(0, dotPosition);}return "";}//從文件路徑中,獲得路徑public static String getPathFromFilepath(String filepath) {int pos = filepath.lastIndexOf('/');if (pos != -1) {return filepath.substring(0, pos);}return "";}//從文件路徑中,獲得文件名(帶后綴,如果有)public static String getNameFromFilepath(String filepath) {int pos = filepath.lastIndexOf('/');if (pos != -1) {return filepath.substring(pos + 1);}return "";}// return new file path if successful, or return nullpublic static String copyFile(String src, String dest) {File file = new File(src);if (!file.exists() || file.isDirectory()) {Log.v(LOG_TAG, "copyFile: file not exist or is directory, " + src);return null;}FileInputStream fi = null;FileOutputStream fo = null;try {fi = new FileInputStream(file);File destPlace = new File(dest);if (!destPlace.exists()) {if (!destPlace.mkdirs())return null;}String destPath = Util.makePath(dest, file.getName());File destFile = new File(destPath);int i = 1;while (destFile.exists()) {String destName = Util.getNameFromFilename(file.getName())+ " " + i++ + "."+ Util.getExtFromFilename(file.getName());destPath = Util.makePath(dest, destName);destFile = new File(destPath);}if (!destFile.createNewFile())return null;fo = new FileOutputStream(destFile);int count = 102400;byte[] buffer = new byte[count];int read = 0;while ((read = fi.read(buffer, 0, count)) != -1) {fo.write(buffer, 0, read);}// TODO: set access privilegereturn destPath;} catch (FileNotFoundException e) {Log.e(LOG_TAG, "copyFile: file not found, " + src);e.printStackTrace();} catch (IOException e) {Log.e(LOG_TAG, "copyFile: " + e.toString());} finally {try {if (fi != null)fi.close();if (fo != null)fo.close();} catch (IOException e) {e.printStackTrace();}}return null;}// does not include sd card folderprivate static String[] SysFileDirs = new String[] { "miren_browser/imagecaches" };//判斷一個文件是否需要顯示,根據(jù)Setting中的設(shè)置。特別說明:某個系統(tǒng)文件目錄,不顯示。public static boolean shouldShowFile(String path) {return shouldShowFile(new File(path));}//判斷一個文件是否需要顯示,根據(jù)Setting中的設(shè)置。特別說明:某個系統(tǒng)文件目錄,不顯示。public static boolean shouldShowFile(File file) {boolean show = Settings.instance().getShowDotAndHiddenFiles();if (show)return true;if (file.isHidden())return false;if (file.getName().startsWith("."))return false;String sdFolder = getSdDirectory();for (String s : SysFileDirs) {if (file.getPath().startsWith(makePath(sdFolder, s)))return false;}return true;}//根據(jù)上下文對象Context,獲得默認的收藏集合public static ArrayList<FavoriteItem> getDefaultFavorites(Context context) {ArrayList<FavoriteItem> list = new ArrayList<FavoriteItem>();list.add(new FavoriteItem(context.getString(R.string.favorite_photo),makePath(getSdDirectory(), "DCIM/Camera")));list.add(new FavoriteItem(context.getString(R.string.favorite_sdcard),getSdDirectory()));// list.add(new FavoriteItem(context.getString(R.string.favorite_root),// getSdDirectory()));list.add(new FavoriteItem(context.getString(R.string.favorite_screen_cap), makePath(getSdDirectory(), "MIUI/screen_cap")));list.add(new FavoriteItem(context.getString(R.string.favorite_ringtone), makePath(getSdDirectory(), "MIUI/ringtone")));return list;}//向View中的某個TextView設(shè)置文本public static boolean setText(View view, int id, String text) {TextView textView = (TextView) view.findViewById(id);if (textView == null)return false;textView.setText(text);return true;}//向View中的某個TextView設(shè)置文本public static boolean setText(View view, int id, int text) {TextView textView = (TextView) view.findViewById(id);if (textView == null)return false;textView.setText(text);return true;}// comma separated numberpublic static String convertNumber(long number) {return String.format("%,d", number);}// storage, G M K Bpublic static String convertStorage(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} elsereturn String.format("%d B", size);}public static class SDCardInfo {public long total;public long free;}//獲得SD卡的各種信息,總?cè)萘看笮『褪S嗳萘看笮〉萷ublic static SDCardInfo getSDCardInfo() {String sDcString = android.os.Environment.getExternalStorageState();if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) {File pathFile = android.os.Environment.getExternalStorageDirectory();try {android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());// 獲取SDCard上BLOCK總數(shù)long nTotalBlocks = statfs.getBlockCount();// 獲取SDCard上每個block的SIZElong nBlocSize = statfs.getBlockSize();// 獲取可供程序使用的Block的數(shù)量long nAvailaBlock = statfs.getAvailableBlocks();// 獲取剩下的所有Block的數(shù)量(包括預(yù)留的一般程序無法使用的塊)long nFreeBlock = statfs.getFreeBlocks();SDCardInfo info = new SDCardInfo();// 計算SDCard 總?cè)萘看笮Binfo.total = nTotalBlocks * nBlocSize;// 計算 SDCard 剩余大小MBinfo.free = nAvailaBlock * nBlocSize;return info;} catch (IllegalArgumentException e) {Log.e(LOG_TAG, e.toString());}}return null;}//顯示一條系統(tǒng)通知public static void showNotification(Context context, Intent intent,String title, String body, int drawableId) {NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Notification notification = new Notification(drawableId, body,System.currentTimeMillis());notification.flags = Notification.FLAG_AUTO_CANCEL;notification.defaults = Notification.DEFAULT_SOUND;if (intent == null) {// FIXEME: category tab is disabledintent = new Intent(context, FileViewActivity.class);}PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, PendingIntent.FLAG_ONE_SHOT);notification.setLatestEventInfo(context, title, body, contentIntent);manager.notify(drawableId, notification);}//格式化毫秒格式的時間public static String formatDateString(Context context, long time) {DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context);Date date = new Date(time);return dateFormat.format(date) + " " + timeFormat.format(date);}public static void updateActionModeTitle(ActionMode mode, Context context,int selectedNum) {if (mode != null) {mode.setTitle(context.getString(R.string.multi_select_title,selectedNum));if (selectedNum == 0) {mode.finish();}}}//MimeTypepublic static HashSet<String> sDocMimeTypesSet = new HashSet<String>() {{add("text/plain");add("text/plain");add("application/pdf");add("application/msword");add("application/vnd.ms-excel");add("application/vnd.ms-excel");}};public static String sZipFileMimeType = "application/zip";public static int CATEGORY_TAB_INDEX = 0;public static int SDCARD_TAB_INDEX = 1; }
遇到一個奇怪的問題,為了驗證某個函數(shù),寫了個main函數(shù)執(zhí)行,結(jié)果發(fā)生了奇葩事項~
在Java環(huán)境下的工程中執(zhí)行以下代碼,正常輸出。
public class Test {public static void main(String[] args) {System.out.println(getNameFromFilename("C:/a/b/c.png"));}public static String getNameFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(0, dotPosition);}return "";} }
打印“C:/a/b/c”
在Android環(huán)境下的工程中,竟然直接把JVM搞崩潰了,不明所以啊~
Invalid layout of java.lang.String at value
#
# A fatal error has been detected by the Java Runtime Environment:
#
# ?Internal Error (javaClasses.cpp:129), pid=8236, tid=3188
# ?fatal error: Invalid layout of preloaded class
#
# JRE version: 7.0_17-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.7-b01 mixed mode windows-amd64 compressed oops)
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# J:\AndroidCenter\MiCodeFileExplorer\hs_err_pid8236.log
#
# If you would like to submit a bug report, please visit:
# ? http://bugreport.sun.com/bugreport/crash.jsp
#
代碼中很多地方,都寫了注釋說明~基本不需要怎么解釋了~
package net.micode.fileexplorer.util;import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet;import net.micode.fileexplorer.FileViewActivity; import net.micode.fileexplorer.GlobalConsts; import net.micode.fileexplorer.R; import net.micode.fileexplorer.model.FavoriteItem; import net.micode.fileexplorer.model.FileInfo; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.os.Environment; import android.util.Log; import android.view.ActionMode; import android.view.View; import android.widget.TextView; /**工具類,包含了很多通用的工具方法,被項目中的很多類調(diào)用。*/ public class Util {//這個文件夾里面存儲的內(nèi)容是app2sd產(chǎn)生的文件夾,也就是是你手機上所有安裝到SD卡的應(yīng)用程序的緩存文件夾。//androidsecure文件夾可以刪除嗎?//如果刪除之后,軟件不能正常使用,和系統(tǒng)沒有關(guān)系。//刪的話除了會可能導(dǎo)致移動至sd卡的程序損壞,數(shù)據(jù)丟失,并不會造成什么嚴重后果。只要把移動到sd卡的損壞程序卸載,重裝,手機就完全沒有損傷,文件夾也會在再次app2sd時自動重建的。private static String ANDROID_SECURE = "/mnt/sdcard/.android_secure";//android.util.Log.log第1個參數(shù),用到“tag”,和log4j中Logger.getLogger(getClass())用法不太一樣private static final String LOG_TAG = "Util";//獲得SD卡的存儲狀態(tài),“mounted”表示已經(jīng)就緒public static boolean isSDCardReady() {return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);}// if path1 contains path2public static boolean containsPath(String path1, String path2) {String path = path2;while (path != null) {if (path.equalsIgnoreCase(path1))return true;if (path.equals(GlobalConsts.ROOT_PATH))break;path = new File(path).getParent();}return false;}//2個路徑相加的時候,是否需要加上文件分隔符public static String makePath(String path1, String path2) {if (path1.endsWith(File.separator))return path1 + path2;return path1 + File.separator + path2;}//獲得SD卡的存儲目錄public static String getSdDirectory() {return Environment.getExternalStorageDirectory().getPath();}//判斷1個文件是否為“普通文件”,ANDROID_SECURE下的文件都不是普通的public static boolean isNormalFile(String fullName) {return !fullName.equals(ANDROID_SECURE);}//根據(jù)文件路徑,獲得Java文件File,再包裝成FileInfopublic static FileInfo GetFileInfo(String filePath) {File lFile = new File(filePath);if (!lFile.exists())return null;FileInfo lFileInfo = new FileInfo();lFileInfo.canRead = lFile.canRead();lFileInfo.canWrite = lFile.canWrite();lFileInfo.isHidden = lFile.isHidden();lFileInfo.fileName = Util.getNameFromFilepath(filePath);lFileInfo.ModifiedDate = lFile.lastModified();lFileInfo.IsDir = lFile.isDirectory();lFileInfo.filePath = filePath;lFileInfo.fileSize = lFile.length();return lFileInfo;}//根據(jù)File對象,和FilenameFilter等選項,獲得包裝的FileInfo//需要注意多少,如果File是個目錄,Count就是當(dāng)前目錄下的文件的個數(shù)。如果是普通文件,就計算文件大小。//這個時候,我們知道Count字段的含義了public static FileInfo GetFileInfo(File f, FilenameFilter filter,boolean showHidden) {FileInfo lFileInfo = new FileInfo();String filePath = f.getPath();File lFile = new File(filePath);lFileInfo.canRead = lFile.canRead();lFileInfo.canWrite = lFile.canWrite();lFileInfo.isHidden = lFile.isHidden();lFileInfo.fileName = f.getName();lFileInfo.ModifiedDate = lFile.lastModified();lFileInfo.IsDir = lFile.isDirectory();lFileInfo.filePath = filePath;if (lFileInfo.IsDir) {int lCount = 0;File[] files = lFile.listFiles(filter);// null means we cannot access this dirif (files == null) {return null;}for (File child : files) {if ((!child.isHidden() || showHidden)&& Util.isNormalFile(child.getAbsolutePath())) {lCount++;}}lFileInfo.Count = lCount;} else {lFileInfo.fileSize = lFile.length();}return lFileInfo;}/** 采用了新的辦法獲取APK圖標(biāo),之前的失敗是因為android中存在的一個BUG,通過 appInfo.publicSourceDir =* apkPath;來修正這個問題,詳情參見:* http://code.google.com/p/android/issues/detail?id=9151*/public static Drawable getApkIcon(Context context, String apkPath) {//Android系統(tǒng)為我們提供了很多服務(wù)管理類,包括ActivityManager、PowerManager(電源管理)、AudioManager(音頻管理)。//PackageManager主要是管理應(yīng)用程序包,通過它就可以獲取應(yīng)用程序信息PackageManager pm = context.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(apkPath,PackageManager.GET_ACTIVITIES);if (info != null) {ApplicationInfo appInfo = info.applicationInfo;appInfo.sourceDir = apkPath;appInfo.publicSourceDir = apkPath;try {return appInfo.loadIcon(pm);} catch (OutOfMemoryError e) {Log.e(LOG_TAG, e.toString());}}return null;}//獲得文件的擴展名public static String getExtFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(dotPosition + 1, filename.length());}return "";}//獲得去掉“文件后綴”的文件名字,比如“C:/a/b/c.png”,輸出“C:/a/b/c”public static String getNameFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(0, dotPosition);}return "";}//從文件路徑中,獲得路徑public static String getPathFromFilepath(String filepath) {int pos = filepath.lastIndexOf('/');if (pos != -1) {return filepath.substring(0, pos);}return "";}//從文件路徑中,獲得文件名(帶后綴,如果有)public static String getNameFromFilepath(String filepath) {int pos = filepath.lastIndexOf('/');if (pos != -1) {return filepath.substring(pos + 1);}return "";}// return new file path if successful, or return nullpublic static String copyFile(String src, String dest) {File file = new File(src);if (!file.exists() || file.isDirectory()) {Log.v(LOG_TAG, "copyFile: file not exist or is directory, " + src);return null;}FileInputStream fi = null;FileOutputStream fo = null;try {fi = new FileInputStream(file);File destPlace = new File(dest);if (!destPlace.exists()) {if (!destPlace.mkdirs())return null;}String destPath = Util.makePath(dest, file.getName());File destFile = new File(destPath);int i = 1;while (destFile.exists()) {String destName = Util.getNameFromFilename(file.getName())+ " " + i++ + "."+ Util.getExtFromFilename(file.getName());destPath = Util.makePath(dest, destName);destFile = new File(destPath);}if (!destFile.createNewFile())return null;fo = new FileOutputStream(destFile);int count = 102400;byte[] buffer = new byte[count];int read = 0;while ((read = fi.read(buffer, 0, count)) != -1) {fo.write(buffer, 0, read);}// TODO: set access privilegereturn destPath;} catch (FileNotFoundException e) {Log.e(LOG_TAG, "copyFile: file not found, " + src);e.printStackTrace();} catch (IOException e) {Log.e(LOG_TAG, "copyFile: " + e.toString());} finally {try {if (fi != null)fi.close();if (fo != null)fo.close();} catch (IOException e) {e.printStackTrace();}}return null;}// does not include sd card folderprivate static String[] SysFileDirs = new String[] { "miren_browser/imagecaches" };//判斷一個文件是否需要顯示,根據(jù)Setting中的設(shè)置。特別說明:某個系統(tǒng)文件目錄,不顯示。public static boolean shouldShowFile(String path) {return shouldShowFile(new File(path));}//判斷一個文件是否需要顯示,根據(jù)Setting中的設(shè)置。特別說明:某個系統(tǒng)文件目錄,不顯示。public static boolean shouldShowFile(File file) {boolean show = Settings.instance().getShowDotAndHiddenFiles();if (show)return true;if (file.isHidden())return false;if (file.getName().startsWith("."))return false;String sdFolder = getSdDirectory();for (String s : SysFileDirs) {if (file.getPath().startsWith(makePath(sdFolder, s)))return false;}return true;}//根據(jù)上下文對象Context,獲得默認的收藏集合public static ArrayList<FavoriteItem> getDefaultFavorites(Context context) {ArrayList<FavoriteItem> list = new ArrayList<FavoriteItem>();list.add(new FavoriteItem(context.getString(R.string.favorite_photo),makePath(getSdDirectory(), "DCIM/Camera")));list.add(new FavoriteItem(context.getString(R.string.favorite_sdcard),getSdDirectory()));// list.add(new FavoriteItem(context.getString(R.string.favorite_root),// getSdDirectory()));list.add(new FavoriteItem(context.getString(R.string.favorite_screen_cap), makePath(getSdDirectory(), "MIUI/screen_cap")));list.add(new FavoriteItem(context.getString(R.string.favorite_ringtone), makePath(getSdDirectory(), "MIUI/ringtone")));return list;}//向View中的某個TextView設(shè)置文本public static boolean setText(View view, int id, String text) {TextView textView = (TextView) view.findViewById(id);if (textView == null)return false;textView.setText(text);return true;}//向View中的某個TextView設(shè)置文本public static boolean setText(View view, int id, int text) {TextView textView = (TextView) view.findViewById(id);if (textView == null)return false;textView.setText(text);return true;}// comma separated numberpublic static String convertNumber(long number) {return String.format("%,d", number);}// storage, G M K Bpublic static String convertStorage(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} elsereturn String.format("%d B", size);}public static class SDCardInfo {public long total;public long free;}//獲得SD卡的各種信息,總?cè)萘看笮『褪S嗳萘看笮〉萷ublic static SDCardInfo getSDCardInfo() {String sDcString = android.os.Environment.getExternalStorageState();if (sDcString.equals(android.os.Environment.MEDIA_MOUNTED)) {File pathFile = android.os.Environment.getExternalStorageDirectory();try {android.os.StatFs statfs = new android.os.StatFs(pathFile.getPath());// 獲取SDCard上BLOCK總數(shù)long nTotalBlocks = statfs.getBlockCount();// 獲取SDCard上每個block的SIZElong nBlocSize = statfs.getBlockSize();// 獲取可供程序使用的Block的數(shù)量long nAvailaBlock = statfs.getAvailableBlocks();// 獲取剩下的所有Block的數(shù)量(包括預(yù)留的一般程序無法使用的塊)long nFreeBlock = statfs.getFreeBlocks();SDCardInfo info = new SDCardInfo();// 計算SDCard 總?cè)萘看笮Binfo.total = nTotalBlocks * nBlocSize;// 計算 SDCard 剩余大小MBinfo.free = nAvailaBlock * nBlocSize;return info;} catch (IllegalArgumentException e) {Log.e(LOG_TAG, e.toString());}}return null;}//顯示一條系統(tǒng)通知public static void showNotification(Context context, Intent intent,String title, String body, int drawableId) {NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);Notification notification = new Notification(drawableId, body,System.currentTimeMillis());notification.flags = Notification.FLAG_AUTO_CANCEL;notification.defaults = Notification.DEFAULT_SOUND;if (intent == null) {// FIXEME: category tab is disabledintent = new Intent(context, FileViewActivity.class);}PendingIntent contentIntent = PendingIntent.getActivity(context, 0,intent, PendingIntent.FLAG_ONE_SHOT);notification.setLatestEventInfo(context, title, body, contentIntent);manager.notify(drawableId, notification);}//格式化毫秒格式的時間public static String formatDateString(Context context, long time) {DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(context);DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(context);Date date = new Date(time);return dateFormat.format(date) + " " + timeFormat.format(date);}public static void updateActionModeTitle(ActionMode mode, Context context,int selectedNum) {if (mode != null) {mode.setTitle(context.getString(R.string.multi_select_title,selectedNum));if (selectedNum == 0) {mode.finish();}}}//MimeTypepublic static HashSet<String> sDocMimeTypesSet = new HashSet<String>() {{add("text/plain");add("text/plain");add("application/pdf");add("application/msword");add("application/vnd.ms-excel");add("application/vnd.ms-excel");}};public static String sZipFileMimeType = "application/zip";public static int CATEGORY_TAB_INDEX = 0;public static int SDCARD_TAB_INDEX = 1; }
遇到一個奇怪的問題,為了驗證某個函數(shù),寫了個main函數(shù)執(zhí)行,結(jié)果發(fā)生了奇葩事項~
在Java環(huán)境下的工程中執(zhí)行以下代碼,正常輸出。
public class Test {public static void main(String[] args) {System.out.println(getNameFromFilename("C:/a/b/c.png"));}public static String getNameFromFilename(String filename) {int dotPosition = filename.lastIndexOf('.');if (dotPosition != -1) {return filename.substring(0, dotPosition);}return "";} }
打印“C:/a/b/c”
在Android環(huán)境下的工程中,竟然直接把JVM搞崩潰了,不明所以啊~
Invalid layout of java.lang.String at value
#
# A fatal error has been detected by the Java Runtime Environment:
#
# ?Internal Error (javaClasses.cpp:129), pid=8236, tid=3188
# ?fatal error: Invalid layout of preloaded class
#
# JRE version: 7.0_17-b02
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.7-b01 mixed mode windows-amd64 compressed oops)
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# J:\AndroidCenter\MiCodeFileExplorer\hs_err_pid8236.log
#
# If you would like to submit a bug report, please visit:
# ? http://bugreport.sun.com/bugreport/crash.jsp
#
轉(zhuǎn)載于:https://www.cnblogs.com/qitian1/p/6462646.html
總結(jié)
以上是生活随笔為你收集整理的小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: List的遍历 Java
- 下一篇: 重载模块概念及意义