如何在低电砜模式Android 6.0中将应用程序列入白名单

这个问题与Android 6.0 Preview 3有关,该预览版将于本月底最终发布。

我正在Nexus 5“hammerhead”上测试Google预览版3中的Android 6.0中的一些东西。

新功能是“打瞌睡模式” - 类似于深度睡眠模式,当网络被禁用并且手机进入睡眠状态时,只有SMS,呼叫或高优先级GCM消息才能唤醒它。但像WhatsApp一样 - 在打瞌睡模式下,它会在2小时或更长时间后收到消息,具体取决于计时器。但是有一个名为“白名单”的“未优化”应用程序列表,您可以在其中手动添加应用程序。

好的,我想找到一种方法,以编程方式将我的应用程序添加到没有用户交互的情况下添加到电池设置中存在的设备中的“白名单应用程序列表”中。

试图使用反射来进入它,我发现:

在android.os.IDeviceIdleController中有一个方法:

public abstract void addPowerSaveWhitelistApp (String packageNameOfApp)

但这是一个接口...所以我们不能做一个接口的实例。

尚无关于此接口、方法或任何继承树的文档。

也许你有一些想法,我应该在哪里寻找以编程方式添加我的应用程序的可能性?

还有一种方法

公共抽象布尔值 isPowerSaveWhitelistApp (String packageName)

我认为应该以某种方式访问哪个?!检查该应用程序是否存在于白名单中,也许在最后希望要求用户将其添加到白名单中。

所以我的问题是,你们中有没有人试图做出更好的结果?我被困住了,我认为这是一个死胡同。

欲了解更多信息: https://newcircle.com/s/post/1739/2015/06/12/diving-into-android-m-doze


答案 1

添加权限

<uses-permission 
android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>

请求将您的应用列入白名单

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Intent intent = new Intent();
    String packageName = getPackageName();
    PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
    if (!pm.isIgnoringBatteryOptimizations(packageName)) {
        intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        intent.setData(Uri.parse("package:" + packageName));
        startActivity(intent);
    }
}

答案 2

在 Android M 预览版 3 上,如果没有用户交互,则无法禁用电池优化(=用于低电耗模式的白名单应用程序)。

它可以通过用户交互以这种方式完成:

Intent intent = new Intent();
String packageName = context.getPackageName();
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName))
    intent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
else {
    intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
    intent.setData(Uri.parse("package:" + packageName));
}
context.startActivity(intent);

推荐