如何正确触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图?

48
如文档所述:
“持有REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限的应用程序可以触发系统对话框,让用户直接将应用程序添加到白名单中,而无需进入设置。该应用程序会触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图来启动该对话框。”
请问有人能告诉我触发此意图的正确方法吗?

1
一个替代方案是使用adb的doit或者在你的应用程序中创建命令行工具来调用类似于答案中所示的内容,这对我来说完美地运作。 - Edgar
3个回答

71
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);

Kotlin

val intent = Intent()
val pm : PowerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
if (pm.isIgnoringBatteryOptimizations(context.packageName)) {
    intent.action = Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
} else {
    intent.action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
    intent.data = Uri.parse("package:${context.packageName}")
}
context.startActivity(intent)

有关更多信息,请参见此答案


32
小心处理这个问题 - 我的应用程序因请求“REQUEST_IGNORE_BATTERY_OPTIMIZATIONS”而在未经事先通知的情况下被Google Play暂停了,尽管免除应用程序的电池优化对其功能至关重要,但由于技术原因我无法使用GCM。请注意不要改变原意。 - Elad Nava
14
他们决定只有在我删除“REQUEST_IGNORE_BATTERY_OPTIMIZATIONS”权限时才能恢复我的应用程序,尽管我解释说根据文档,我有权请求该权限。为了避免应用程序被永久删除,我决定将其删除。谷歌似乎对暂停和永久禁止在Google Play上的应用程序非常迅速而毫无感情。 - Elad Nava
22
只有在你的AndroidManifest.xml文件中添加了<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>,才会触发此操作。 - Andrew
4
@Alin 我最终取消了权限。我手动引导抱怨应用程序无法正常工作的用户将应用程序加入电池优化白名单。 - Elad Nava
4
谢谢!我的理解是,如果在清单文件中没有声明这一点,直接将用户引导到退出页面(通过使用此操作和应用程序ID作为数据调用startActivity())是安全的。 - Amir Uval
显示剩余28条评论

20
为了避免被 Google Play 商店停用,最好将用户引导至电池优化设置,以手动将应用程序添加到白名单中。

为了避免被 Google Play 商店停用,最好将用户引导至电池优化设置,以手动将应用程序添加到白名单中。

Intent myIntent = new Intent();
myIntent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS);
startActivity(myIntent);

同时,它不需要拥有

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

清单文件中的权限


10
没有获得许可,startActivity() 函数不会执行任何操作。 - KgaboL
我同意@KgaboL的观点,如果在清单中缺少android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,则使用操作Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS启动活动不会有任何作用。然而,我确实希望将用户带到页面,让他们手动打开它。 - RobbiewOnline
2
同时,通过ActionIgnoreBatteryOptimizationSettings带用户前往页面查看是否被优化似乎有些有趣。我只想前往被优化的页面以便我可以禁用它。 - RobbiewOnline
2
它在没有权限的情况下完美运行。只有在需要“ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS”时才需要权限。如果不起作用,请检查您是否将“setData”行添加到意图中。如本答案所示,意图应该只有一个操作。 - Mister Smith

-4
    Intent myIntent = new Intent();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        myIntent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
        myIntent.setData(Uri.parse("package:" + getActivity().getPackageName()));
    }
    startActivity(myIntent);

2
仅提供代码的答案是不够的,请在您的代码中提供一些解释 - Jesse
11
这不合理。如果SDK < M,则调用带有空意图的startActivity。 - cambunctious
正如@Jamile在上面提到的,您需要在清单中获得权限才能使其工作,否则会看到很多警告,说您的应用程序可能会被从Google Play中删除... 如果它导致显示对话框并让用户做出选择,那么这似乎有些严厉。 - RobbiewOnline

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接