flutter-plugins icon indicating copy to clipboard operation
flutter-plugins copied to clipboard

[Health 10.2.0] Health().requestAuthorization(...) always returning false for Android / Health Connect

Open CarlosCabarcos opened this issue 9 months ago • 20 comments

Remember to specify the plugin name in the title!

Device / Emulator and OS

Please complete the following information for each phone and/or emulator you're experiencing this bug on:

  • Device: [Android Emulator / Xiaomi MI 11 Lite 5G]
  • OS: [Android 14]

NB: Bugs pertaining to old devices/OS versions will likely not be fixed.

Describe the bug

After doing the setup as indicated in readme at https://pub.dev/packages/health, I have added a new view to my App including the code from the demo. It seems to run just fine, however, when I try to "Authenticate" I am getting: "Access Denied (to Health Connect)!"

    if (!hasPermissions) {
      // requesting access to the data types before reading them
      try {
        authorized = await Health().requestAuthorization(types, permissions: permissions);
      } catch (error) {
        debugPrint("Exception in authorize: $error");
      }
    }

The "Health().requestAuthorization" call is always coming back false. I've tried with many types at once or just a single one and with READ or READ/WRITE permissions. The result is always the same: false.

The demo error pre-configured messages suggest I should check the permissions and services added to my manifest file, which I have done many times, but cant' see anything wrong.

To Reproduce

Add plugin to project, add demo scene to a new view, try to Authenticate.

Expected behavior

Should return "true".

Actual behavior

Returns "false".

This is my manifest. I added every single permission just in case.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.testApp">
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.USE_EXACT_ALARM" />
    <!-- For health -->
    <uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_ACTIVE_CALORIES_BURNED" />
    <uses-permission android:name="android.permission.WRITE_ACTIVE_CALORIES_BURNED" />
    <uses-permission android:name="android.permission.READ_BASAL_BODY_TEMPERATURE" />
    <uses-permission android:name="android.permission.WRITE_BASAL_BODY_TEMPERATURE" />
    <uses-permission android:name="android.permission.READ_BASAL_METABOLIC_RATE" />
    <uses-permission android:name="android.permission.WRITE_BASAL_METABOLIC_RATE" />
    <uses-permission android:name="android.permission.READ_BLOOD_GLUCOSE" />
    <uses-permission android:name="android.permission.WRITE_BLOOD_GLUCOSE" />
    <uses-permission android:name="android.permission.READ_BLOOD_PRESSURE" />
    <uses-permission android:name="android.permission.WRITE_BLOOD_PRESSURE" />
    <uses-permission android:name="android.permission.READ_BODY_FAT" />
    <uses-permission android:name="android.permission.WRITE_BODY_FAT" />
    <uses-permission android:name="android.permission.READ_BODY_TEMPERATURE" />
    <uses-permission android:name="android.permission.WRITE_BODY_TEMPERATURE" />
    <uses-permission android:name="android.permission.READ_BODY_WATER_MASS" />
    <uses-permission android:name="android.permission.WRITE_BODY_WATER_MASS" />
    <uses-permission android:name="android.permission.READ_BONE_MASS" />
    <uses-permission android:name="android.permission.WRITE_BONE_MASS" />
    <uses-permission android:name="android.permission.READ_CERVICAL_MUCUS" />
    <uses-permission android:name="android.permission.WRITE_CERVICAL_MUCUS" />
    <uses-permission android:name="android.permission.READ_EXERCISE" />
    <uses-permission android:name="android.permission.WRITE_EXERCISE" />
    <uses-permission android:name="android.permission.READ_DISTANCE" />
    <uses-permission android:name="android.permission.WRITE_DISTANCE" />
    <uses-permission android:name="android.permission.READ_ELEVATION_GAINED" />
    <uses-permission android:name="android.permission.WRITE_ELEVATION_GAINED" />
    <uses-permission android:name="android.permission.READ_FLOORS_CLIMBED" />
    <uses-permission android:name="android.permission.WRITE_FLOORS_CLIMBED" />
    <uses-permission android:name="android.permission.READ_HEART_RATE" />
    <uses-permission android:name="android.permission.WRITE_HEART_RATE" />
    <uses-permission android:name="android.permission.READ_HEART_RATE_VARIABILITY" />
    <uses-permission android:name="android.permission.WRITE_HEART_RATE_VARIABILITY" />
    <uses-permission android:name="android.permission.READ_HEIGHT" />
    <uses-permission android:name="android.permission.WRITE_HEIGHT" />
    <uses-permission android:name="android.permission.READ_HYDRATION" />
    <uses-permission android:name="android.permission.WRITE_HYDRATION" />
    <uses-permission android:name="android.permission.READ_INTERMENSTRUAL_BLEEDING" />
    <uses-permission android:name="android.permission.WRITE_INTERMENSTRUAL_BLEEDING" />
    <uses-permission android:name="android.permission.READ_LEAN_BODY_MASS" />
    <uses-permission android:name="android.permission.WRITE_LEAN_BODY_MASS" />
    <uses-permission android:name="android.permission.READ_MENSTRUATION" />
    <uses-permission android:name="android.permission.WRITE_MENSTRUATION" />
    <uses-permission android:name="android.permission.READ_NUTRITION" />
    <uses-permission android:name="android.permission.WRITE_NUTRITION" />
    <uses-permission android:name="android.permission.READ_OVULATION_TEST" />
    <uses-permission android:name="android.permission.WRITE_OVULATION_TEST" />
    <uses-permission android:name="android.permission.READ_OXYGEN_SATURATION" />
    <uses-permission android:name="android.permission.WRITE_OXYGEN_SATURATION" />
    <uses-permission android:name="android.permission.READ_POWER" />
    <uses-permission android:name="android.permission.WRITE_POWER" />
    <uses-permission android:name="android.permission.READ_RESPIRATORY_RATE" />
    <uses-permission android:name="android.permission.WRITE_RESPIRATORY_RATE" />
    <uses-permission android:name="android.permission.READ_RESTING_HEART_RATE" />
    <uses-permission android:name="android.permission.WRITE_RESTING_HEART_RATE" />
    <uses-permission android:name="android.permission.READ_SEXUAL_ACTIVITY" />
    <uses-permission android:name="android.permission.WRITE_SEXUAL_ACTIVITY" />
    <uses-permission android:name="android.permission.READ_SLEEP" />
    <uses-permission android:name="android.permission.WRITE_SLEEP" />
    <uses-permission android:name="android.permission.READ_SPEED" />
    <uses-permission android:name="android.permission.WRITE_SPEED" />
    <uses-permission android:name="android.permission.READ_STEPS" />
    <uses-permission android:name="android.permission.WRITE_STEPS" />
    <uses-permission android:name="android.permission.READ_TOTAL_CALORIES_BURNED" />
    <uses-permission android:name="android.permission.WRITE_TOTAL_CALORIES_BURNED" />
    <uses-permission android:name="android.permission.READ_VO2_MAX" />
    <uses-permission android:name="android.permission.WRITE_VO2_MAX" />
    <uses-permission android:name="android.permission.READ_WEIGHT" />
    <uses-permission android:name="android.permission.WRITE_WEIGHT" />
    <uses-permission android:name="android.permission.READ_WHEELCHAIR_PUSHES" />
    <uses-permission android:name="android.permission.WRITE_WHEELCHAIR_PUSHES" />

    <!-- Check if Health Connect is installed -->
    <queries>
        <package android:name="com.google.android.apps.healthdata" />

        <intent>
            <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
        </intent>
        <intent>
            <action android:name="android.intent.action.SENDTO" />
            <data android:scheme="smsto" />
        </intent>
    </queries>
    <application
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher"
        android:label="Test"
        tools:replace="android:label">
        <!-- flutter_background_geolocation licence -->
        <meta-data
            android:name="com.transistorsoft.locationmanager.license"
            android:value="..." />
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="..." />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@mipmap/ic_stat_ic_notification" />

        <activity
            android:name=".MainActivity"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:exported="true"
            android:hardwareAccelerated="true"
            android:launchMode="singleTop"
            android:screenOrientation="portrait"
            android:theme="@style/LaunchTheme"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
            </intent-filter>
            <!-- Intention to show Permissions screen for Health Connect API -->
            <!--<intent-filter>
                <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
            </intent-filter>-->
        </activity>
        <activity
            android:name="com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="signinwithapple" />
                <data android:path="callback" />
            </intent-filter>
        </activity>

        <activity-alias
            android:name="ViewPermissionUsageActivity"
            android:exported="true"
            android:permission="android.permission.START_VIEW_PERMISSION_USAGE"
            android:targetActivity=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW_PERMISSION_USAGE" />
                <category android:name="android.intent.category.HEALTH_PERMISSIONS" />
            </intent-filter>
        </activity-alias>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

Screenshots

This is the result of pressing the "Authenticate" button:

image

Flutter doctor

Doctor summary (to see all details, run flutter doctor -v): [!] Flutter (Channel stable, 3.19.2, on Microsoft Windows [Versi¢n 10.0.19045.4412], locale es-ES) ! The flutter binary is not on your path. Consider adding C:\Users\myuser\fvm\versions\3.19.2\bin to your path. ! Warning: dart on your path resolves to C:\tools\dart-sdk\bin\dart.exe, which is not inside your current Flutter SDK checkout at C:\Users\louen\fvm\versions\3.19.2. Consider adding C:\Users\myuser\fvm\versions\3.19.2\bin to th e front of your path. [√] Windows Version (Installed version of Windows is version 10 or higher) [√] Android toolchain - develop for Android devices (Android SDK version 34.0.0) [√] Chrome - develop for the web [√] Android Studio (version 2021.3) [√] Connected device (4 available) [√] Network resources

Additional information

Add any other info about the problem here.

CarlosCabarcos avatar May 16 '24 16:05 CarlosCabarcos