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

标签 android battery e-ink

我的电子书阅读器 (tolino Shine 3) 允许您配置屏幕关闭时电子墨水显示屏应显示的内容。我怎样才能以编程方式做到这一点?

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

如有任何帮助,我们将不胜感激。关于 Android 上的电子墨水 API 的信息非常少。

tolino Shine 3 在 Android 4.4 上运行。

最佳答案

在 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

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

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

adb shell settings put system screen_off_timeout 1000

(好吧,事实证明最小值是 10 秒,但我很固执,我仍然将其设置为 1 秒:-)) 使用 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 天。

关于Android:如何在关闭时控制电子墨水屏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62249065/

相关文章:

xcode - 使用 Xcode 时保持电池生命周期 - 您的设置/建议?

c - 为电子书阅读器设备编写软件

java - 如何在 Java 中重写库方法?

android - 使用 SyncAdapters 时登录两次

ios - 在 iOS 中以编程方式减少由于后台事件而导致的电池消耗

python - 将全彩色图像转换为三色图像以用于电子墨水显示

android - 如何使用点击 ListView 中的项目来更新数量

java - 我可以在 VB.NET (Windows 7) 和 java (android) 之间发送数据来开发应用程序吗?

c++ - 如何使用 GetSystemPowerStatusEx2 API 在 Wince 中表示电池温度值?