@@ -24,6 +24,24 @@ public static bool IsDeclaredInManifest(string permission)
2424 return requestedPermissions ? . Any ( r => r . Equals ( permission , StringComparison . OrdinalIgnoreCase ) ) ?? false ;
2525 }
2626
27+ private static bool HasFlagInManifest ( string permission , RequestedPermission flag )
28+ {
29+ var context = Application . Context ;
30+ #pragma warning disable CS0618 , CA1416 , CA1422 // Deprecated in API 33: https://developer.android.com/reference/android/content/pm/PackageManager#getPackageInfo(java.lang.String,%20int)
31+ var packageInfo = context . PackageManager . GetPackageInfo ( context . PackageName , PackageInfoFlags . Permissions ) ;
32+ #pragma warning restore CS0618 , CA1416 , CA1422
33+ var requestedPermissions = packageInfo ? . RequestedPermissions ;
34+ var requestedPermissionsFlags = packageInfo ? . RequestedPermissionsFlags ;
35+
36+ for ( int i = 0 ; i < requestedPermissions . Count ; i ++ )
37+ {
38+ if ( requestedPermissions [ i ] . Equals ( permission , StringComparison . OrdinalIgnoreCase ) )
39+ return ( requestedPermissionsFlags [ i ] & ( int ) flag ) != 0 ;
40+ }
41+
42+ return false ;
43+ }
44+
2745 internal static void OnRequestPermissionsResult ( int requestCode , string [ ] permissions , Permission [ ] grantResults )
2846 => BasePlatformPermission . OnRequestPermissionsResult ( requestCode , permissions , grantResults ) ;
2947
@@ -204,8 +222,7 @@ public override (string androidPermission, bool isRuntime)[] RequiredPermissions
204222 var permissions = new List < ( string , bool ) > ( ) ;
205223
206224 // When targeting Android 11 or lower, AccessFineLocation is required for Bluetooth.
207- // For Android 12 and above, it is optional.
208- if ( Application . Context . ApplicationInfo . TargetSdkVersion <= BuildVersionCodes . R || IsDeclaredInManifest ( Manifest . Permission . AccessFineLocation ) )
225+ if ( Application . Context . ApplicationInfo . TargetSdkVersion <= BuildVersionCodes . R )
209226 permissions . Add ( ( Manifest . Permission . AccessFineLocation , true ) ) ;
210227
211228#if __ANDROID_31__
@@ -218,6 +235,9 @@ public override (string androidPermission, bool isRuntime)[] RequiredPermissions
218235 permissions . Add ( ( Manifest . Permission . BluetoothConnect , true ) ) ;
219236 if ( IsDeclaredInManifest ( Manifest . Permission . BluetoothAdvertise ) )
220237 permissions . Add ( ( Manifest . Permission . BluetoothAdvertise , true ) ) ;
238+ // for Android 12 and above, AccessFineLocation is optional
239+ if ( IsDeclaredInManifest ( Manifest . Permission . AccessFineLocation ) && ! HasFlagInManifest ( Manifest . Permission . BluetoothScan , RequestedPermission . NeverForLocation ) )
240+ permissions . Add ( ( Manifest . Permission . AccessFineLocation , true ) ) ;
221241 }
222242#endif
223243
@@ -365,8 +385,7 @@ public override (string androidPermission, bool isRuntime)[] RequiredPermissions
365385 {
366386 var permissions = new List < ( string , bool ) > ( ) ;
367387 // When targeting Android 12 or lower, AccessFineLocation is required for several WiFi APIs.
368- // For Android 13 and above, it is optional.
369- if ( Application . Context . ApplicationInfo . TargetSdkVersion < BuildVersionCodes . Tiramisu || IsDeclaredInManifest ( Manifest . Permission . AccessFineLocation ) )
388+ if ( Application . Context . ApplicationInfo . TargetSdkVersion < BuildVersionCodes . Tiramisu )
370389 permissions . Add ( ( Manifest . Permission . AccessFineLocation , true ) ) ;
371390
372391#if __ANDROID_33__
@@ -375,6 +394,9 @@ public override (string androidPermission, bool isRuntime)[] RequiredPermissions
375394 // new runtime permission on Android 13
376395 if ( IsDeclaredInManifest ( Manifest . Permission . NearbyWifiDevices ) )
377396 permissions . Add ( ( Manifest . Permission . NearbyWifiDevices , true ) ) ;
397+ // for Android 13 and above, AccessFineLocation is optional
398+ if ( IsDeclaredInManifest ( Manifest . Permission . AccessFineLocation ) && ! HasFlagInManifest ( Manifest . Permission . NearbyWifiDevices , RequestedPermission . NeverForLocation ) )
399+ permissions . Add ( ( Manifest . Permission . AccessFineLocation , true ) ) ;
378400 }
379401#endif
380402
0 commit comments