Android:关闭时如何控制电子墨水屏幕

时间:2020-06-07 17:23:55

标签: android battery e-ink

我的电子书阅读器(tolino shine 3)允许您配置屏幕关闭时电子墨水显示屏应显示的内容。如何以编程方式执行此操作?

我写了一个小应用程序,它每10分钟打开wifi以获取并显示最新的天气报告,然后再次关闭wifi。由于在没有任何变化的情况下电子墨水浸渍纸不会使用电源,因此我认为电池可以使用很长时间(我的目标是1周),但事实并非如此。显然,只要设备正式“开机”,Android就会一直在吸干电池。 2天后,演出结束了。如果我可以关闭屏幕而不清除屏幕,我想这将大大改善运行时间。

任何帮助将不胜感激。关于Android上的电子墨水API的信息很少。

tolino shine 3在Android 4.4上运行。

1 个答案:

答案 0 :(得分:0)

在logcat中,我发现了以下几行:

06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strSuspendImgFileName = /storage/sdcard1/suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strEPubFolder + "/" + strDefaultImgFileName = /data/data/de.telekom.epub/files//suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strDefaultImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strEPubFolder + "/" + strChargeImgFileName = /data/data/de.telekom.epub/files//suspend_charging_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strChargeImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_charging_others.jpg
06-12 13:22:09.250 2484-2510/system_process I/Terry-FB: strLocaleImgFolder + "/" + strFullImgFileName = /system/usr/sleep/drawable-de-nodpi/suspend_batteryfull_others.jpg

显然,这是它加载睡眠期间显示的图像的地方。我使用grep在/system/framework/android.policy.jar中找到了代码。 因此,我使用JADX对该文件进行了反编译,并在ShowSleepScreenEx()中找到了清除和覆盖屏幕的行。由于用JADX反编译的代码相当麻烦,因此我使用apktool将jar反编译为smali代码,然后删除了对ShowSleepScreenEx()的调用。使用“ apktool构建”,我重新创建了jar文件并将其推回到设备中。瞧,当设备进入睡眠状态时,屏幕不再清除。

我没有找到以编程方式关闭屏幕的方法,所以我只是使用来将屏幕超时设置为较低的值

adb shell settings put system screen_off_timeout 1000

(嗯,事实证明最小值是10s,但由于我很固执,我仍然将其设置为1s:- 使用ALarmManager,我每分钟醒来以更新时间。 由于某种原因,在屏幕上打开屏幕的常用方法(SCREEN_DIM_WAKE_LOCK,WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)不起作用,因此我发现了另一种方法: 我交叉编译了libevdevevemu并模拟了按下电源按钮:

public class AlarmWorker extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Process proc = Runtime.getRuntime().exec(new String[]{"/system/bin/evemu-event",
                    "--sync", "/dev/input/event0", "--type", "EV_KEY", "--code", "KEY_POWER", "--value", "1"});
            proc.waitFor();
            SystemClock.sleep(50);
            proc = Runtime.getRuntime().exec(new String[]{ "/system/bin/evemu-event",
                    "--sync", "/dev/input/event0", "--type", "EV_KEY", "--code", "KEY_POWER", "--value", "0" });
            proc.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

一次充电后,电池可持续使用5天,而不是2天。