Flutter近距离消息通信插件flutter_nearby_messages_api的使用

Flutter近距离消息通信插件flutter_nearby_messages_api的使用

<Google Nearby Messages API for Flutter>

安装

首先,在您的pubspec.yaml文件中添加flutter_nearby_messages_api作为依赖项。

dependencies:
  flutter_nearby_messages_api: ^x.x.x

替换x.x.x为最新版本号。

iOS

获取并添加Google Cloud附近的messages API密钥到您的项目中。

nearbyMessagesApi.setAPIKey('API_KEY');

ios/Runner/Info.plist文件中添加以下行:

<key>NSMicrophoneUsageDescription</key>
<string>麦克风用于监听来自附近设备的匿名令牌。</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>应用程序需要访问蓝牙以发送和接收消息。</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>通过蓝牙广播匿名令牌以发现附近设备。</string>

对于iOS 13及更高版本,请确保添加NSBluetoothAlwaysUsageDescription。对于早期版本的iOS,请添加NSBluetoothPeripheralUsageDescription

Android

获取并添加Google Cloud附近的messages API密钥到您的项目中。

AndroidManifest.xml文件中添加以下行:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">
    <application ...>
        <meta-data
            android:name="com.google.android.nearby.messages.API_KEY"
            android:value="API_KEY" />
    </application>
</manifest>

替换API_KEY为您实际的API密钥。

示例

下面是一个完整的示例,展示了如何使用flutter_nearby_messages_api插件进行近距离消息通信。

import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter_nearby_messages_api/flutter_nearby_messages_api.dart';

void main() => runApp(MyApp());

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

class _MyAppState extends State<MyApp> {
  FlutterNearbyMessagesApi nearbyMessagesApi = FlutterNearbyMessagesApi();

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

  // 平台消息是异步的,因此我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    // 配置iOS
    await nearbyMessagesApi.setAPIKey('API_KEY');

    // 当附近设备发送消息时调用此回调
    nearbyMessagesApi.onFound = (message) {
      print('~~~onFound : $message');
    };

    // 当附近设备离开时调用此回调
    nearbyMessagesApi.onLost = (message) {
      print('~~~onLost : $message');
    };

    // 监听发布和订阅的状态
    // 枚举 GNSOperationStatus {inactive, starting, active}
    nearbyMessagesApi.statusHandler = (status) {
      print('~~~statusHandler : $status');
    };

    // 使用您的消息来提示用户权限
    nearbyMessagesApi.setPermissionAlert(
        '您的标题', '您的消息', '拒绝', '允许');

    nearbyMessagesApi.permissionHandler = (status) {
      print(status);
    };

    nearbyMessagesApi.bluetoothPowerErrorHandler = (args) {
      print('~~~ bluetoothPowerErrorHandler');
    };

    nearbyMessagesApi.bluetoothPermissionErrorHandler = (args) {
      print('~~~ bluetoothPermissionErrorHandler');
    };

    nearbyMessagesApi.microphonePermissionErrorHandler = (args) {
      print('~~~ microphonePermissionErrorHandler');
    };

    // 发布一条消息
    // @require message
    await nearbyMessagesApi.publish('Hello world!');

    // 订阅
    await nearbyMessagesApi.backgroundSubscribe();

    // 启用调试模式
    await nearbyMessagesApi.enableDebugMode();

    // 禁用调试模式
    await nearbyMessagesApi.disableDebugMode();

    // 不要未经学习就使用它
    // nearbyMessagesApi.setNearbyAccessPermission(true);
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        appBar: new AppBar(
          title: const Text('Flutter Nearby Messages 示例'),
        ),
        body: new Container(
          color: Colors.white70,
          child: new Column(children: [
            new TextButton(
                onPressed: () async {
                  await nearbyMessagesApi.publish('Hello world!');
                },
                child: new Text("发布")),
            new TextButton(
                onPressed: () async {
                  await nearbyMessagesApi.unPublish();
                },
                child: new Text("取消发布")),
            new TextButton(
                onPressed: () async {
                  await nearbyMessagesApi.backgroundSubscribe();
                },
                child: new Text("后台订阅")),
            new TextButton(
                onPressed: () async {
                  await nearbyMessagesApi.backgroundUnsubscribe();
                },
                child: new Text("取消订阅"))
          ]),
        ),
      ),
    );
  }
}

更多关于Flutter近距离消息通信插件flutter_nearby_messages_api的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter近距离消息通信插件flutter_nearby_messages_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_nearby_messages_api插件进行近距离消息通信的示例代码。这个插件允许你的Flutter应用使用Google Play服务和Google Nearby Messages API进行设备间的消息交换。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_nearby_messages_api的依赖:

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

2. 配置Android项目

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

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

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>

    <application
        ...>
        <meta-data
            android:name="com.google.android.gms.nearby.MESSAGES_API"
            android:value="YOUR_API_KEY"/>  <!-- 替换为你的Google Cloud Platform API Key -->
    </application>
</manifest>

3. 配置iOS项目

对于iOS项目,你需要在Info.plist中添加必要的权限描述,并在AppDelegate.swiftAppDelegate.m中进行一些设置。由于iOS的具体配置相对复杂,这里只给出Info.plist的部分:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>Your app needs access to Bluetooth</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Your app needs access to Bluetooth</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Your app needs access to location</string>

4. 使用插件进行消息发布和订阅

以下是一个简单的Flutter应用示例,展示如何使用flutter_nearby_messages_api发布和订阅消息:

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

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

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

class NearbyMessagesScreen extends StatefulWidget {
  @override
  _NearbyMessagesScreenState createState() => _NearbyMessagesScreenState();
}

class _NearbyMessagesScreenState extends State<NearbyMessagesScreen> {
  late NearbyMessagesClient _nearbyMessagesClient;
  late Message _publishedMessage;
  final List<Message> _subscriptions = [];

  @override
  void initState() {
    super.initState();
    _nearbyMessagesClient = NearbyMessagesClient();
    _startPublishing();
    _startSubscribing();
  }

  @override
  void dispose() {
    _nearbyMessagesClient.stopPublishing(_publishedMessage).then((_) {
      _nearbyMessagesClient.stopSubscribing().then((_) {
        _nearbyMessagesClient.shutdown();
      });
    });
    super.dispose();
  }

  Future<void> _startPublishing() async {
    _publishedMessage = Message(
      content: 'Hello, Nearby!',
      type: 'example.type.text',
    );
    await _nearbyMessagesClient.startPublishing(_publishedMessage);
  }

  Future<void> _startSubscribing() async {
    _nearbyMessagesClient.startSubscribing(
      callback: (Message message) {
        setState(() {
          _subscriptions.add(message);
        });
      },
      options: SubscribeOptions(strategy: Strategy.ANY),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Nearby Messages Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('Published Message:'),
            Text(_publishedMessage.content!),
            SizedBox(height: 16.0),
            Text('Received Messages:'),
            ..._subscriptions.map((Message message) => Text(message.content!)),
          ],
        ),
      ),
    );
  }
}

class Message {
  final String? content;
  final String type;

  Message({this.content, required this.type});
}

注意事项

  1. API Key:在Android的AndroidManifest.xml中,确保你替换了YOUR_API_KEY为你在Google Cloud Platform上获取的API Key。
  2. 权限:确保在运行时请求必要的权限,特别是在Android和iOS上。
  3. 错误处理:示例代码中省略了错误处理逻辑,实际开发中应该添加适当的错误处理。

这个示例提供了一个基本的框架,你可以根据需要进行扩展和修改。

回到顶部