alann-maulana / flutter_beacon

An hybrid iBeacon scanner and transmitter SDK for Flutter Android and iOS.
Apache License 2.0
117 stars 144 forks source link

No Beacons Detected. Android #138

Closed hamdifarid closed 3 months ago

hamdifarid commented 3 months ago

I can detect my beacons using the beaconScope app. Idk what am I doing wrong. All permissions have been granted. All libraries are updated. but I keep getting beacons not found.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_beacon/flutter_beacon.dart';
import 'package:permission_handler/permission_handler.dart';

class MyHomePageOld extends StatefulWidget {
  const MyHomePageOld({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<MyHomePageOld> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePageOld> {
  StreamSubscription<RangingResult>? _streamRanging;
  int numberOfBeacons = 0;
  String beacon = 'Start Scanning Beacons';

  @override
  void initState() {
    super.initState();
    _requestPermissions();
  }

  void _requestPermissions() async {
    Map<Permission, PermissionStatus> statuses = await [
      Permission.bluetoothScan,
      Permission.bluetoothConnect,
      Permission.locationWhenInUse,
      Permission.bluetoothAdvertise,
    ].request();

    bool allGranted = statuses.values.every((status) => status.isGranted);

    if (allGranted) {
      print('All permissions granted');
      _initializeFlutterBeacon();
      _monitorBeacons();
    } else {
      print('Permissions not granted: $statuses');
    }
  }

  void _initializeFlutterBeacon() async {
    try {
      await flutterBeacon.initializeScanning;
      print('Beacon scanning initialized');
    } catch (e) {
      print('Failed to initialize beacon scanning: $e');
    }
  }

  void _monitorBeacons() {
    final regions = <Region>[];

    if (Platform.isIOS) {
      regions.add(Region(
          identifier: 'Apple Airlocate',
          proximityUUID: 'E2C56DB5-DFFB-48D2-B060-D0F5A71096E0'));
    } else {
      regions.add(
        Region(
            identifier: 'all-beacons-region',
            proximityUUID: null,
            major: null,
            minor: null),
      );
    }

    _streamRanging?.cancel(); // Cancel any existing subscriptions
    _streamRanging =
        flutterBeacon.ranging(regions).listen((RangingResult result) {
      setState(() {
        numberOfBeacons = result.beacons.length;
      });
      print('Ranging result: ${result.beacons}');
      if (result.beacons.isNotEmpty) {
        print('Found beacons: ${result.beacons.length}');
        setState(() {
          beacon =
              'Found beacons ${DateTime.now()} numberOfBeacons: $numberOfBeacons ${result.beacons}';
        });
      } else {
        print('No beacons found');
        setState(() {
          beacon =
              'No beacons found ${DateTime.now()} numberOfBeacons: $numberOfBeacons';
        });
      }
    }, onError: (e) {
      print('Ranging error: $e');
    });
  }

  @override
  void dispose() {
    _streamRanging
        ?.cancel(); // Cancel the subscription when the widget is disposed
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          actions: [
            TextButton(
              onPressed: () {
                _monitorBeacons();
              },
              child: const Text('Start'),
            ),
            TextButton(
              onPressed: () {
                _streamRanging?.cancel();
              },
              child: const Text('Stop'),
            ),
          ],
          title: const Text('Beacon Scanner'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              SizedBox(
                child: Text(
                  beacon,
                  style: const TextStyle(fontSize: 20),
                  textAlign: TextAlign.center,
                ),
              ),
            ],
          ),
        ));
  }
}

This is my output

W/DistanceConfigFetcher(18173): java.io.FileNotFoundException: https://s3.amazonaws.com/android-beacon-library/android-distance.json
W/DistanceConfigFetcher(18173):     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:255)
W/DistanceConfigFetcher(18173):     at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:211)
W/DistanceConfigFetcher(18173):     at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:30)
W/DistanceConfigFetcher(18173):     at org.altbeacon.beacon.distance.DistanceConfigFetcher.request(DistanceConfigFetcher.java:94)
W/DistanceConfigFetcher(18173):     at org.altbeacon.beacon.distance.ModelSpecificDistanceUpdater.doInBackground(ModelSpecificDistanceUpdater.java:28)
W/DistanceConfigFetcher(18173):     at org.altbeacon.beacon.distance.ModelSpecificDistanceUpdater.doInBackground(ModelSpecificDistanceUpdater.java:16)
W/DistanceConfigFetcher(18173):     at android.os.AsyncTask$3.call(AsyncTask.java:394)
W/DistanceConfigFetcher(18173):     at java.util.concurrent.FutureTask.run(FutureTask.java:264)
W/DistanceConfigFetcher(18173):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
W/DistanceConfigFetcher(18173):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
W/DistanceConfigFetcher(18173):     at java.lang.Thread.run(Thread.java:1012)
W/ModelSpecificDistanceCalculator(18173): Cannot updated distance models from online database at java.io.FileNotFoundException: https://s3.amazonaws.com/android-beacon-library/android-distance.json
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
E/gralloc4(18173): Empty SMPTE 2094-40 data
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
E/gralloc4(18173): Empty SMPTE 2094-40 data
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
E/gralloc4(18173): Empty SMPTE 2094-40 data
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
E/gralloc4(18173): Empty SMPTE 2094-40 data
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
E/gralloc4(18173): Empty SMPTE 2094-40 data
D/BluetoothAdapter(18173): isLeEnabled(): ON
I/flutter (18173): Ranging result: []
I/flutter (18173): No beacons found
D/BluetoothAdapter(18173): isLeEnabled(): ON
D/BluetoothLeScanner(18173): onScannerRegistered() - status=0 scannerId=9 mScannerId=0
E/gralloc4(18173): Empty SMPTE 2094-40 data
hamdifarid commented 3 months ago

The issue has been resolved. checked permissions this way. Then looped through all the permissions. For some reason my location permission was not being granted.

   final PermissionStatus status = await Permission.bluetooth.request();
    if (status.isGranted) {
      print('Permission granted$status');
    }
    final PermissionStatus locationStatus = await Permission.location.request();
    if (locationStatus.isGranted) {
      print('Permission granted$locationStatus');
    }

    final PermissionStatus bluetoothScanStatus =
        await Permission.bluetoothScan.request();
    if (bluetoothScanStatus.isGranted) {
      print('Permission granted$bluetoothScanStatus');
    }
    final PermissionStatus bluetoothConnect =
        await Permission.bluetoothConnect.request();
    if (bluetoothConnect.isGranted) {
      print('Permission granted$bluetoothConnect');
    }