4package org.qtproject.qt.android.bluetooth;
6import android.Manifest;
7import android.os.Build;
8import android.content.Context;
9import android.content.pm.PackageInfo;
10import android.content.pm.PackageManager;
11import android.util.Log;
13class QtBluetoothUtility {
15 private static final String TAG =
"QtBluetoothUtility";
19 private static boolean isScanRequiresLocationChecked =
false;
20 private static boolean scanRequiresLocation =
true;
30 public static synchronized boolean bluetoothScanRequiresLocation(
final Context qtContext)
32 Log.d(TAG,
"Checking if Location is required for bluetooth scan");
33 if (isScanRequiresLocationChecked) {
34 Log.d(TAG,
"Using cached result for scan needing location: " + scanRequiresLocation);
35 return scanRequiresLocation;
39 if (Build.VERSION.SDK_INT < 31) {
40 Log.d(TAG,
"SDK version is below 31, assuming Location needed");
41 scanRequiresLocation =
true;
42 isScanRequiresLocationChecked =
true;
43 return scanRequiresLocation;
45 if (qtContext ==
null) {
46 Log.w(TAG,
"No context object provided");
55 PackageManager pm = qtContext.getPackageManager();
56 PackageInfo pi = pm.getPackageInfo(qtContext.getPackageName(),
57 PackageManager.GET_PERMISSIONS);
58 String[] permissions = pi.requestedPermissions;
59 int[] permissionsFlags = pi.requestedPermissionsFlags;
61 if (permissions !=
null && permissionsFlags !=
null) {
62 for (
int i = 0;
i < permissions.length; ++
i) {
63 if (Manifest.permission.BLUETOOTH_SCAN.equals(permissions[i])) {
64 if ((permissionsFlags[i] & PackageInfo.REQUESTED_PERMISSION_NEVER_FOR_LOCATION) != 0) {
65 Log.d(TAG,
"BLUETOOTH_SCAN with 'neverForLocation' found");
66 scanRequiresLocation =
false;
68 Log.d(TAG,
"BLUETOOTH_SCAN without 'neverForLocation' found");
69 scanRequiresLocation =
true;
71 isScanRequiresLocationChecked =
true;
72 return scanRequiresLocation;
76 }
catch (Exception ex) {
77 Log.w(TAG,
"An error occurred while checking Bluetooth's location need: " + ex);
78 scanRequiresLocation =
false;
80 Log.d(TAG,
"BLUETOOTH_SCAN permission not found");
81 isScanRequiresLocationChecked =
true;
82 return scanRequiresLocation;