{"id":32305329,"url":"https://github.com/mannprerak2/nearby_connections","last_synced_at":"2026-02-23T11:22:28.042Z","repository":{"id":34880989,"uuid":"186055762","full_name":"mannprerak2/nearby_connections","owner":"mannprerak2","description":"Flutter plugin (android) for sharing bytes and files Offline, (Based on the android Nearby Connections API)","archived":false,"fork":false,"pushed_at":"2025-02-19T17:26:44.000Z","size":348,"stargazers_count":97,"open_issues_count":5,"forks_count":32,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-10-23T06:50:29.969Z","etag":null,"topics":["android","flutter-plugin","hacktoberfest","nearby-connections"],"latest_commit_sha":null,"homepage":"https://pub.dev/packages/nearby_connections","language":"Dart","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mannprerak2.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-10T21:20:45.000Z","updated_at":"2025-08-01T13:53:05.000Z","dependencies_parsed_at":"2025-02-19T18:33:17.355Z","dependency_job_id":null,"html_url":"https://github.com/mannprerak2/nearby_connections","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mannprerak2/nearby_connections","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mannprerak2%2Fnearby_connections","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mannprerak2%2Fnearby_connections/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mannprerak2%2Fnearby_connections/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mannprerak2%2Fnearby_connections/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mannprerak2","download_url":"https://codeload.github.com/mannprerak2/nearby_connections/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mannprerak2%2Fnearby_connections/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29741409,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T07:44:07.782Z","status":"ssl_error","status_checked_at":"2026-02-23T07:44:07.432Z","response_time":90,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","flutter-plugin","hacktoberfest","nearby-connections"],"created_at":"2025-10-23T06:49:53.620Z","updated_at":"2026-02-23T11:22:28.033Z","avatar_url":"https://github.com/mannprerak2.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"https://developers.google.com/nearby/images/nearby_logo.svg\" align=\"right\"\u003e\n\n# nearby_connections\n\nAn **ANDROID** flutter plugin for the [Nearby Connections API](https://developers.google.com/nearby/connections/overview)\nCurrently supports Bytes and Files.\n\n**Transfer Data between multiple connected devices using fully offline peer to peer networking**\n\n[![pub package](https://img.shields.io/pub/v/nearby_connections.svg)](https://pub.dartlang.org/packages/nearby_connections)\n[![Stars](https://img.shields.io/github/stars/mannprerak2/nearby_connections?logo=github\u0026style=flat\u0026color=green)](https://github.com/mannprerak2/nearby_connections)\n[![Forks](https://img.shields.io/github/forks/mannprerak2/nearby_connections?logo=github\u0026style=flat\u0026color=purple)](https://github.com/mannprerak2/nearby_connections)\n\n## Table of Content\n\n-   [Setup](#setup)\n-   [Work Flow](#work-flow)\n    -   [Advertise For connections](#advertise-for-connection)\n    -   [Discover Advertisers](#discover-advertisers)\n    -   [Request Connection](#request-connection)\n    -   [Accept Connection](#accept-connection)\n-   [Sending Data](#sending-data)\n    -   [Sending Bytes Payload](#sending-bytes-payload)\n    -   [Sending Files](#sending-file-payload)\n\n## Setup\n\n### Note regarding Location(GPS)\n\nWhile using this,\n**Location/GPS service must be turned on** or devices may disconnect\nmore often, some devices may disconnect immediately.\n\n### Set [Permissions](https://developers.google.com/nearby/connections/android/get-started#request_permissions)\n\nAdd these to your project's `android/src/main/AndroidManifest.xml`\n\n```xml\n\u003c!-- Required for Nearby Connections --\u003e\n\u003cuses-permission android:maxSdkVersion=\"31\" android:name=\"android.permission.ACCESS_WIFI_STATE\" /\u003e\n\u003cuses-permission android:maxSdkVersion=\"31\" android:name=\"android.permission.CHANGE_WIFI_STATE\" /\u003e\n\u003cuses-permission android:maxSdkVersion=\"30\" android:name=\"android.permission.BLUETOOTH\" /\u003e\n\u003cuses-permission android:maxSdkVersion=\"30\" android:name=\"android.permission.BLUETOOTH_ADMIN\" /\u003e\n\u003cuses-permission android:maxSdkVersion=\"28\" android:name=\"android.permission.ACCESS_COARSE_LOCATION\" /\u003e\n\u003cuses-permission android:minSdkVersion=\"29\" android:maxSdkVersion=\"31\" android:name=\"android.permission.ACCESS_FINE_LOCATION\" /\u003e\n\u003cuses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_ADVERTISE\" /\u003e\n\u003cuses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_CONNECT\" /\u003e\n\u003cuses-permission android:minSdkVersion=\"31\" android:name=\"android.permission.BLUETOOTH_SCAN\" /\u003e\n\u003cuses-permission android:minSdkVersion=\"32\" android:name=\"android.permission.NEARBY_WIFI_DEVICES\" /\u003e\n\u003c!-- Optional: only required for FILE payloads --\u003e\n\u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/\u003e\n```\n\n\u003e Note: Android 12+ has introduced some new [bluetooth permissions](https://developer.android.com/about/versions/12/features#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.\n\n### Request Permissions\n\nSince 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.\n\n\u003e You can use:\n\u003e\n\u003e -   [permission_handler](https://pub.dev/packages/permission_handler) package to handle all these permissions\n\u003e -   [location](https://pub.dev/packages/location) package to request enabling location.\n\u003e -   [device_info_plus](https://pub.dev/packages/device_info_plus) to check Android verison.\n\n```dart\n// location permission\nawait Permission.location.isGranted         // Check Permission\nawait Permission.location.request()         // Ask\n\n// Check Location Status\nawait Permission.location.serviceStatus.isEnabled;\n\n// location enable dialog\nawait Location.instance.requestService()\n\n// external storage permission\nawait Permission.storage.isGranted          // Check Permission\nawait Permission.storage.request()          // Ask\n\n// Bluetooth permissions\nbool granted = !(await Future.wait([        // Check Permissions\n    Permission.bluetooth.isGranted,\n    Permission.bluetoothAdvertise.isGranted,\n    Permission.bluetoothConnect.isGranted,\n    Permission.bluetoothScan.isGranted,\n])).any((element) =\u003e false);\n[                                           // Ask Permissions\n    Permission.bluetooth,\n    Permission.bluetoothAdvertise,\n    Permission.bluetoothConnect,\n    Permission.bluetoothScan\n].request();\n\n// Check Bluetooth Status\nawait Permission.bluetooth.serviceStatus.isEnabled;\n\n\n// Android 12+\nawait Permission.nearbyWifiDevices.request()\n```\n\nCheckout the [**Example**](https://github.com/mannprerak2/nearby_connections/tree/master/example) in Repository for more details.\n\n## NOTE\n\n**Location/GPS service must be turned on** or devices may disconnect\nmore often, some devices may disconnect immediately.\n\n## Work Flow\n\nThe work flow is similar to the [Android Nearby Connections library](https://developers.google.com/nearby/connections/overview)\n\n### Advertise for connection\n\n```dart\ntry {\n    bool a = await Nearby().startAdvertising(\n        userName,\n        strategy, // https://developers.google.com/nearby/connections/strategies\n        onConnectionInitiated: (String id,ConnectionInfo info) {\n        // Called whenever a discoverer requests connection\n        },\n        onConnectionResult: (String id,Status status) {\n        // Called when connection is accepted/rejected\n        },\n        onDisconnected: (String id) {\n        // Callled whenever a discoverer disconnects from advertiser\n        },\n        serviceId: \"com.yourdomain.appname\", // uniquely identifies your app\n    );\n} catch (exception) {\n    // platform exceptions like unable to start bluetooth or insufficient permissions\n}\n```\n\n### Discover Advertisers\n\n```dart\ntry {\n    bool a = await Nearby().startDiscovery(\n        userName,\n        strategy, // https://developers.google.com/nearby/connections/strategies\n        onEndpointFound: (String id,String userName, String serviceId) {\n            // called when an advertiser is found\n        },\n        onEndpointLost: (String id) {\n            //called when an advertiser is lost (only if we weren't connected to it )\n        },\n        serviceId: \"com.yourdomain.appname\", // uniquely identifies your app\n    );\n} catch (e) {\n    // platform exceptions like unable to start bluetooth or insufficient permissions\n}\n```\n\n### Stopping Advertising and Discovery\n\n```dart\nNearby().stopAdvertising();\nNearby().stopDiscovery();\n// endpoints already discovered will still be available to connect\n// even after stopping discovery\n// You should stop discovery once you have found the intended advertiser\n// this will reduce chances for disconnection\n```\n\n### Request Connection\n\n```dart\n// to be called by discover whenever an endpoint is found\n// callbacks are similar to those in startAdvertising method\ntry{\n    Nearby().requestConnection(\n        userName,\n        id,\n        onConnectionInitiated: (id, info) {\n        },\n        onConnectionResult: (id, status) {\n        },\n        onDisconnected: (id) {\n        },\n    );\n}catch(exception){\n    // called if request was invalid\n}\n```\n\n### Accept Connection\n\n```dart\nNearby().acceptConnection(\n    id,\n    onPayLoadRecieved: (endpointId, payload) {\n        // called whenever a payload is recieved.\n    },\n    onPayloadTransferUpdate: (endpointId, payloadTransferUpdate) {\n        // gives status of a payload\n        // e.g success/failure/in_progress\n        // bytes transferred and total bytes etc\n    }\n);\n```\n\n## Sending Data\n\n### Sending Bytes Payload\n\n```dart\nNearby().sendBytesPayload(endpointId, bytes_array);\n\n// payloads are recieved by callback given to acceptConnection method.\n```\n\n### Sending File Payload\n\nYou need to send the File Payload and File Name seperately.\n\nFile is stored in `DOWNLOAD_DIRECTORY/.nearby/` and given a generic name.\nYou need to copy the file to another directory of your choice.\n\n```dart\n//creates file with generic name (without extension) in Downloads Directory\n//its your responsibility to rename the file properly\nNearby().sendFilePayload(endpointId, filePath);\n\n//Send filename as well so that receiver can move and rename the file\nNearby().sendBytesPayload(endpointId,fileNameEncodedWithPayloadId);\n//e.g send a string like \"payloadId:FileExtensionOrFullName\" as bytes\n\n//payloads are recieved by callback given to acceptConnection method.\n```\n\nEvery payload has an **ID** which is same for sender and receiver.\n\nYou can get the `uri` of the file from Payload in _onPayloadReceived_ function.\nWe have a convenience method to copy the file to a location you want-\n\n```dart\n// Convenience method to copy file using it's `uri`.\nfinal newPath = '${await getExternalStorageDirectory}/$fileName';\nawait Nearby().copyFileAndDeleteOriginal(uri, newPath);\n```\n\nCheckout the [**Example**](https://github.com/mannprerak2/nearby_connections/tree/master/example) in Repository for more details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmannprerak2%2Fnearby_connections","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmannprerak2%2Fnearby_connections","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmannprerak2%2Fnearby_connections/lists"}