'Unity - Android 10 - BLE Bluetooth - Background location

I am working on a Unity Android project where I use bluetooth scanning service. I started having problems in bluetooth connection when I upgraded to Android 10 (API 29). I am taking help from this post (link below) where it mentions that with Android 10 onwards one needs to include the BACKGROUND_LOCATION permission.

Android 10 not working with BLE Bluetooth scanning

In Unity, I have written some code using a permission utility tool

  if (AndroidRuntimePermissions.CheckPermission(Permission.CoarseLocation) != AndroidRuntimePermissions.Permission.Granted)
  {
      AndroidRuntimePermissions.RequestPermission(Permission.CoarseLocation);   
  }

Permission class is an internal class from UnityEngine.Android which does not seem to have background location permission. See below,

using UnityEngine.Scripting;

/// <summary>
///   <para>Structure describing a permission that requires user authorization.</para>
/// </summary>
[NativeHeader ("Runtime/Export/Android/AndroidPermissions.bindings.h")]
[UsedByNativeCode]
public struct Permission
{
    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to use the camera.</para>
    /// </summary>
    public const string Camera = "android.permission.CAMERA";

    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to use the microphone.</para>
    /// </summary>
    public const string Microphone = "android.permission.RECORD_AUDIO";

    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to use the users location with high precision.</para>
    /// </summary>
    public const string FineLocation = "android.permission.ACCESS_FINE_LOCATION";

    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to use the users location with coarse granularity.</para>
    /// </summary>
    public const string CoarseLocation = "android.permission.ACCESS_COARSE_LOCATION";

    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to read from external storage such as a SD card.</para>
    /// </summary>
    public const string ExternalStorageRead = "android.permission.READ_EXTERNAL_STORAGE";

    /// <summary>
    ///   <para>Used when requesting permission or checking if permission has been granted to write to external storage such as a SD card.</para>
    /// </summary>
    public const string ExternalStorageWrite = "android.permission.WRITE_EXTERNAL_STORAGE";

    /// <summary>
    ///   <para>Check if the user has granted access to a device resource or information that requires authorization.</para>
    /// </summary>
    /// <param name="permission">A string representing the permission to request. For permissions which Unity has not predefined you may also manually provide the constant value obtained from the Android documentation here: https:developer.android.comguidetopicspermissionsoverview#permission-groups such as "android.permission.READ_CONTACTS".</param>
    /// <returns>
    ///   <para>Whether the requested permission has been granted.</para>
    /// </returns>
    [MethodImpl (MethodImplOptions.InternalCall)]
    [StaticAccessor ("PermissionsBindings", StaticAccessorType.DoubleColon)]
    public static extern bool HasUserAuthorizedPermission (string permission);

    /// <summary>
    ///   <para>Request that the user grant access to a device resource or information that requires authorization.</para>
    /// </summary>
    /// <param name="permission">A string that describes the permission to request. For permissions which Unity has not predefined you may also manually provide the constant value obtained from the Android documentation here: https:developer.android.comguidetopicspermissionsoverview#permission-groups such as "android.permission.READ_CONTACTS".</param>
    [MethodImpl (MethodImplOptions.InternalCall)]
    [StaticAccessor ("PermissionsBindings", StaticAccessorType.DoubleColon)]
    public static extern void RequestUserPermission (string permission);
}

Please let me know if you have got your way around this problem. Your help is much appreciated. Thank you.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source