Problem


Android:

<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

Flutter:

import 'package:photo_manager/photo_manager.dart';


Future<void> checkPermission() async {
  final permissionState = await PhotoManager.requestPermissionExtend();
  final hasPhotoPermission = permissionState.isAuth;
}

Code that works fine on iOS is still outputting denied on Android despite allowing image permissions

  • Environment: Android Version 13

  • When allowing image permissions

    • Expect: permissionState.isAuth = true

    • Actual: permissionState.isAuth = false 🥲

    • Expect: PermissionState.authorized

    • Actual: PermissionState.denied 😞😭


Notes


Reference links

What I learned from the reference link

  • Android 12, 13, and 14 have different ways of requesting access to photos.
  • The biggest change is that starting with Android 13, the permission is granular instead of storage, and you write the type of media you want to request
  • Starting with Android 14, you can only allow some photos.

As a result, I changed the android xml permissions back and forth, but it still came out as denied. 😞

  • After looking at other cases, I realized that different OS versions request different permissions.
  • So, I tried to change the photoManager options in detail based on the granularity of the problem.
    PhotoManager.requestPermissionExtend(requestOption: ...)
  • The result was successful!!!!!

Fix results


Android:

<!-- SDK 32 or lower -->
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<!-- SDK 33 (Android13) -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<!-- SDK 34 (Android14) -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />

Flutter:

Future<void> checkPermission() async {
  final permissionState = await PhotoManager.requestPermissionExtend(
    requestOption: const PermissionRequestOption(
      androidPermission:
          AndroidPermission(type: RequestType.image, mediaLocation: true),
    ),
  );
  final hasPhotoPermission = permissionState.isAuth;
}
  • Environment: Android Version 12, 13, 14
  • When allowing image permissions
    • Expect: permissionState.isAuth = true
    • Actual: permissionState.isAuth = true 🎉
    • Expect: PermissionState.authorized
    • Actual: PermissionState.authorized 👏🥳
profile
𝙸 𝚊𝚖 𝚊 𝚌𝚞𝚛𝚒𝚘𝚞𝚜 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚎𝚛 𝚠𝚑𝚘 𝚎𝚗𝚓𝚘𝚢𝚜 𝚍𝚎𝚏𝚒𝚗𝚒𝚗𝚐 𝚊 𝚙𝚛𝚘𝚋𝚕𝚎𝚖. 🇰🇷👩🏻‍💻

0개의 댓글