Bluetooth nearby share permissions issue on Android 12 Ionic 5

Bluetooth not able to grant the permission for scan and connect for android 12. Please need some assistance on this.

Bluetooth is detects powered_on permission but not able discover the devices and list them.

On ble.startScan get below:
ERROR: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@cbeb99f6: GattService registerScanner

Pasting AndroidManifest.xml for refernce:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-feature android:name="android.hardware.location.gps" android:required="true" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-feature android:name="android.hardware.camera" android:required="true" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:maxSdkVersion="30" android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:maxSdkVersion="30" android:name="android.permission.BLUETOOTH_ADMIN" />

package.json

{
  "name": "IONICC",
  "version": "0.0.1",
  "author": "Ionic Framework",
  "homepage": "https://ionicframework.com/",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^10.0.0",
    "@angular/common": "~10.0.0",
    "@angular/core": "~10.0.0",
    "@angular/forms": "~10.0.0",
    "@angular/platform-browser": "~10.0.0",
    "@angular/platform-browser-dynamic": "~10.0.0",
    "@angular/router": "~10.0.0",
    "@awesome-cordova-plugins/android-permissions": "^6.2.0",
    "@ionic-native/android-permissions": "^5.36.0",
    "@ionic-native/app-version": "^5.31.1",
    "@ionic-native/barcode-scanner": "^5.31.1",
    "@ionic-native/ble": "^5.36.0",
    "@ionic-native/camera": "^5.31.1",
    "@ionic-native/core": "^5.0.0",
    "@ionic-native/device": "^5.30.0",
    "@ionic-native/diagnostic": "^5.31.1",
    "@ionic-native/file": "^5.30.0",
    "@ionic-native/geolocation": "^5.31.1",
    "@ionic-native/http": "^5.31.1",
    "@ionic-native/in-app-browser": "^5.31.1",
    "@ionic-native/insomnia": "^5.31.1",
    "@ionic-native/keyboard": "^5.31.1",
    "@ionic-native/ms-adal": "^5.30.0",
    "@ionic-native/native-storage": "^5.31.1",
    "@ionic-native/network": "^5.31.1",
    "@ionic-native/open-native-settings": "^5.31.1",
    "@ionic-native/screen-orientation": "^5.31.1",
    "@ionic-native/splash-screen": "^5.0.0",
    "@ionic-native/sqlite": "^5.30.0",
    "@ionic-native/status-bar": "^5.0.0",
    "@ionic-native/wifi-wizard-2": "^5.31.1",
    "@ionic/angular": "^5.0.0",
    "@ionic/storage": "^2.3.1",
    "@types/jquery": "^3.5.14",
    "angular2-highcharts": "^0.5.5",
    "bcryptjs": "^2.4.3",
    "cordova-android": "^9.1.0",
    "cordova-ios": "^6.2.0",
    "highcharts": "^9.3.3",
    "highcharts-angular": "^2.10.0",
    "html2canvas": "^1.4.1",
    "ionic-select-search": "0.0.3",
    "jquery": "^3.6.0",
    "jwt-decode": "^3.1.2",
    "protobufjs": "^6.10.2",
    "rxjs": "~6.5.5",
    "rxjs-compat": "^6.6.3",
    "tslib": "^2.0.0",
    "tsmonad": "^0.8.0",
    "wifiwizard2": "^3.1.1",
    "zone.js": "~0.10.3"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.1000.0",
    "@angular/cli": "~10.0.5",
    "@angular/compiler": "~10.0.0",
    "@angular/compiler-cli": "~10.0.0",
    "@angular/language-service": "~10.0.0",
    "@babel/helper-define-map": "^7.13.12",
    "@ionic/angular-toolkit": "^2.3.0",
    "@types/jasmine": "~3.5.0",
    "@types/jasminewd2": "~2.0.3",
    "@types/node": "^12.11.1",
    "codelyzer": "^6.0.0",
    "cordova-open-native-settings": "^1.5.3",
    "cordova-plugin-advanced-http": "^3.1.0",
    "cordova-plugin-android-permissions": "^1.1.4",
    "cordova-plugin-androidx": "^3.0.0",
    "cordova-plugin-androidx-adapter": "^1.1.3",
    "cordova-plugin-app-version": "^0.1.12",
    "cordova-plugin-ble-central": "^1.6.1",
    "cordova-plugin-camera": "^5.0.1",
    "cordova-plugin-compat": "^1.2.0",
    "cordova-plugin-device": "^2.0.2",
    "cordova-plugin-file": "^6.0.2",
    "cordova-plugin-geolocation": "^4.1.0",
    "cordova-plugin-inappbrowser": "^4.1.0",
    "cordova-plugin-insomnia": "^4.3.0",
    "cordova-plugin-ionic-keyboard": "^2.2.0",
    "cordova-plugin-ionic-webview": "^4.2.1",
    "cordova-plugin-ms-adal": "^0.10.2",
    "cordova-plugin-nativestorage": "^2.3.2",
    "cordova-plugin-network-information": "^2.0.2",
    "cordova-plugin-screen-orientation": "^3.0.2",
    "cordova-plugin-splashscreen": "^5.0.2",
    "cordova-plugin-statusbar": "^2.4.2",
    "cordova-plugin-whitelist": "^1.3.3",
    "cordova-plugin-wifiwizard2": "^3.1.1",
    "cordova-sqlite-storage": "^6.0.0",
    "cordova.plugins.diagnostic": "^6.0.2",
    "es6-promise-plugin": "^4.1.0",
    "jasmine-core": "~3.5.0",
    "jasmine-spec-reporter": "~5.0.0",
    "jetifier": "^1.6.6",
    "karma": "~5.0.0",
    "karma-chrome-launcher": "~3.1.0",
    "karma-coverage-istanbul-reporter": "~3.0.2",
    "karma-jasmine": "~3.3.0",
    "karma-jasmine-html-reporter": "^1.5.0",
    "phonegap-plugin-barcodescanner": "^8.1.0",
    "protractor": "~7.0.0",
    "ts-node": "~8.3.0",
    "tslint": "~6.1.0",
    "typescript": "~3.9.5"
  },
  "description": "An Ionic project",
  "cordova": {
    "plugins": {
      "cordova-sqlite-storage": {},
      "cordova-plugin-device": {},
      "cordova-plugin-whitelist": {},
      "cordova-plugin-statusbar": {},
      "cordova-plugin-splashscreen": {},
      "cordova-plugin-ionic-webview": {
        "ANDROID_SUPPORT_ANNOTATIONS_VERSION": "27.+"
      },
      "cordova-plugin-ionic-keyboard": {},
      "cordova-plugin-camera": {
        "ANDROID_SUPPORT_V4_VERSION": "27.+"
      },
      "cordova-plugin-network-information": {},
      "cordova-plugin-ms-adal": {},
      "cordova-plugin-app-version": {},
      "cordova-plugin-inappbrowser": {},
      "cordova.plugins.diagnostic": {
        "ANDROIDX_VERSION": "1.+",
        "ANDROIDX_APPCOMPAT_VERSION": "1.3.1"
      },
      "cordova-plugin-file": {},
      "cordova-plugin-ble-central": {},
      "cordova-plugin-androidx": {},
      "cordova-plugin-androidx-adapter": {},
      "cordova-plugin-geolocation": {
        "GPS_REQUIRED": "true"
      },
      "cordova-plugin-insomnia": {},
      "phonegap-plugin-barcodescanner": {
        "ANDROID_SUPPORT_V4_VERSION": "27.+"
      },
      "cordova-plugin-nativestorage": {},
      "cordova-open-native-settings": {},
      "wifiwizard2": {},
      "cordova-plugin-screen-orientation": {},
      "cordova-plugin-advanced-http": {
        "ANDROIDBLACKLISTSECURESOCKETPROTOCOLS": "SSLv3,TLSv1"
      },
      "cordova-plugin-android-permissions": {}
    },
    "platforms": [
      "ios",
      "android"
    ]
  }
}

Any help is appreciated…

any solution on this ?

Hello @iranna @iAhmad89, once you have the permissions set in your AndroidManifest.xml. You can install this cordova-plugin-android-permissions - npm. And then make the app check if the permission has been granted or not then ask the user for permission.

this.androidPermissions.checkPermission(this.androidPermissions.PERMISSION.BLUETOOTH_CONNECT).then(
      result => {
        if(result.hasPermission){
          //Do nothing and proceed permission exists already
        }else{
          //Request for all the permissions in the array
          this.androidPermissions.requestPermissions(
            [
              this.androidPermissions.PERMISSION.BLUETOOTH, 
              this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN,
              this.androidPermissions.PERMISSION.BLUETOOTH_CONNECT,
              this.androidPermissions.PERMISSION.BLUETOOTH_SCAN,
              this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION,
           ])
        }
      },
      err => this.androidPermissions.requestPermissions(
        [
          this.androidPermissions.PERMISSION.BLUETOOTH, 
          this.androidPermissions.PERMISSION.BLUETOOTH_ADMIN,
          this.androidPermissions.PERMISSION.BLUETOOTH_CONNECT,
          this.androidPermissions.PERMISSION.BLUETOOTH_SCAN,
          this.androidPermissions.PERMISSION.ACCESS_FINE_LOCATION
       ])
    );
1 Like

Thank you for this; saved me so much time. This should work with slight modification from my end which is to replace this.android.Permissions.PERMISSION.BLUETOOTH with a string “android.permission.BLUETOOTH”. Same thing goes to other permissions.