因为最近在做清理缓存的功能所以需要用到这些方法,下面就直接贴出代码了。
获取手机信息:
/**
* 获取手机内部剩余存储空间
*
* @return
*/
public static long getAvailableInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long availableBlocks = stat.getAvailableBlocks();
return availableBlocks * blockSize;
}
/**
* 获取手机内部总的存储空间
*
* @return
*/
public static long getTotalInternalMemorySize() {
File path = Environment.getDataDirectory();
StatFs stat = new StatFs(path.getPath());
long blockSize = stat.getBlockSize();
long totalBlocks = stat.getBlockCount();
return totalBlocks * blockSize;
}
删除文件和读取文件大小
小技巧:
可以通过这个方法直接获得kb、MB、GB。系统会自动转化
Formatter.formatFileSize(context, size)
/**
* 删除指定文件夹下的所有文件
* @param file
*/
public static void deleteFile(File file){
if (file.isFile()) {
file.delete();
return;
}
if (file.isDirectory()) {
File[] childFile = file.listFiles();
if (childFile == null || childFile.length == 0) {
file.delete();
return;
}
for (File f : childFile) {
deleteFile(f);
}
file.delete();
}
// if(file.exists()){
file.delete();
// Log.i("s","sss");
// }
}
/**
* 获得文件大小
* @param file
* @return
* @throws Exception
*/
public static long getFolderSize(File file) throws Exception {
long size = 0;
try {
File[] fileList = file.listFiles();
for (int i = 0; i < fileList.length; i++) {
// 如果下面还有文件
if (fileList[i].isDirectory()) {
size = size + getFolderSize(fileList[i]);
} else {
size = size + fileList[i].length();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return size;
}
获取App所占大小稍微复杂一点:
目录结构为上图:
1、创建包:android.content.pm
2、创建两个AIDL文件IPackageStatsObserver.aidl 、PackageStats.aidl
IPackageStatsObserver.aidl:
package android.content.pm;
import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
PackageStats.aidl:
package android.content.pm;
parcelable PackageStats;
添加权限:
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
获得AppSize的方法为:
/**
* 获得App应用的大小
* @param context
* @param pkgName
* @throws NoSuchMethodException
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void getPkgSize(final Context context, String pkgName) throws NoSuchMethodException,
InvocationTargetException, IllegalAccessException {
// getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用
Method method = PackageManager.class.getMethod("getPackageSizeInfo",
String.class, IPackageStatsObserver.class);
// 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
method.invoke(context.getPackageManager(), pkgName,
new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
// 子线程中默认无法处理消息循环,自然也就不能显示Toast,所以需要手动Looper一下
Looper.prepare();
// 从pStats中提取各个所需数据
Toast.makeText(context, "缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
"\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
"\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize),
Toast.LENGTH_LONG).show();
// 遍历一次消息队列,弹出Toast
Looper.loop();
}
});
}