Orientação gerada a partir de informações públicas. Apenas para referência.
O pacote nearby_connections fornece integração do Flutter com a API Nearby Connections do Android, permitindo comunicação ponto a ponto entre dispositivos por Bluetooth, Wi-Fi e NFC. Ele suporta o envio de bytes brutos e arquivos, tornando-o ideal para compartilhamento local de dados em aplicativos baseados em proximidade. O plugin é leve e projetado especificamente para Android, aproveitando recursos nativos para conexões confiáveis e de baixa latência. É útil para aplicativos colaborativos, jogos multiplayer ou ferramentas de compartilhamento de arquivos que exigem interação direta entre dispositivos sem depender da internet.
Casos de uso
Compartilhamento de arquivos locais entre dispositivos
Sincronização em tempo real de jogos multiplayer
Troca de dados offline em configurações de grupo
Configuração rápida de comunicação entre dispositivos
Recursos de aplicativo colaborativo sem backend em nuvem
Principais recursos
Suporta transferência de bytes e arquivos
Usa a API nativa do Android para Conexões Próximas
Otimizado para comunicação de baixa latência e curta distância
Interface simples do Flutter para Android
Descoberta e gerenciamento de conexão embutidos
Indicado para
aplicativos exclusivos para Android que exigem conectividade local do dispositivo
Aplicativos que precisam de transferência rápida de dados offline
Desenvolvedores criando recursos colaborativos ou sociais
Projetos evitando dependência de internet ou serviços em nuvem
Protótipos para interações baseadas na proximidade
Add these to your project's android/src/main/AndroidManifest.xml
<!-- Required for Nearby Connections --><uses-permissionandroid:maxSdkVersion="31"android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permissionandroid:maxSdkVersion="31"android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permissionandroid:maxSdkVersion="30"android:name="android.permission.BLUETOOTH" /><uses-permissionandroid:maxSdkVersion="30"android:name="android.permission.BLUETOOTH_ADMIN" /><uses-permissionandroid:maxSdkVersion="28"android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permissionandroid:minSdkVersion="29"android:maxSdkVersion="31"android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permissionandroid:minSdkVersion="31"android:name="android.permission.BLUETOOTH_ADVERTISE" /><uses-permissionandroid:minSdkVersion="31"android:name="android.permission.BLUETOOTH_CONNECT" /><uses-permissionandroid:minSdkVersion="31"android:name="android.permission.BLUETOOTH_SCAN" /><uses-permissionandroid:minSdkVersion="32"android:name="android.permission.NEARBY_WIFI_DEVICES" /><!-- Optional: only required for FILE payloads --><uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
Note: Android 12+ has introduced some new bluetooth permissions - BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT, BLUETOOTH_SCAN, which need to be handled as well. You may also need to set compileSdkVersion 32 in your build.gradle file.
Request Permissions
Since ACCESS_FINE_LOCATION, BLUETOOTH_ADVERTISE, BLUETOOTH_CONNECT, BLUETOOTH_SCAN and READ_EXTERNAL_STORAGE are considered to be dangerous system permissions, in addition to adding them to your manifest, you must request these permissions at runtime.
try {
bool a = awaitNearby().startAdvertising(
userName,
strategy, // https://developers.google.com/nearby/connections/strategies
onConnectionInitiated: (String id,ConnectionInfo info) {
// Called whenever a discoverer requests connection
},
onConnectionResult: (String id,Status status) {
// Called when connection is accepted/rejected
},
onDisconnected: (String id) {
// Callled whenever a discoverer disconnects from advertiser
},
serviceId: "com.yourdomain.appname", // uniquely identifies your app
);
} catch (exception) {
// platform exceptions like unable to start bluetooth or insufficient permissions
}
Discover Advertisers
try {
bool a = awaitNearby().startDiscovery(
userName,
strategy, // https://developers.google.com/nearby/connections/strategies
onEndpointFound: (String id,String userName, String serviceId) {
// called when an advertiser is found
},
onEndpointLost: (String id) {
//called when an advertiser is lost (only if we weren't connected to it )
},
serviceId: "com.yourdomain.appname", // uniquely identifies your app
);
} catch (e) {
// platform exceptions like unable to start bluetooth or insufficient permissions
}
Stopping Advertising and Discovery
Nearby().stopAdvertising();
Nearby().stopDiscovery();
// endpoints already discovered will still be available to connect// even after stopping discovery// You should stop discovery once you have found the intended advertiser// this will reduce chances for disconnection
Request Connection
// to be called by discover whenever an endpoint is found// callbacks are similar to those in startAdvertising methodtry{
Nearby().requestConnection(
userName,
id,
onConnectionInitiated: (id, info) {
},
onConnectionResult: (id, status) {
},
onDisconnected: (id) {
},
);
}catch(exception){
// called if request was invalid
}
Accept Connection
Nearby().acceptConnection(
id,
onPayLoadRecieved: (endpointId, payload) {
// called whenever a payload is recieved.
},
onPayloadTransferUpdate: (endpointId, payloadTransferUpdate) {
// gives status of a payload// e.g success/failure/in_progress// bytes transferred and total bytes etc
}
);
Sending Data
Sending Bytes Payload
Nearby().sendBytesPayload(endpointId, bytes_array);
// payloads are recieved by callback given to acceptConnection method.
Sending File Payload
You need to send the File Payload and File Name seperately.
File is stored in DOWNLOAD_DIRECTORY/.nearby/ and given a generic name.
You need to copy the file to another directory of your choice.
//creates file with generic name (without extension) in Downloads Directory//its your responsibility to rename the file properlyNearby().sendFilePayload(endpointId, filePath);
//Send filename as well so that receiver can move and rename the fileNearby().sendBytesPayload(endpointId,fileNameEncodedWithPayloadId);
//e.g send a string like "payloadId:FileExtensionOrFullName" as bytes//payloads are recieved by callback given to acceptConnection method.
Every payload has an ID which is same for sender and receiver.
You can get the uri of the file from Payload in onPayloadReceived function.
We have a convenience method to copy the file to a location you want-
// Convenience method to copy file using it's `uri`.final newPath = '${await getExternalStorageDirectory}/$fileName';
awaitNearby().copyFileAndDeleteOriginal(uri, newPath);
Checkout the Example in Repository for more details.