Android 12 Nuevos permisos de Bluetooth

6 minutos de lectura

Avatar de usuario de Mustafa Kuloğlu
Mustafa Kuloglu

Bluetooth es la dependencia principal de nuestra aplicación. Entonces, ya intentamos implementar nuevos permisos Bluetooth de Android 12. Nuestro único recurso es Desarrolladores de Android Nuevos permisos de Bluetooth en Android 12. Solo dice agregar permisos

“android.permiso.BLUETOOTH_CONNECT”

“android.permiso.BLUETOOTH_SCAN”

Agregué y obtuve permisos de tiempo de ejecución para ambos y, por supuesto, la ubicación (habitual como antes de 12)).
No hay ningún otro cambio en mi base de código. ¿Debiera ser? No sé. Entonces, el problema es que mi aplicación no puede encontrar el dispositivo BLE. No pude encontrar la razón.

¿Tiene alguna sugerencia o recurso?

  • ¿No puede encontrar el dispositivo BLE en Android 12 o pre 12 también?

    – Dinkar Kumar

    7 de junio de 2021 a las 1:51

  • También estoy tratando de agregar estos permisos, pero no existen en Android Studio… solo veo los antiguos (BLUETOOTH, BLUETOOTH_ADMIN, BLUETOOTH_ADMIN_PRIVILEGED). Configuré mi targetSdkVersion en “S”, mi compileSdkVersion en “android-S” y mi buildToolsVersion en “3.0.0-rc5”. ¿alguna idea?

    – o_dvir

    11 de junio de 2021 a las 11:19

  • Puedo ver. Mi configuración es así: compileSdkVersion “android-S” buildToolsVersion “30.0.3” targetSdkVersion 31

    – Mustafa Kuloglu

    14 de junio de 2021 a las 11:26

Avatar de usuario de Bolt UIX
Perno UIX

Solución 100% funcional: no necesita ningún complemento de terceros

código manifiesto:

<!--BLUETOOTH PERMISSION-->
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- Needed only if your app looks for Bluetooth devices.
             If your app doesn't use Bluetooth scan results to derive physical
             location information, you can strongly assert that your app
             doesn't derive physical location. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <!-- Needed only if your app makes the device discoverable to Bluetooth
      devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <!-- Needed only if your app communicates with already-paired Bluetooth
           devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <!--bibo01 : hardware option-->
    <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>

Código de Kotlin: //verificar android12+

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                            requestMultiplePermissions.launch(arrayOf(
                                Manifest.permission.BLUETOOTH_SCAN,
                                Manifest.permission.BLUETOOTH_CONNECT))
                        }
                        else{
                            val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
                            requestBluetooth.launch(enableBtIntent)
                        }
....................................................

private var requestBluetooth = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
                if (result.resultCode == RESULT_OK) {
                    //granted
                }else{
                    //deny
                }
 }

private val requestMultiplePermissions =
                registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
                    permissions.entries.forEach {
                        Log.d("test006", "${it.key} = ${it.value}")
                    }
}

Lee mas:
https://developer.android.com/guide/topics/connectivity/bluetooth/permissions

ingrese la descripción de la imagen aquí

  • Funcionando bien. Pero, ¿por qué se muestra el permiso de Nearshare?

    – RaJ

    15 de febrero a las 12:43

  • No me funciona del todo, estoy en Android 10. No veo ninguna ventana emergente que solicite permisos, llego inmediatamente a la parte donde se otorgan los permisos.

    – ocramot

    27 de marzo a las 15:08

  • @RaJ necesita este indicador

    – Ronald Paguay

    30 de mayo a las 21:47

  • La aplicación se bloquea si no permite el permiso por primera vez. Después de eso, no pude obtener el diálogo de permiso y se bloqueó cada vez.

    –Bhoomika Chauhan

    3 de junio a las 7:44


  • Comparte tu código en un enlace stack o git, te ayudaré, @Bhoomika Chauhan

    – Perno UIX

    3 jun a las 16:05

Avatar de usuario de HAZEEM JOONUS
HAZEEM JOONUS

Esto funcionó para mí,

En el manifiesto, agregue los siguientes permisos:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Luego, antes de ejecutar una función de Bluetooth, verifique el permiso:

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) 
                {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) 
                    {
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 2);
                        return;
                    }
                }

Para un ejemplo,

if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 2);
                            return;
                        }
                    }
                    mBTSocket.connect();

Avatar de usuario de Pesa
pesa

Acabo de agregar al manifiesto:

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

y luego solicité esos permisos de Main Activity como cualquier otro. Para solicitar permiso estoy usando biblioteca

implementation 'pub.devrel:easypermissions:3.0.0'

entonces puedes simplemente llamar a esta función

public static final String[] BLUETOOTH_PERMISSIONS_S = { Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT} ;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
     if (!EasyPermissions.hasPermissions(this, BLUETOOTH_PERMISSIONS_S)) {
                EasyPermissions.requestPermissions(this, message, yourRequestCode,BLUETOOTH_PERMISSIONS_S);
            }
        }

y anula onRequestPermissionResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

ACTUALIZACIÓN PARA JETPACK COMPOSE

Si está utilizando jetpack compose, puede manejarlo así:

Cree una lista de sus permisos dentro de la función RememberMultiplePermissionState

rememberMultiplePermissionsState(
            permissions = listOf(
                Manifest.permission.BLUETOOTH_CONNECT,
                Manifest.permission.BLUETOOTH_SCAN
            )
        )

Luego, observe los eventos del ciclo de vida y, al reanudar, inicie la solicitud de permiso

val lifecycleOwner = LocalLifecycleOwner.current
DisposableEffect(key1 = lifecycleOwner,
    effect = {
        val observer = LifecycleEventObserver { _, event ->
            if(event == Lifecycle.Event.ON_START) {
                permissionsState.launchMultiplePermissionRequest()
            }
        }
        lifecycleOwner.lifecycle.addObserver(observer)

        onDispose {
            lifecycleOwner.lifecycle.removeObserver(observer)
        }
    })

Observar el estado del permiso

permissionsState.permissions.forEach { permissionState ->
            when(permissionState.permission) {
                Manifest.permission.ACCESS_FINE_LOCATION -> {
                    when {
                        permissionState.hasPermission -> {}
                    }
                }
            }
        }
    }

Avatar de usuario de Barney Stinson
barney stinson

Si desea que su aplicación inicie la detección de dispositivos o manipule la configuración de Bluetooth, debe declarar el permiso BLUETOOTH_ADMIN además del permiso BLUETOOTH. La mayoría de las aplicaciones necesitan este permiso únicamente para poder descubrir dispositivos Bluetooth locales. No use las otras capacidades otorgadas por este permiso a menos que la aplicación sea un “administrador de energía” que modifique la configuración de Bluetooth a pedido del usuario. Declare los permisos de Bluetooth en el archivo de manifiesto de su aplicación

de desarrollador android vemos que tienes que sumar

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

en su archivo de manifiesto pero no lo agregó para descubrir otros dispositivos, creo que este es el recurso de su problema

Este fue un error de la plataforma. Google solucionó el error en la nueva versión Beta de Android 12.

  • ¿Tienes un enlace al error?

    – Minas Mina

    30 de mayo a las 12:55

Avatar de usuario de SHANNAX
SHANNAX

Tuve un error con BLUETOOTH_ADVERTISING que faltaba en el manifiesto de Android al cambiar a Android 12

Básicamente, acabo de agregar checkSelfPermission(Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED en mis condiciones donde startAdvertising fue llamado

  • ¿Tienes un enlace al error?

    – Minas Mina

    30 de mayo a las 12:55

Avatar de usuario de Team3537
equipo3537

No estoy seguro de si anunciaron algo con respecto a los cambios de Bluetooth, pero si nada más ayuda, lo introdujeron recientemente, lo que PODRÍA ayudar en su caso de uso, a menos que haga cosas más complejas.

https://developer.android.com/guide/topics/connectivity/companion-device-pairing#kotlin

En las versiones más nuevas, ya no necesita el permiso de ubicación si esto hace todo lo que necesita.

Con respecto a la muestra: simplemente no puede incluir estas 2 líneas:

.setNamePattern(Pattern.compile("My device"))
.addServiceUuid(ParcelUuid(UUID(0x123abcL, -1L)), null)

Lo uso para buscar dispositivos sin ningún problema, la conexión funciona de manera similar

¿Ha sido útil esta solución?