import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; import android.util.Log; public class PowerProfile { double none, cpuidle, cpuawake, wifiscan, wifion, wifiactive, gpson; double bluetoothon, bluetoothactive, bluetoothat, screenon, screenfull; double radioscanning, radioactive, dspaudio, dspvideo, batterycapacity; double[] cpuspeeds, cpuactives, radioon; String TAG = "PowerProfile"; public PowerProfile(Context context) { try { Class bs = context.getClassLoader().loadClass("android.os.BatteryStats"); Field f = bs.getDeclaredField("NUM_SIGNAL_STRENGTH_BINS"); int bins = (Integer)f.get(null); radioon = new double[bins]; Log.v(TAG, "NUM_SIGNAL_STRENGTH_BINS=" + bins); Class pp = context.getClassLoader().loadClass("com.android.internal.os.PowerProfile"); Constructor ppconst = pp.getDeclaredConstructor(Context.class); Object ppobj = ppconst.newInstance(context); none = getAveragePower(POWER_NONE, pp, ppobj); cpuidle = getAveragePower(POWER_CPU_IDLE, pp, ppobj); cpuawake = getAveragePower(POWER_CPU_AWAKE, pp, ppobj); wifiscan = getAveragePower(POWER_WIFI_SCAN, pp, ppobj); wifion = getAveragePower(POWER_WIFI_ON, pp, ppobj); wifiactive = getAveragePower(POWER_WIFI_ACTIVE, pp, ppobj); gpson = getAveragePower(POWER_GPS_ON, pp, ppobj); bluetoothon = getAveragePower(POWER_BLUETOOTH_ON, pp, ppobj); bluetoothactive = getAveragePower(POWER_BLUETOOTH_ACTIVE, pp, ppobj); bluetoothat = getAveragePower(POWER_BLUETOOTH_AT_CMD, pp, ppobj); screenon = getAveragePower(POWER_SCREEN_ON, pp, ppobj); screenfull = getAveragePower(POWER_SCREEN_FULL, pp, ppobj); radioscanning = getAveragePower(POWER_RADIO_SCANNING, pp, ppobj); radioactive = getAveragePower(POWER_RADIO_ACTIVE, pp, ppobj); dspaudio = getAveragePower(POWER_AUDIO, pp, ppobj); dspvideo = getAveragePower(POWER_VIDEO, pp, ppobj); batterycapacity = getAveragePower(POWER_BATTERY_CAPACITY, pp, ppobj); for (int i = 0; i < radioon.length; i++) { radioon[i] = getAveragePower(POWER_RADIO_ON, i, pp, ppobj); } int numSpeedSteps = getNumSpeedSteps(pp, ppobj); cpuspeeds = new double[numSpeedSteps]; for (int i = 0; i < cpuspeeds.length; i++) { cpuspeeds[i] = getAveragePower(POWER_CPU_SPEEDS, i, pp, ppobj); } cpuactives = new double[numSpeedSteps]; for (int i = 0; i < cpuactives.length; i++) { cpuactives[i] = getAveragePower(POWER_CPU_ACTIVE, i, pp, ppobj); } } catch (Exception e) { e.printStackTrace(); Log.e("PowerProfile", e.getLocalizedMessage()); } } private double getAveragePower(String type, Class pp, Object ppobj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method ppm = pp.getDeclaredMethod("getAveragePower", String.class); double value = (Double)ppm.invoke(ppobj, type); Log.v(TAG, type + "=" + value); return value; } private double getAveragePower(String type, int i, Class pp, Object ppobj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method ppm = pp.getDeclaredMethod("getAveragePower", String.class, int.class); double value = (Double)ppm.invoke(ppobj, type, i); Log.v(TAG, type + "(" + i + ")=" + value); return value; } private int getNumSpeedSteps(Class pp, Object ppobj) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Method ppm = pp.getDeclaredMethod("getNumSpeedSteps"); int value = (Integer)ppm.invoke(ppobj); Log.v(TAG, "NumSpeedSteps" + "=" + value); return value; } public static final String POWER_NONE = "none"; public static final String POWER_CPU_IDLE = "cpu.idle"; public static final String POWER_CPU_AWAKE = "cpu.awake"; public static final String POWER_CPU_ACTIVE = "cpu.active"; public static final String POWER_WIFI_SCAN = "wifi.scan"; public static final String POWER_WIFI_ON = "wifi.on"; public static final String POWER_WIFI_ACTIVE = "wifi.active"; public static final String POWER_GPS_ON = "gps.on"; public static final String POWER_BLUETOOTH_ON = "bluetooth.on"; public static final String POWER_BLUETOOTH_ACTIVE = "bluetooth.active"; public static final String POWER_BLUETOOTH_AT_CMD = "bluetooth.at"; public static final String POWER_SCREEN_ON = "screen.on"; public static final String POWER_RADIO_ON = "radio.on"; public static final String POWER_RADIO_SCANNING = "radio.scanning"; public static final String POWER_RADIO_ACTIVE = "radio.active"; public static final String POWER_SCREEN_FULL = "screen.full"; public static final String POWER_AUDIO = "dsp.audio"; public static final String POWER_VIDEO = "dsp.video"; public static final String POWER_CPU_SPEEDS = "cpu.speeds"; public static final String POWER_BATTERY_CAPACITY = "battery.capacity"; }
公開APIではないので将来的には変更されるだろう。なお、Nexus S(2.3.4)で動作を確認した。また、この値がデフォルトのままのものもあるようだ。そのような機種では、電力消費量が正しく表示されないだろう。
0 件のコメント:
コメントを投稿