请求忽略电池优化 如何正确操作

36

我有一个在前台模式下运行的IntentService任务,但在Android M+中,在Doze模式下该任务会停止运行。我读到谷歌禁止应用程序使用意图将自己置于白名单中。但是,如果我使用权限并检查GRANT或DENIED,则会获得授予的结果,但什么也没有发生。我没有看到我的应用程序在白名单中。如何在不受禁止的情况下将应用程序添加到白名单中?(我已在AndroidManifest.xml中添加了权限)

if(Build.VERSION.SDK_INT>=23){
    int permissionCheck= ContextCompat
                    .checkSelfPermission(this, Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);

    if(permissionCheck == PackageManager.PERMISSION_DENIED){

        //Should we show an explanation
        if(ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)){
            //Show an explanation
            final String message = "";
             Snackbar.make(coordinatorLayoutView,message,Snackbar.LENGTH_LONG)
                     .setAction("GRANT", new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
                             ActivityCompat.requestPermissions(MainActivity.this, new String[]{ Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS }, PERMISSION_REQUEST_CODE);
                         }
                     })
                     .show();

                }else{
                    //No explanation need,we can request the permission
                    ActivityCompat.requestPermissions(this, new String[]{ Manifest.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS }, PERMISSION_REQUEST_CODE);
                }
            }
        }
2个回答

58

REQUEST_IGNORE_BATTERY_OPTIMIZATIONS不是一个危险权限。你不需要,也不想要那段代码。引用关于REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的文档:

应用程序必须持有的权限,以便使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。这是一个普通权限:请求它的应用程序将始终被授予权限,而无需用户批准或查看它。

所以,删除所有那些代码。

我没有在白名单中看到我的应用程序。

这是因为用户似乎没有将您添加到白名单中。

请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS从安全角度授予您权限,以使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图启动Activity。确保将您的应用程序包含在Uri中:

startActivity(new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse("package:"+getPackageName())));

用户将被带到一个屏幕,在该屏幕上,他们可以指示他们愿意暂停Doze模式对您的应用程序产生的影响的部分。

如何在不被禁止的情况下将应用添加到白名单中?

如果您不想被禁止,请不要做任何此类操作。在您的应用程序中添加一个启动具有ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent 的活动。这会将用户带到总的应用程序列表,在那里用户可以切换哪些应用程序在白名单上或不在白名单上。这不需要任何权限。

在清单中请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的行为是可能会导致您被禁止的原因


CommonsWare,感谢您详细的回答。这意味着我不需要权限,只需要创建意图?我是对的吗? - Delphian
7
如果你想使用ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,直接跳转到一个特定于你的应用程序和白名单页面,你需要在清单文件中请求REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,但你不需要为此使用运行时权限代码。如果你想避免该权限,则可以改用ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS - CommonsWare
4
这在一些vivo、oppo设备上不起作用。 - karan

8

注意在使用Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS意图的活动时,这并不适用于所有手机,并且您将收到android.content.ActivityNotFoundException。特别是它不适用于运行Android 6的三星手机。我发现在这些手机上唯一有效的组合是在清单中声明REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,然后启动一个带有意图Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS的活动。即不受Google欢迎的组合。


你提到了像是在意图中添加 Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS。这是像添加到 intent.setData 还是其他什么地方? - Arun
@Arun - 它在 setAction 中使用,如下所示... intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); - John Bunyan
那么最终的解决方案是什么? 我正在使用OPPO F1(Android 6),但即使添加了权限,它仍然崩溃。 - Kiran Bablani
1
使用 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 违反了 Play Store 内容政策关于可接受用例的规定,详见 [http://developer.android.com/training/monitoring-device-state/doze-standby.html]。 - Iman Marashi
注意:Google Play政策禁止应用程序在Android 6.0+(Doze和App Standby)中直接请求豁免电源管理功能,除非应用程序的核心功能受到不利影响。因此,我不确定这是否违反了对受其影响的应用程序的规定... - Rock_Artist

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