Pular para o conteúdo principal

Permissões Necessárias

Antes de começar

Aviso: É fortemente recomendado solicitar quaisquer permissões de tempo de execução necessárias após o usuário iniciar seu aplicativo pela primeira vez. Em cenários onde seu aplicativo possui uma página de login, a falha em solicitar essas permissões pode resultar em um registro de usuário incompleto.

1. Adicionando permissões ao Android Manifest

Adicionar permissões

Adicione as seguintes permissões dentro do seu projeto.

A permissão de acesso à localização precisa deve ser solicitada no aplicativo.

Algumas das permissões abaixo devem ser solicitadas em tempo de execução.

Para localização especificamente, seu aplicativo deve exibir uma divulgação proeminente através de um alerta pop-up antes da permissão de tempo de execução de localização do aplicativo.

<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.FOREGROUND_SERVICE"/>

<!-- Permissões obrigatórias para Android 12 e acima.-->
<!-- Além disso, devem ser solicitadas em tempo de execução. -->
<uses-permission
android:name="android.permission.BLUETOOTH_SCAN"
android:minSdkVersion="31"
android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

<!-- Permissões obrigatórias para Android 13 e acima. -->
<!-- Além disso, devem ser solicitadas em tempo de execução. -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

2. Solicitando Permissões em Tempo de Execução

Aviso: Recomenda-se solicitar as permissões no lançamento. Se uma ou mais das permissões estiverem ausentes para a API de destino do dispositivo, o SDK não será iniciado. Evite solicitar permissões após o login.

(Opcional) Para versões mais recentes do Android (API 34 e acima) também é recomendado solicitar a permissão FullScreenIntent lançando a seguinte intenção ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT. Você também pode solicitar Manifest.permission.SCHEDULE_EXACT_ALARM iniciando android.provider.Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM. O SDK funcionará normalmente na maioria dos dispositivos mesmo sem essas duas permissões, mas elas são conhecidas por ajudar em ROMs Android mais esotéricas.

Desde a API nível 23 (Android 6.0) a permissão de localização deve ser solicitada em tempo de execução. No Flutter e React-Native, access_fine_location e access_coarse_location são conhecidos como permissões de localização do tipo while_in_use.

Desde a API nível 31 (Android 12) existem novas permissões para acessar, conectar e identificar dispositivos próximos. Para usar esses recursos de Bluetooth, as permissões bluetooth_scan, bluetooth_advertise, bluetooth_connect devem ser solicitadas em tempo de execução.

Siga o link Solicitando Permissões em Tempo de Execução (ANDROID-Flutter) para mais instruções sobre como solicitar permissões em tempo de execução no Flutter.

Siga o link Solicitando Permissões em Tempo de Execução (ANDROID-React-Native) para mais instruções sobre como solicitar permissões em tempo de execução no React-Native.

//Exemplo de solicitação de permissões por nível de API do Android

import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;

public class MainActivity extends AppCompatActivity {

private static final int REQUEST_PERMISSION_CODE = 420;
private static final int ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE = 0;

private static final String[] REQUIRED_PERMISSIONS = {
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
};

private static final String[] REQUIRED_PERMISSIONS_Q = {
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
};

@RequiresApi(api = Build.VERSION_CODES.S)
private static final String[] REQUIRED_PERMISSIONS_S =
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) ?
new String[]{
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.POST_NOTIFICATIONS
} :
new String[]{
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT
};

private int count = 0;
private int countAutoStart = 0;

@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
requestGlPermissions();
}

private void requestGlPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (!hasNeededPermissionsS()) {
requestPermissionsS();
return;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (!hasNeededPermissionsQ()) {
requestPermissionsQ();
return;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
if (!hasNeededPermissions()) {
requestPermissions();
return;
}
}
if (countAutoStart < 1) {
countAutoStart++;
}
}

private boolean hasNeededPermissions() {
for (String permission : REQUIRED_PERMISSIONS) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}

private boolean hasNeededPermissionsQ() {
for (String permission : REQUIRED_PERMISSIONS_Q) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}

@RequiresApi(Build.VERSION_CODES.S)
private boolean hasNeededPermissionsS() {
for (String permission : REQUIRED_PERMISSIONS_S) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}

@RequiresApi(Build.VERSION_CODES.M)
private void requestPermissions() {
requestPermissions(REQUIRED_PERMISSIONS, REQUEST_PERMISSION_CODE);
}

@RequiresApi(Build.VERSION_CODES.Q)
private void requestPermissionsQ() {
requestPermissions(REQUIRED_PERMISSIONS_Q, REQUEST_PERMISSION_CODE);
}

@RequiresApi(Build.VERSION_CODES.S)
private void requestPermissionsS() {
requestPermissions(REQUIRED_PERMISSIONS_S, REQUEST_PERMISSION_CODE);
}

@SuppressWarnings("deprecation")
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
requestGlPermissions();
}
super.onActivityResult(requestCode, resultCode, data);
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_PERMISSION_CODE) {
if (count < REQUIRED_PERMISSIONS_Q.length) {
count++;
requestGlPermissions();
return;
}
if (countAutoStart < 1) {
countAutoStart++;
}
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}

3. (Opcional) Solicitando Permissão de Localização em Segundo Plano

Lembre-se, sua divulgação proeminente deve:

  • Aparecer antes da permissão de tempo de execução de localização do aplicativo.

  • Incluir pelo menos a seguinte frase, adaptada para incluir todos os recursos relevantes que solicitam acesso à localização em segundo plano no aplicativo que são prontamente visíveis para o usuário: “Este aplicativo coleta dados de localização para habilitar ["recurso"], ["recurso"], & ["recurso"] mesmo quando o aplicativo está fechado ou não está em uso.” Se você estender o uso permitido para anúncios, inclua também: “Esses dados também são usados para fornecer anúncios/suporte à publicidade/suporte a anúncios.”

  • Incluir quaisquer outros detalhes necessários para deixar claro ao usuário como e por que você está usando a localização em segundo plano. Embora o conteúdo adicional seja permitido, ele não deve fazer com que o conteúdo obrigatório não seja imediatamente visível.

4. Justificativa para Permissões de Bluetooth e Localização

BLUETOOTH_ADVERTISE (Nível de API > 31)

Descrição: Permite que o aplicativo use o Bluetooth para anunciar a presença do dispositivo, possibilitando a interação com dispositivos próximos compatíveis com o SDK GroupLink. Esta permissão é essencial para facilitar campanhas e eventos entre dispositivos próximos.

BLUETOOTH_CONNECT (Nível de API > 31)

Descrição: Permite que o aplicativo se conecte a dispositivos Bluetooth compatíveis com o SDK GroupLink. Esta permissão é necessária para estabelecer conexões seguras e realizar interações entre dispositivos durante campanhas e eventos específicos.

BLUETOOTH_SCAN (Nível de API > 31)

Descrição: Permite que o aplicativo procure dispositivos Bluetooth nas proximidades que também possuam o SDK GroupLink. Esta funcionalidade é essencial para identificar e interagir com dispositivos relevantes durante campanhas e eventos.

BLUETOOTH_ADMIN

Descrição: Concede ao aplicativo controle sobre as configurações de Bluetooth do dispositivo. Esta permissão é necessária para garantir que o SDK GroupLink possa operar efetivamente, coordenando interações entre dispositivos durante eventos específicos.

Sobre permissões relacionadas à localização:

ACCESS_COARSE_LOCATION

Descrição: Esta permissão é necessária para comunicação via Bluetooth em dispositivos Android com versões de API anteriores a 31. Além disso, permite acesso a informações de localização aproximada para habilitar interações entre dispositivos compatíveis com o SDK GroupLink durante campanhas e eventos.

ACCESS_FINE_LOCATION

Descrição: Semelhante à permissão anterior, mas também concede acesso a informações de localização mais precisas para dispositivos Android com versões de API anteriores a 31. Essa precisão é necessária para a eficácia das interações entre dispositivos próximos.