Flutter增强现实查看插件native_ar_viewer的使用

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

Flutter增强现实查看插件native_ar_viewer的使用

native_ar_viewer 是一个用于在Flutter中快速查看3D模型的增强现实(AR)插件。它利用了Android的SCENE VIEW和iOS的QUICK LOOK来实现这一功能。

支持的格式

  • Android: GLB, GLTF
  • iOS: USDZ

示例应用程序展示了如何在Android上使用该插件。对于iOS,您需要从本地目录传递文件路径。

使用方法

调用 NativeArViewer.launchAR(modelURL) 方法即可启动AR视图。

await NativeArViewer.launchAR(modelURL);

示例应用

以下是一个完整的示例应用程序,演示如何在Android和iOS平台上使用native_ar_viewer插件。

Android 平台

可以直接传递远程3D资产的URL。

iOS 平台

必须从本地目录传递文件路径。(提供了下载远程资产的基本样本)

可能的解决方案

您可以使用flutter_downloader包下载并保存远程资产。保存后,将文件路径传递给native_ar_viewerlaunchAR函数。

注意:iOS Quick Look不支持从远程URL加载资产。

完整示例代码

import 'dart:io' as io;
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:native_ar_viewer/native_ar_viewer.dart';
import 'package:path_provider/path_provider.dart';

String iosAssetPath = '';
String taskId = '';
String documentDirectoryPath = "";

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await FlutterDownloader.initialize();
  FlutterDownloader.registerCallback(downloadCallback);

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  /// For Android Platform .glb format and for IOS .USDZ
  final String modelURL = io.Platform.isAndroid
      ? "https://firebasestorage.googleapis.com/v0/b/livvinyl-health-connector.appspot.com/o/catcow.glb?alt=media&token=da87cd4d-c9c1-4176-b1b3-a0b6fdc8734b"
      : "https://firebasestorage.googleapis.com/v0/b/livvinyl-health-connector.appspot.com/o/Astronaut.usdz?alt=media&token=833344f6-7f17-4f21-aa5c-6f9fc5313928";

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

  _downloadAssetsForIOS() async {
    await _prepareSaveDir();
    taskId = (await FlutterDownloader.enqueue(
        url: modelURL, savedDir: documentDirectoryPath))!;
    print('taskId = $taskId');
  }

  _launchAR() async {
    if (io.Platform.isAndroid) {
      await NativeArViewer.launchAR(modelURL);
    } else if (io.Platform.isIOS) {
      /// Here File name is hardcoded, in realtime application you will use your own logic to locate USDZ file.
      await NativeArViewer.launchAR("$documentDirectoryPath/Astronaut.usdz");
    } else {
      ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text('Platform not supported')));
    }
  }

  Future<void> _prepareSaveDir() async {
    documentDirectoryPath = (await _findLocalPath())!;
    final savedDir = io.Directory(documentDirectoryPath);
    bool hasExisted = await savedDir.exists();
    if (!hasExisted) {
      savedDir.create();
    }
  }

  Future<String?> _findLocalPath() async =>
      (await getApplicationDocumentsDirectory()).path;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Example app'), centerTitle: true),
        body: Padding(
          padding: const EdgeInsets.all(32.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.stretch,
            children: [
              ElevatedButton(
                onPressed: _launchAR,
                child: const Text(
                  'Launch AR',
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

void downloadCallback(String id, DownloadTaskStatus status, int progress) async {
  print('callback: ID = $id || status = $status || progress = $progress');
}

以上代码提供了一个完整的Flutter应用程序示例,展示了如何在不同平台上使用native_ar_viewer插件查看3D模型。请根据您的具体需求进行调整和扩展。


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中集成并使用native_ar_viewer插件来查看增强现实(AR)内容的示例代码。native_ar_viewer插件允许你在Flutter应用中打开AR内容,通常是通过ARCore(Android)或ARKit(iOS)实现的。

首先,确保你的Flutter项目已经设置好,并且你已经将native_ar_viewer插件添加到了pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  native_ar_viewer: ^x.y.z  # 请替换为最新版本号

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

示例代码

1. 主应用代码(main.dart

import 'package:flutter/material.dart';
import 'package:native_ar_viewer/native_ar_viewer.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter AR Viewer Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ARViewerScreen(),
    );
  }
}

class ARViewerScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter AR Viewer Demo'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            _openARViewer(context);
          },
          child: Text('Open AR Viewer'),
        ),
      ),
    );
  }

  void _openARViewer(BuildContext context) {
    // AR文件路径(这里使用本地资源文件作为示例)
    String arFilePath = 'assets/sample.usdz'; // 替换为你的AR文件路径

    // 打开AR Viewer
    NativeARViewer.openARViewer(
      context: context,
      filePath: arFilePath,
      onError: (String errorMessage) {
        // 错误处理
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(
            content: Text('Error: $errorMessage'),
          ),
        );
      },
    );
  }
}

2. 添加AR文件到assets

将你的AR文件(如.usdz或支持的其他格式)添加到assets文件夹中,并在pubspec.yaml文件中声明它:

flutter:
  assets:
    - assets/sample.usdz  # 替换为你的AR文件路径

注意事项

  1. AR文件格式:确保你使用的AR文件格式与native_ar_viewer插件兼容。例如,对于iOS,.usdz.scn文件是支持的。
  2. 权限:对于Android,你可能需要在AndroidManifest.xml中请求相机权限。对于iOS,你可能需要在Info.plist中添加相应的权限描述。
  3. 插件限制native_ar_viewer依赖于原生AR框架(如ARCore和ARKit),因此它的功能可能受限于这些框架的支持范围和设备的兼容性。

运行应用

确保你的开发环境已经正确配置,并且连接了一个支持AR的设备(或模拟器)。然后运行你的Flutter应用,点击按钮应该能够打开AR查看器并显示你的AR内容。

这个示例代码提供了一个基本的框架,你可以根据实际需求进一步扩展和定制。

回到顶部