Android设备内存和SD卡操作工具类

简介: package cc.c;import java.io.File;import java.util.List;import android.
package cc.c;

import java.io.File;
import java.util.List;
import android.os.StatFs;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import android.os.Environment;
import android.content.Context;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.app.ActivityManager.RunningAppProcessInfo;

public class StorageUtil {
	private static final int ERROR = -1;
	public static int save_dir = 1;

	
	//判断是否已经安装SD卡
	public static boolean isSDCardExist() {
		return android.os.Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);
	}
	
	
	
	//内存清理
	//注意权限:
	//<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
	public static void cleanMemory(Context context){
		System.out.println("---> 清理前可用内存:"+getAvailMemory(context)+"MB");
		ActivityManager activityManager=(ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
		RunningAppProcessInfo runningAppProcessInfo=null;
		List<RunningAppProcessInfo>  runningAppProcessInfoList= activityManager.getRunningAppProcesses();
		//List<ActivityManager.RunningServiceInfo> serviceInfos = mActivityManager.getRunningServices(100);

		if (runningAppProcessInfoList != null) {
			for (int i = 0; i < runningAppProcessInfoList.size(); ++i) {
				runningAppProcessInfo= runningAppProcessInfoList.get(i);
				// 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE
				// 的进程即为长时间未使用进程或者空进程
				// 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE
				// 的进程都是非可见进程,即在后台运行
				if (runningAppProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
					String[] pkgList = runningAppProcessInfo.pkgList;
					for (int j = 0; j < pkgList.length; ++j) {
						System.out.println("===> 正在清理:"+pkgList[j]);
						activityManager.killBackgroundProcesses(pkgList[j]);
					}
				}

			}
		}
		System.out.println("---> 清理后可用内存:"+getAvailMemory(context)+"MB");
	}

	
	
	//获取内存总大小
	public static long getTotalMemory() {
		//系统的内存信息文件
		String filePath = "/proc/meminfo";
		String lineString;
		String[] stringArray;
		long totalMemory = 0;
		try {
			FileReader fileReader = new FileReader(filePath);
			BufferedReader bufferedReader = new BufferedReader(fileReader,1024 * 8);
			//读取meminfo第一行,获取系统总内存大小
			lineString = bufferedReader.readLine();
			//按照空格拆分
			stringArray = lineString.split("\\s+");
			//获得系统总内存,单位KB
			totalMemory = Integer.valueOf(stringArray[1]).intValue();
			bufferedReader.close();
		} catch (IOException e) {
		}
		return totalMemory / 1024;
	}
	
	
	
	//获取可用内存大小
	public static long getAvailMemory(Context context) {
		ActivityManager activityManager=(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
		MemoryInfo memoryInfo = new MemoryInfo();
		activityManager.getMemoryInfo(memoryInfo);
		return memoryInfo.availMem / (1024 * 1024);
	}

	
	
	//SD卡剩余空间
	public static long getAvailableExternalMemorySize() {
		if (isSDCardExist()) {
			File path = Environment.getExternalStorageDirectory();
			StatFs stat = new StatFs(path.getPath());
			long blockSize = stat.getBlockSize();
			long availableBlocks = stat.getAvailableBlocks();
			return availableBlocks * blockSize;
		} else {
			return ERROR;
		}
	}

	
	
	//SD卡总空间
	public static long getTotalExternalMemorySize() {
		if (isSDCardExist()) {
			File path = Environment.getExternalStorageDirectory();
			StatFs stat = new StatFs(path.getPath());
			long blockSize = stat.getBlockSize();
			long totalBlocks = stat.getBlockCount();
			return totalBlocks * blockSize;
		} else {
			return ERROR;
		}
	}

	
	
	//判断SD卡下external_sd文件夹的总大小
	public static long getTotalExternal_SDMemorySize() {
		if (isSDCardExist()) {
			File path = Environment.getExternalStorageDirectory();
			File externalSD = new File(path.getPath() + "/external_sd");
			if (externalSD.exists() && externalSD.isDirectory()) {
				StatFs stat = new StatFs(path.getPath() + "/external_sd");
				long blockSize = stat.getBlockSize();
				long totalBlocks = stat.getBlockCount();
				if (getTotalExternalMemorySize() != -1
						&& getTotalExternalMemorySize() != totalBlocks
								* blockSize) {
					return totalBlocks * blockSize;
				} else {
					return ERROR;
				}
			} else {
				return ERROR;
			}

		} else {
			return ERROR;
		}
	}
	
	
	
	//判断SD卡下external_sd文件夹的可用大小
	public static long getAvailableExternal_SDMemorySize() {
		if (isSDCardExist()) {
			File path = Environment.getExternalStorageDirectory();
			File externalSD = new File(path.getPath() + "/external_sd");
			if (externalSD.exists() && externalSD.isDirectory()) {
				StatFs stat = new StatFs(path.getPath() + "/external_sd");
				long blockSize = stat.getBlockSize();
				long availableBlocks = stat.getAvailableBlocks();
				if (getAvailableExternalMemorySize() != -1
						&& getAvailableExternalMemorySize() != availableBlocks
								* blockSize) {
					return availableBlocks * blockSize;
				} else {
					return ERROR;
				}

			} else {
				return ERROR;
			}

		} else {
			return ERROR;
		}
	}
}

相关文章
|
3月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
4月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
134 16
|
4月前
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
5月前
|
编解码 Android开发 UED
构建高效Android应用:从内存优化到用户体验
【10月更文挑战第11天】本文探讨了如何通过内存优化和用户体验改进来构建高效的Android应用。介绍了使用弱引用来减少内存占用、懒加载资源以降低启动时内存消耗、利用Kotlin协程进行异步处理以保持UI流畅,以及采用响应式设计适配不同屏幕尺寸等具体技术手段。
74 2
|
5月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
149 1
|
存储 编解码 Android开发
Android内存优化-Bitmap内存优化
在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。
202 0
Android内存优化-Bitmap内存优化
|
存储 编解码 缓存
|
20天前
|
安全 Android开发 iOS开发
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。

热门文章

最新文章

  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    55
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    39
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    38
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    151
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    50
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    66
  • 9
    Android历史版本与APK文件结构
    169
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    52