Flutter原生GNSS数据访问插件raw_gnss的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter原生GNSS数据访问插件raw_gnss的使用


raw_gnss 📡

raw_gnss 📡 使得获取原始GNSS数据(包括GNSS测量事件、GNSS导航消息和GNSS状态事件)变得简单。


在Android上获取原始GNSS数据

从Android 7.0开始,Android公开了获取原始数据点所需的GNSS API,从而打开了位置黑盒子。

raw_gnss允许你通过内置流轻松获取GNSS测量事件、GNSS导航消息和GNSS状态。

使用方法

GNSS测量

RawGnss().gnssMeasurementEvents.listen((e) {});

GNSS导航消息

RawGnss().gnssNavigationMessageEvents.listen((e) {});

GNSS状态

RawGnss().gnssStatusEvents.listen((e) {});

示例:获取GNSS测量模型

StreamBuilder<GnssMeasurementModel>(
  builder: (context, snapshot) {
    if (snapshot.data == null) {
      return CircularProgressIndicator();
    }

    return ListView.builder(
      itemBuilder: (context, position) {
        return ListTile(
          title: Text(
              "卫星: ${snapshot.data!.measurements![position].svid}"),
        );
      },
      itemCount: snapshot.data!.measurements?.length ?? 0,
    );
  },
  stream: RawGnss().gnssMeasurementEvents,
),

注意: iOS目前还不支持暴露原始位置数据,因此该插件目前不支持iOS。


完整示例代码

以下是一个完整的示例代码,展示了如何在Android设备上使用raw_gnss插件来获取GNSS状态数据。

import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:raw_gnss/gnss_status_model.dart';
import 'package:raw_gnss/raw_gnss.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text("Demo"),
        ),
        body: HomeScreen(),
      ),
    );
  }
}

class HomeScreen extends StatefulWidget {
  [@override](/user/override)
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  var _hasPermissions = false;
  late RawGnss _gnss;

  [@override](/user/override)
  void initState() {
    super.initState();

    _gnss = RawGnss();

    Permission.location
        .request()
        .then((value) => setState(() => _hasPermissions = value.isGranted));
  }

  [@override](/user/override)
  Widget build(BuildContext context) => _hasPermissions
      ? StreamBuilder<GnssStatusModel>(
          builder: (context, snapshot) {
            if (snapshot.data == null) {
              return _loadingSpinner();
            } else {
              return ListView.builder(
                itemBuilder: (context, position) {
                  return ListTile(
                    title: Text(
                        "卫星: ${snapshot.data!.status![position].azimuthDegrees}"),
                  );
                },
                itemCount: snapshot.data!.satelliteCount ?? 0,
              );
            }
          },
          stream: _gnss.gnssStatusEvents,
        )
      : _loadingSpinner();

  Widget _loadingSpinner() => const Center(child: CircularProgressIndicator());
}

更多关于Flutter原生GNSS数据访问插件raw_gnss的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter原生GNSS数据访问插件raw_gnss的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter应用中使用raw_gnss插件来访问原生GNSS(全球导航卫星系统)数据的示例代码。这个插件允许你直接从设备获取原始的GNSS数据,比如卫星信息、NMEA句子等。

首先,确保你已经在你的pubspec.yaml文件中添加了raw_gnss依赖:

dependencies:
  flutter:
    sdk: flutter
  raw_gnss: ^最新版本号  # 请替换为最新的版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter应用中,你可以按照以下步骤使用raw_gnss插件:

  1. 导入插件

在你的Dart文件中导入raw_gnss插件:

import 'package:raw_gnss/raw_gnss.dart';
  1. 请求权限

在Android和iOS上,访问GNSS数据通常需要位置权限。你可以在应用的启动阶段请求这些权限。这里假设你已经使用了permission_handler插件来处理权限请求。

import 'package:permission_handler/permission_handler.dart';

Future<void> requestPermissions() async {
  var status = await Permission.locationWhenInUse.status;
  if (!status.isGranted) {
    var result = await Permission.locationWhenInUse.request();
    if (result.isDenied || result.isPermanentlyDenied) {
      // 处理权限被拒绝的情况
    }
  }
}
  1. 启动GNSS数据监听

使用RawGnss类来启动和停止GNSS数据监听。

void startGnssDataListening() async {
  RawGnss.startListening((GnssStatus status) {
    print('GNSS Status: $status');
  }, (GnssData data) {
    print('GNSS Data: $data');
  }, (List<NmeaSentence> sentences) {
    sentences.forEach((sentence) {
      print('NMEA Sentence: ${sentence.sentence}');
    });
  }, onError: (error, stackTrace) {
    print('Error: $error');
    print('Stack Trace: $stackTrace');
  });
}

void stopGnssDataListening() {
  RawGnss.stopListening();
}
  1. 在应用中调用这些方法

在你的Flutter应用的适当位置(比如initState或者按钮点击事件中)调用这些方法。

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    requestPermissions();
    startGnssDataListening();
  }

  @override
  void dispose() {
    stopGnssDataListening();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Raw GNSS Data Example'),
        ),
        body: Center(
          child: Text('Listening for GNSS data...'),
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中初始化raw_gnss插件,请求必要的权限,并启动和停止GNSS数据的监听。监听器回调会打印GNSS状态、数据和NMEA句子到控制台。

请注意,实际应用中你可能需要更复杂的UI和错误处理逻辑,这里为了简洁而省略了这些部分。另外,由于raw_gnss插件可能在不同版本的Flutter和Dart环境中有所不同,建议查阅最新的官方文档和示例代码以确保兼容性。

回到顶部