diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BatteryUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BatteryUtils.java index c5e6950..fb28e4b 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BatteryUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/BatteryUtils.java @@ -1,80 +1,75 @@ package cc.winboll.studio.powerbell.utils; -import android.app.Notification; -import android.app.NotificationManager; -import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.os.BatteryManager; import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.powerbell.R; /** - * 电池工具类:获取电池状态、发送提醒通知(复用逻辑,避免代码冗余) + * @Author ZhanGSKen&豆包大模型 + * @Date 2024/07/18 04:32:46 + * @Describe 电池状态工具类 + * 功能:解析电池广播Intent,获取充电状态、当前电量 + * 适配:Java7 | API30 | 小米手机 */ public class BatteryUtils { - private static final String TAG = "BatteryUtils"; - private static final int REMIND_NOTIFICATION_ID = 10087; // 提醒通知ID + // ================================== 静态常量区(置顶归类,消除魔法值)================================= + public static final String TAG = "BatteryUtils"; - /** - * 获取当前电池电量(0-100) - */ - public static int getCurrentBattery(Context context) { - Intent batteryIntent = context.getApplicationContext().registerReceiver( - null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED) - ); - if (batteryIntent == null) return 0; - // 提取电量(当前电量/总电量 * 100) - int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); - int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); - return (level * 100) / scale; - } + // 电池电量计算常量 + private static final int BATTERY_SCALE_DEFAULT = 100; + private static final int BATTERY_LEVEL_MIN = 0; + private static final int BATTERY_LEVEL_MAX = 100; + // ================================== 工具方法(静态方法,无状态设计)================================= /** - * 判断是否正在充电(有线/无线均可) + * 判断当前是否处于充电状态 + * @param intent 电池状态广播Intent(非空) + * @return true=充电中/已充满,false=未充电 */ - public static boolean isCharging(Context context) { - Intent batteryIntent = context.getApplicationContext().registerReceiver( - null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED) - ); - if (batteryIntent == null) return false; - int status = batteryIntent.getIntExtra(BatteryManager.EXTRA_STATUS, BatteryManager.BATTERY_STATUS_UNKNOWN); - return status == BatteryManager.BATTERY_STATUS_CHARGING - || status == BatteryManager.BATTERY_STATUS_FULL; - } - - /** - * 显示充电提醒通知 - */ - public static void showChargeReminderNotification(Context context) { - Notification notification = new Notification.Builder(context) - .setSmallIcon(R.drawable.ic_launcher) - .setContentTitle("充电提醒") - .setContentText("电池电量已达标,建议及时断电保护电池~") - .setAutoCancel(true) // 点击后取消通知 - .build(); - NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - if (manager != null) { - manager.notify(REMIND_NOTIFICATION_ID, notification); + public static boolean isCharging(Intent intent) { + LogUtils.d(TAG, "isCharging: 调用 | intent=" + intent); + // 入参非空校验 + if (intent == null) { + LogUtils.e(TAG, "isCharging: intent为空,返回false"); + return false; } - LogUtils.d(TAG, "showChargeReminderNotification: notification show"); + + int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1); + boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL; + LogUtils.d(TAG, "isCharging: 解析完成 | status=" + status + " | result=" + isCharging); + return isCharging; } /** - * 显示耗电提醒通知 + * 获取当前电池电量百分比(0-100) + * @param intent 电池状态广播Intent(非空) + * @return 电量百分比,异常返回0 */ - public static void showUsageReminderNotification(Context context) { - Notification notification = new Notification.Builder(context) - .setSmallIcon(R.drawable.ic_launcher) - .setContentTitle("耗电提醒") - .setContentText("电池电量偏低,建议及时充电~") - .setAutoCancel(true) - .build(); - NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); - if (manager != null) { - manager.notify(REMIND_NOTIFICATION_ID, notification); + public static int getCurrentBatteryLevel(Intent intent) { + LogUtils.d(TAG, "getCurrentBatteryLevel: 调用 | intent=" + intent); + // 入参非空校验 + if (intent == null) { + LogUtils.e(TAG, "getCurrentBatteryLevel: intent为空,返回0"); + return BATTERY_LEVEL_MIN; } - LogUtils.d(TAG, "showUsageReminderNotification: notification show"); + + // 解析电量原始值与刻度值 + int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, BATTERY_LEVEL_MIN); + int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, BATTERY_SCALE_DEFAULT); + LogUtils.d(TAG, "getCurrentBatteryLevel: 原始值 | level=" + level + " | scale=" + scale); + + // 计算并校验电量百分比,避免除以0或数值越界 + int batteryLevel; + if (scale <= 0) { + batteryLevel = level; + LogUtils.w(TAG, "getCurrentBatteryLevel: scale无效,直接使用level值"); + } else { + batteryLevel = level * BATTERY_SCALE_DEFAULT / scale; + } + // 确保电量值在0-100范围内 + batteryLevel = Math.max(BATTERY_LEVEL_MIN, Math.min(batteryLevel, BATTERY_LEVEL_MAX)); + LogUtils.d(TAG, "getCurrentBatteryLevel: 计算完成 | batteryLevel=" + batteryLevel + "%"); + return batteryLevel; } }