You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中检测定位状态并引导用户开启定位(蓝牙扫描场景)

解决方案:检测定位服务状态并引导开启(Flutter Blue Plus蓝牙扫描场景)

1. 添加必要依赖

除已有的flutter_blue_plus和permission_handler,引入geolocator来检测定位服务的开启状态。在pubspec.yaml中添加:

dependencies:
  flutter_blue_plus: ^1.13.3 # 使用最新版本
  permission_handler: ^11.0.1 # 使用最新版本
  geolocator: ^11.0.0 # 使用最新版本

2. 实现定位检测与引导逻辑

以下是完整代码示例,包含权限请求、定位服务检测、弹窗引导跳转设置的逻辑:

import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:geolocator/geolocator.dart';

class BluetoothScanPage extends StatefulWidget {
  const BluetoothScanPage({super.key});

  @override
  State<BluetoothScanPage> createState() => _BluetoothScanPageState();
}

class _BluetoothScanPageState extends State<BluetoothScanPage> {
  // 检查定位权限与服务状态
  Future<bool> _checkLocationRequirements() async {
    // 1. 请求定位权限
    final locationPermission = await Permission.location.request();
    if (locationPermission != PermissionStatus.granted) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(content: Text('定位权限未授予,无法扫描蓝牙设备')),
      );
      return false;
    }

    // 2. 检测定位服务是否开启
    final isLocationEnabled = await Geolocator.isLocationServiceEnabled();
    if (!isLocationEnabled) {
      await showDialog(
        context: context,
        barrierDismissible: false,
        builder: (ctx) => AlertDialog(
          title: const Text('定位服务未开启'),
          content: const Text('蓝牙扫描需要依赖定位服务,请开启手机定位功能'),
          actions: [
            TextButton(
              onPressed: () => Navigator.pop(ctx),
              child: const Text('取消'),
            ),
            TextButton(
              onPressed: () {
                // 跳转到系统定位设置页面
                Geolocator.openLocationSettings();
                Navigator.pop(ctx);
              },
              child: const Text('去设置'),
            ),
          ],
        ),
      );
      return false;
    }

    return true;
  }

  // 启动蓝牙扫描
  void _startScan() async {
    final canScan = await _checkLocationRequirements();
    if (canScan) {
      // 开始扫描,设置超时时间
      FlutterBluePlus.startScan(timeout: const Duration(seconds: 5));
      // 监听扫描结果(示例)
      FlutterBluePlus.scanResults.listen((results) {
        for (ScanResult result in results) {
          print('设备名称: ${result.device.name},MAC地址: ${result.device.id}');
        }
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('蓝牙扫描')),
      body: Center(
        child: ElevatedButton(
          onPressed: _startScan,
          child: const Text('开始扫描蓝牙设备'),
        ),
      ),
    );
  }
}

3. 平台配置补充

Android端

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<!-- 定位权限 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Android 12+ 蓝牙扫描权限 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<!-- 蓝牙连接权限(如果需要连接设备) -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

iOS端

在ios/Runner/Info.plist中添加权限描述:

<key>NSLocationWhenInUseUsageDescription</key>
<string>需要定位权限以扫描蓝牙设备</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>需要蓝牙权限以连接和管理蓝牙设备</string>

内容的提问来源于stack exchange,提问作者Hitesh Bharadwaj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:05:12