1

我想在不使用 java 的情况下读取本机应用程序中的当前电池电量。Java中的等价物是:

BroadcastReceiver batteryReceiver = new BroadcastReceiver() {
    int scale = -1;
    int level = -1;
    int voltage = -1;
    int temp = -1;
    @Override
    public void onReceive(Context context, Intent intent) {
        level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
        scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
        temp = intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE, -1);
        voltage = intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE, -1);
        Log.e("BatteryManager", "level is "+level+"/"+scale+", temp is "+temp+", voltage is "+voltage);
    }
};

IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(batteryReceiver, filter);  

仅使用本机代码怎么可能做到这一点?

4

1 回答 1

1

请参阅有关 dumpsys 实用程序的主题可能以编程方式运行并读取 IO 输出缓冲区。我发现你要寻找的 C++ 源代码很少。运行 dumpsys 可能需要 root 权限。

什么是 Android ADB shell“dumpsys”工具,它有什么好处?

http://source.android.com/tech/input/dumpsys.html

http://code.metager.de/source/xref/android/4.1.1/frameworks/base/services/java/com/android/server/BatteryService.java

http://code.metager.de/source/xref/android/4.1.1/frameworks/native/cmds/dumpsys/dumpsys.cpp

http://code.metager.de/source/xref/android/4.1.1/frameworks/base/services/jni/com_android_server_BatteryService.cpp

http://code.metager.de/source/xref/android/4.1.1/frameworks/base/services/jni/onload.cpp

如果我是对的,C++ 源代码读取 /sys/class/power_supply 虚拟目录,但随后会发生什么,有人可能会告诉您更多有关 Linux 系统内部细节的信息。大多数代码似乎是 JNI 接口的东西,更新 BatteryService.java 类中的私有成员字段。OnLoad 类注册 jni<->java 钩子,但这不是你需要知道的,仅供参考。

于 2013-01-18T20:44:33.663 回答