Flutter增强现实位置查看插件ar_location_viewer的使用

Flutter增强现实位置查看插件ar_location_viewer的使用

ar_location_viewer

增强现实地理定位功能。灵感来源于 HDAugmentedReality

它是 ar_location_view 的升级版。

升级后的依赖项:

Demo

描述

ArLocationViewer 设计用于具有大量静态兴趣点(POI)的区域,主要目标是使所有 POI 可见。

备注: POI 的海拔高度被忽略。

特性

  • 自动垂直堆叠注解视图
  • 跟踪用户移动并更新可见注解
  • 支持完全自定义的注解视图
  • 支持所有旋转

基本用法

查看示例代码。

iOS 平台

ArLocationView 使用设备摄像头和位置信息,在 Info.plist 中添加以下内容:

<key>NSLocationWhenInUseUsageDescription</key>
<string>需要您的位置来显示POI。</string>
<key>NSLocationUsageDescription</key>
<string>需要您的位置来显示POI。</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>需要您的位置来显示POI。</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>需要您的位置来显示POI。</string>
<key>NSCameraUsageDescription</key>
<string>需要访问相机来显示AR视图。</string>

Android 平台

AndroidManifest.xml 中添加以下权限:

<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<!-- 如果出现异常,则需要添加以下权限 -->
<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>

如果遇到类似以下异常:

PlatformException(error, To use the sampling rate of 500 microseconds, app needs to declare the normal permission HIGH_SAMPLING_RATE_SENSORS., null, null)

请在 AndroidManifest.xml 中添加:

<uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>

创建一个扩展 ArAnnotation 的类:

class Annotation extends ArAnnotation {
  final AnnotationType type;
  
  Annotation({required super.uid, required super.position, required this.type});
}

创建一个用于注解视图的小部件,例如:

class AnnotationView extends StatelessWidget {
  const AnnotationView({
    Key? key,
    required this.annotation,
  }) : super(key: key);

  final Annotation annotation;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        borderRadius: BorderRadius.circular(5),
        color: Colors.white,
      ),
      child: Row(
        children: [
          Expanded(
            child: Container(
              decoration: const BoxDecoration(
                borderRadius: BorderRadius.only(
                  topLeft: Radius.circular(5),
                  bottomLeft: Radius.circular(5),
                ),
              ),
              child: typeFactory(annotation.type),
            ),
          ),
          Expanded(
            flex: 2,
            child: Padding(
              padding: const EdgeInsets.all(4.0),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Text(
                    annotation.type.toString().substring(15),
                    maxLines: 1,
                    style: const TextStyle(fontWeight: FontWeight.bold),
                  ),
                  Text(
                    '${annotation.distanceFromUser.toInt()} m',
                  ),
                ],
              ),
            ),
          )
        ],
      ),
    );
  }

  Widget typeFactory(AnnotationType type) {
    IconData iconData = Icons.ac_unit_outlined;
    Color color = Colors.teal;
    switch (type) {
      case AnnotationType.pharmacy:
        iconData = Icons.local_pharmacy_outlined;
        color = Colors.red;
        break;
      case AnnotationType.hotel:
        iconData = Icons.hotel_outlined;
        color = Colors.green;
        break;
      case AnnotationType.library:
        iconData = Icons.library_add_outlined;
        color = Colors.blue;
        break;
    }
    return Icon(
      iconData,
      size: 40,
      color: color,
    );
  }
}

许可证

ArLocationViewer 是根据 MIT 许可证发布的。

示例代码

以下是完整的示例代码:

import 'package:flutter/material.dart';
import 'package:ar_location_viewer/ar_location_viewer.dart';
import 'package:geolocator/geolocator.dart';
import 'annotation_viewer.dart';
import 'annotations.dart';

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

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

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<Annotation> annotations = [];

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: ArLocationWidget(
          annotations: annotations,
          showDebugInfoSensor: false,
          annotationViewerBuilder: (context, annotation) {
            return AnnotationViewer(
              key: ValueKey(annotation.uid),
              annotation: annotation as Annotation,
            );
          },
          onLocationChange: (Position position) {
            Future.delayed(const Duration(seconds: 5), () {
              annotations = fakeAnnotation(position: position, numberMaxPoi: 50);
              setState(() {});
            });
          },
        ),
      ),
    );
  }
}

更多关于Flutter增强现实位置查看插件ar_location_viewer的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter增强现实位置查看插件ar_location_viewer的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成和使用ar_location_viewer插件的示例代码案例。这个插件通常用于在增强现实(AR)中查看地理位置。需要注意的是,实际使用时你可能需要根据你的具体需求调整代码。

前提条件

  1. 确保你已经安装了Flutter和Dart的开发环境。
  2. 确保你的项目已经创建并初始化。

步骤

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加ar_location_viewer插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  ar_location_viewer: ^latest_version  # 替换为实际最新版本号

然后运行以下命令来获取依赖:

flutter pub get

2. 配置权限

由于AR和地理位置通常涉及到相机和位置权限,你需要在AndroidManifest.xml中添加必要的权限。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!-- 其他配置 -->

</manifest>

对于iOS,你需要在Info.plist中添加必要的权限描述。

<key>NSCameraUsageDescription</key>
<string>App needs access to the camera</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs access to your location</string>

3. 实现AR位置查看

在你的Flutter项目中,创建一个新的页面或使用现有页面来展示AR位置查看功能。

import 'package:flutter/material.dart';
import 'package:ar_location_viewer/ar_location_viewer.dart';
import 'package:geolocator/geolocator.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ARLocationViewerScreen(),
    );
  }
}

class ARLocationViewerScreen extends StatefulWidget {
  @override
  _ARLocationViewerScreenState createState() => _ARLocationViewerScreenState();
}

class _ARLocationViewerScreenState extends State<ARLocationViewerScreen> {
  late Position currentPosition;

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

  Future<void> _getCurrentLocation() async {
    bool serviceEnabled;
    LocationPermission permission;

    // Test if location services are enabled.
    serviceEnabled = await Geolocator.isLocationServiceEnabled();
    if (!serviceEnabled) {
      return Future.error('Location services are disabled.');
    }

    permission = await Geolocator.checkPermission();
    if (permission == LocationPermission.denied) {
      permission = await Geolocator.requestPermission();
      if (permission == LocationPermission.denied) {
        return Future.error('Location permissions are denied');
      }
    }

    if (permission == LocationPermission.deniedForever) {
      return Future.error(
          'Location permissions are permanently denied, we cannot request permissions.');
    }

    currentPosition = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.high,
        forceAndroidLocationManager: true
    );

    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('AR Location Viewer'),
      ),
      body: currentPosition != null
          ? ARLocationViewer(
              latitude: currentPosition.latitude,
              longitude: currentPosition.longitude,
              apiKey: 'YOUR_GOOGLE_MAPS_API_KEY',  // 替换为你的Google Maps API Key
            )
          : Center(
              child: CircularProgressIndicator(),
            ),
    );
  }
}

注意事项

  1. 替换YOUR_GOOGLE_MAPS_API_KEY为你的Google Maps API Key。
  2. 确保你已经启用了Google Maps Geolocation API和ARCore(如果需要)。
  3. 处理权限请求和位置获取时的错误情况,以增强用户体验。

这样,你就可以在Flutter应用中集成并使用ar_location_viewer插件来查看AR位置了。希望这对你有所帮助!

回到顶部