flutter-permission-handler icon indicating copy to clipboard operation
flutter-permission-handler copied to clipboard

Permission.ignoreBatteryOptimizations.request() doesn't work.

Open viiviii opened this issue 3 years ago • 3 comments

🐛 Bug Report

Expected behavior

Permission.ignoreBatteryOptimizations.request() doesn't work.

Reproduction steps

AndroidManifest.xml

  • Add permission
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/>
  • Use code
final PermissionStatus permissionStatus = await Permission.ignoreBatteryOptimizations.request();
  • Detail log
W/ConnectionTracker(27957): Exception thrown while unbinding
W/ConnectionTracker(27957): java.lang.IllegalArgumentException: Service not registered: lv@13561b0
W/ConnectionTracker(27957): 	at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1681)
W/ConnectionTracker(27957): 	at android.app.ContextImpl.unbindService(ContextImpl.java:1854)
W/ConnectionTracker(27957): 	at android.content.ContextWrapper.unbindService(ContextWrapper.java:703)
W/ConnectionTracker(27957): 	at ci.f(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):1)
W/ConnectionTracker(27957): 	at ci.d(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):2)
W/ConnectionTracker(27957): 	at lw.E(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):9)
W/ConnectionTracker(27957): 	at lg.a(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):3)
W/ConnectionTracker(27957): 	at eg.run(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):3)
W/ConnectionTracker(27957): 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
W/ConnectionTracker(27957): 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
W/ConnectionTracker(27957): 	at iz.run(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (040406-0):5)
I/zygote64(27957): Do partial code cache collection, code=123KB, data=85KB
I/zygote64(27957): After code cache collection, code=123KB, data=85KB
I/zygote64(27957): Increasing code cache capacity to 512KB
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): Failed to handle method call
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at androidx.fragment.app.FragmentActivity.checkForValidRequestCode(FragmentActivity.java:715)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:660)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at com.baseflow.permissionhandler.PermissionManager.requestPermissions(PermissionManager.java:122)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at com.baseflow.permissionhandler.MethodCallHandlerImpl.onMethodCall(MethodCallHandlerImpl.java:91)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at android.os.MessageQueue.next(MessageQueue.java:379)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at android.os.Looper.loop(Looper.java:144)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at android.app.ActivityThread.main(ActivityThread.java:7555)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at java.lang.reflect.Method.invoke(Native Method)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
E/MethodChannel#flutter.baseflow.com/permissions/methods(27957): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
E/flutter (27957): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: PlatformException(error, Can only use lower 16 bits for requestCode, null, java.lang.IllegalArgumentException: Can only use lower 16 bits for requestCode
E/flutter (27957): 	at androidx.fragment.app.FragmentActivity.checkForValidRequestCode(FragmentActivity.java:715)
E/flutter (27957): 	at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:660)
E/flutter (27957): 	at com.baseflow.permissionhandler.PermissionManager.requestPermissions(PermissionManager.java:122)
E/flutter (27957): 	at com.baseflow.permissionhandler.MethodCallHandlerImpl.onMethodCall(MethodCallHandlerImpl.java:91)
E/flutter (27957): 	at io.flutter.plugin.common.MethodChannel$IncomingMethodCallHandler.onMessage(MethodChannel.java:233)
E/flutter (27957): 	at io.flutter.embedding.engine.dart.DartMessenger.handleMessageFromDart(DartMessenger.java:85)
E/flutter (27957): 	at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(FlutterJNI.java:692)
E/flutter (27957): 	at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (27957): 	at android.os.MessageQueue.next(MessageQueue.java:379)
E/flutter (27957): 	at android.os.Looper.loop(Looper.java:144)
E/flutter (27957): 	at android.app.ActivityThread.main(ActivityThread.java:7555)
E/flutter (27957): 	at java.lang.reflect.Method.invoke(Native Method)
E/flutter (27957): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:469)
E/flutter (27957): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:963)
E/flutter (27957): )
E/flutter (27957): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:582:7)
E/flutter (27957): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:159:18)
E/flutter (27957): <asynchronous suspension>
E/flutter (27957): #2      MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:332:12)
E/flutter (27957): #3      MethodChannelPermissionHandler.requestPermissions (package:permission_handler_platform_interface/src/method_channel/method_channel_permission_handler.dart:66:30)
E/flutter (27957): #4      PermissionListActions.request (package:permission_handler/permission_handler.dart:109:16)
E/flutter (27957): #5      PermissionActions.request (package:permission_handler/permission_handler.dart:49:26)
E/flutter (27957): #6      _MoreScreenState.build.<anonymous closure>

Hi, I am using your great package well. Thank you!😇

I request permission, the error below will occur. I think the error occurred because PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS of PermissionConstants.java is greater than 65535.

  • Error log
Can only use lower 16 bits for requestCode
E/flutter (27957): 	at androidx.fragment.app.FragmentActivity.checkForValidRequestCode(FragmentActivity.java:715)
  • PermissionConstants.java
static final int PERMISSION_CODE_IGNORE_BATTERY_OPTIMIZATIONS = 5672353;

@param requestCode The request code to be returned in {@link Fragment#onActivityResult(int, int, Intent)} when the activity exits. Must be between 0 and 65535 to be considered valid. If given requestCode is greater than 65535, an IllegalArgumentException would be thrown.

Can you tell me if I set it up wrong?😃

### Configuration

**Version:** 5.0.1+1

**Platform:** 
- [ ] :iphone: iOS
- [x] :robot: Android

viiviii avatar Dec 03 '20 04:12 viiviii

Hi. My team solved this problem as below.

Cause: My project had an error because MainActivity was using FlutterFragmentActivity, not FlutterActivity.

solve: Add the code below to android/app/build.gradle

implementation "androidx.fragment:fragment-ktx:1.3.0-beta02"

But I don't think this is a complete solution to compatibility, so I'll keep this issue open. Could you review it later and close it if it's not an issue?

viiviii avatar Dec 14 '20 13:12 viiviii

Hi @viiviii, thanks for the extensive bug report! I tried to reproduce the issue you're having but I could not reproduce it.

The steps I took to reproduce:

  1. Made a new Flutter project, and used the standard Flutter application (incremental counter)
  2. I added <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/> to the AndroidManifest
  3. In the _incrementCounter() method I used the code you provided, which was: final PermissionStatus permissionStatus = await Permission.ignoreBatteryOptimizations.request();
  4. Just to be sure I checked if the right permission status was also set by allowing the permission and printing the boolean value of permissionStatus.IsGranted which it did.
flutter doctor -v [√] Flutter (Channel beta, 2.0.0, on Microsoft Windows [Version 10.0.19041.867], locale nl-NL) • Flutter version 2.0.0 at C:\Baseflow\flutter • Framework revision 60bd88df91 (4 weeks ago), 2021-03-03 09:13:17 -0800 • Engine revision 40441def69 • Dart version 2.12.0

[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3) • Android SDK at C:\Users\Jan-Derk\AppData\Local\Android\sdk • Platform android-30, build-tools 30.0.3 • Java binary at: C:\Users\Jan-Derk\AppData\Local\JetBrains\Toolbox\apps\AndroidStudio\ch-0\201.7042882\jre\bin\java • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01) • All Android licenses accepted.

[√] Chrome - develop for the web • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Android Studio (version 4.1.0) • Android Studio at C:\Users\Jan-Derk\AppData\Local\JetBrains\Toolbox\apps\AndroidStudio\ch-0\201.7042882 • Flutter plugin can be installed from: https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: https://plugins.jetbrains.com/plugin/6351-dart • Java version OpenJDK Runtime Environment (build 1.8.0_242-release-1644-b01)

[√] IntelliJ IDEA Community Edition (version 2020.2) • IntelliJ at C:\Users\Jan-Derk\AppData\Local\JetBrains\Toolbox\apps\IDEA-C\ch-0\202.7660.26 • Flutter plugin can be installed from: https://plugins.jetbrains.com/plugin/9212-flutter • Dart plugin can be installed from: https://plugins.jetbrains.com/plugin/6351-dart

[√] Connected device (3 available) • AOSP on IA Emulator (mobile) • emulator-5556 • android-x86 • Android 9 (API 28) (emulator) • Chrome (web) • chrome • web-javascript • Google Chrome 89.0.4389.90 • Edge (web) • edge • web-javascript • Microsoft Edge 89.0.774.57 ! Device RZ8R10RN1NF is not authorized. You might need to check your device for an authorization dialog.

• No issues found!

I tested it on the Pixel 3 API 28 and API 30 (Android 9 and 11) and on a physical device which was the Samsung S20 Android 11. I used the newest version of the permission_handler plugin (version 6.1.1). Can you please let me know if the issue still occurs by using the newest version of the plugin? Thanks in advance!

JDDV avatar Mar 30 '21 09:03 JDDV

Hi @JDDV, Have you tried extending FlutterFragmentActivity as your main activity in android\app\src\main\kotlin\com\example\myapp\MainActivity.kt ?

I mean this piece

class MainActivity : FlutterFragmentActivity() {...}

because FlutterFragmentActivity triggers the problem.

Thank you!

Stefanobosio avatar Mar 31 '21 09:03 Stefanobosio

I am closing this issue as there has not been any activity in over 2 years. If you are experiencing this issue, feel free to open a new issue, linking this issue.

JeroenWeener avatar Aug 17 '23 09:08 JeroenWeener