当前位置: 首页 > article >正文

Android笔记(三十三):封装设备性能级别判断工具——低端机还是高端机

背景

有时候需要根据设备性能返回是否低端机还是高端机,来决定某些功能或者酷炫效果是否展示,如过渡动画等,所以需要封装这样一套全局使用的工具去判断

过程分析

获取设备总内存

  • mem.totalMem ushr 20 这一句将获取到的内存值由bytes转成MB
    fun getTotalMemory(context: Context): Int {
        try {
            val mem = ActivityManager.MemoryInfo()
            val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            activityManager.getMemoryInfo(mem)
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                totalMemory = 1024
            } else {
                totalMemory = (mem.totalMem ushr 20).toInt()
            }
        } catch (_: Throwable) {
            
        }
        return totalMemory
    }
    

获取内存水平

  • 系统会预留部分内存,所以实际出来的内存值是小于等于预定的
  • 2G或以下的低端配置,2-4G中低端配置,6G中端配置,8G高端配置,8G以上旗舰机配置
    private fun getMemoryLevel(context: Context): Int {
        val ramMB: Long = getTotalMemory(context)
        return if (ramMB <= 2000) { 
            0
        } else if (ramMB <= 4000) { 
            1
        } else if (ramMB <= 6000) {
            2
        } else if (ramMB <= 8000) {
            3
        } else {
            4
        }
    }

获取CPU水平

  • getCpuCoreCount()获取cpu核心线程数,小于4是直接是最低端配置
  • getMaxCpuFreq() 获取cpu最高频率,小于等于1.8GHz为低端配置, 小于等于2GHz为低中端配置,小于等于2.5GHz为中高端配置,其余为高端配置
private fun getCPULevel(): Int {
        var level = -1
        // String cpuName = getHardWare();
        val cpuCoreCount: Int = getCpuCoreCount()
        level = if (cpuCoreCount <= 4) {
            0
        } else {
            val maxCpuFreq: Long = getMaxCpuFreq()
            if (maxCpuFreq <= 0) {
                2
            } else {
                val freqMHz = (maxCpuFreq / 100000 * 100).toInt()
                if (freqMHz <= 1800) {
                    0
                } else if (freqMHz <= 2000) {
                    1
                } else if (freqMHz <= 2500) {
                    2
                } else {
                    3
                }
            }
        }
        return level
    }

汇总判断设备类型

  • 系统版本小于8的直接定义为低端机
  • 这里还加入显卡名称为PowerVR Rogue来判断
fun getPhoneLevel(context: Context): Int {
        var level: Int = PHONE_LEVEL_UNKNOWN
        val isLowSDK = Build.VERSION.SDK_INT < Build.VERSION_CODES.O
        val memoryLevel = getMemoryLevel(context)
        val cpuLevel = getCPULevel()
        val gpuName = getGpuName()
        if (isLowSDK || memoryLevel == 0 || memoryLevel == 1 || cpuLevel == 0) {
            level = if (!isLowSDK && cpuLevel >= 1 && memoryLevel > 0 && !gpuName.startsWith("PowerVR Rogue")) {
                PHONE_LEVEL_MIDDLE
            } else {
                PHONE_LEVEL_LOW
            }
        } else if (memoryLevel == 2 && cpuLevel >= 1 && !gpuName.startsWith("PowerVR Rogue")) {
            level = PHONE_LEVEL_MIDDLE
        } else if (memoryLevel > 2) {
            level = if (cpuLevel > 2) {
                PHONE_LEVEL_HIGH
            } else if (!gpuName.startsWith("PowerVR Rogue")){
                PHONE_LEVEL_MIDDLE
            } else {
                PHONE_LEVEL_LOW
            }
        }
        return level
    }

测试代码

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun onClick(view: View) {
        val memory = PhoneLevelUtils.getTotalMemory(this)
        val cpuFreq = PhoneLevelUtils.getMaxCpuFreq()
        val maxCpuFreq = (cpuFreq / 100000 * 100).toInt()
        val gpuName = PhoneLevelUtils.getGpuName()
        Log.d("萌面小侠Plus", "手机内存为:$memory MB, cpu主频为:$maxCpuFreq Mhz, gpu名称为:$gpuName")
        val level = PhoneLevelUtils.getPhoneLevel(this)
        val res = when(level) {
            PhoneLevelUtils.PHONE_LEVEL_HIGH -> "高端机"
            PhoneLevelUtils.PHONE_LEVEL_MIDDLE -> "中端机"
            PhoneLevelUtils.PHONE_LEVEL_LOW -> "低端机"
            else -> "未知"
        }
        Log.d("萌面小侠Plus", "手机性能级别为:$res")
    }
}

运行结果

在这里插入图片描述


http://www.kler.cn/a/385305.html

相关文章:

  • 串口接收,不定长数据接收
  • 云轴科技ZStack助力新远科技开启化工行业智能制造新篇章
  • 单纯的查询而言,vector和map谁更快
  • 低压线路保护器在生产型企业配电系统中的应用
  • JavaScript3*3表格实现每次点击只红一行
  • 信息安全工程师(81)网络安全测评质量管理与标准
  • Mysql 大表limit查询优化原理实战
  • 【ESP32+MicroPython】网络编程基础
  • 从个人品牌到企业品牌:开源 AI 智能名片 S2B2C 商城小程序的启示
  • QT 5.13.0 + MSVC2017 + MYSQL8.0.11
  • RabbitMQ 不公平分发介绍
  • VUE单页面 路由
  • Netty篇(入门编程)
  • 麒麟信安支撑2024年电力监控系统网络安全加固培训护航电力网络安全!
  • vscode----ssh远程连接输入地址跳转扩展
  • SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
  • Navicat15,Navicat16闪退,创建连接,使用自带工具等闪退
  • 二、应用层,《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》
  • 【ChatGPT】让ChatGPT帮助制定项目计划与任务分配
  • App投放增长:RTA
  • 【笔记】扩散模型(九):Imagen 理论与实现
  • 什么是ReasonML,有什么特点
  • 利用SheetJS在前端解析Excel读取数据并赋值给组件
  • Sentinel通过限流对微服务进行保护
  • 免费caj转pdf
  • 上门理发系统的搭建