REQUEST_IGNORE_BATTERY_OPTIMIZATIONS how to do it right
android, android-6.0-marshmallow, permissions
Solution
`REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` is not a `dangerous` permission. You do not need, or want, any of that code. Quoting the documentation for `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS`:
Permission an application must hold in order to use ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS. This is a normal permission: an app requesting it will always be granted the permission, without the user needing to approve or see it.
So, delete all that code.
I don't see my app in whitelist.
That is because the user did not add you to the whitelist, apparently.
Requesting `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` grants you the authority, from a security standpoint, to start an activity with an `ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` `Intent`. Be sure to include your app's package as the `Uri`:
startActivity(new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, Uri.parse("package:"+getPackageName())));
The user will be taken to a screen where they can indicate that they are willing to suspend portions of Doze mode effects on your app.
How can I add the app in whitelist without banned?
If you do not want to be banned, do not do any of this. Have something in your app that starts an activity with an `ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS` `Intent`. This leads the user to the overall list of apps, where the user can toggle which ones are and are not on the whitelist. This does not require any permission.
The act of requesting `REQUEST_IGNORE_BATTERY_OPTIMIZATIONS` in the manifest is what may get you banned.
Problem
I have `IntentService` task in foreground mode, but in Android M+ the task stops in Doze mode. I read Google banned if the app uses intent to set themselves in whitelist. But if I use permission and check GRANT or DENIED, I get the granted result, but nothing happen. I don't see my app in whitelist. How can I add the app in whitelist without banned? (I added permission in `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); } } } ```