0

我是 android 和 NFC 的新手,并尝试制作一个简单的小 Flutter 中继应用程序,该应用程序采用嵌入在 NFC 标签上的 json 数据并执行所描述的操作。IE:

  1. 在这个 NFC 贴纸上点击我的手机
  2. 打开我的颤振应用
  3. 自动将 json 数据传递给可以读取和执行指令的某个函数。

我的问题是我可以做 #2 或 #3,但不能使用相同的 NFC 扫描。如果我在关闭应用程序的情况下进行扫描,它会打开我的应用程序,但不会在MyApp.build. 如果应用程序已经在前台,它将命中它,但这会限制该值。

NFC 标签(通过NFC 工具

DATA
{"action" : "Do the thing and you will have the power."}
FORMAT
Media (0x02)
Defined by RFC 2046
TYPE
application/json

AndroidManifest.xml

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/json" />
</intent-filter>

MainActivity.kt

package com.example.package

import io.flutter.embedding.android.FlutterActivity

import android.content.Intent;
import android.os.Bundle;

class MainActivity: FlutterActivity() {
}

main.dart(使用nfc_in_flutter

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


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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var stream = NFC.readNDEF();

    stream.listen((NDEFMessage message) {
      for (var record in message.records) {
        print("Payload: ${record.payload}"); // This works when foregrounded
      }
    });

    return MaterialApp(
      title: 'Material App',
      home: Scaffold(
        appBar: AppBar(
          title: Text('Material App Bar'),
        ),
        body: Text("Foo"),
      ),
    );
  }
}
4

1 回答 1

1

我知道您的问题的原因,但不知道您在 Flutter 中的问题的解决方案(我知道 Java 中的解决方案),但希望这个答案能为您指明正确的方向。

当您的应用程序在前台运行时,系统 NFC 应用程序有两种方式向您发送有关它检测到的 NFC 标签的数据。

新的enableReaderMode更好的 API 使用回调onTagDiscovered来处理数据。

旧的enableForgroundDispatchAPI 暂停并恢复您的应用程序以向其发送一个Intent包含有关 NFC 标签的数据,这由该onNewIntent方法处理。

nfc_in_flutter包为您处理这两种方法,但当您的应用程序由系统 NFC 应用程序启动时,它不处理。

当您的应用程序未运行并且系统 NFC 应用程序看到一个 NFC 标签时,它会读取标签以识别类型和数据内容并生成一个Intent(很像用于enableForgroundDispatchAPI 的 Intent 格式,然后它Manifest会查看哪个应用程序处理这种Intentas 与 App 共享,
不同的是该onNewIntent方法只在 App 上调用,Restart而不在 App 上调用Start

通常在您的onCreate方法中的 Java 中,您将调用getIntent()以获取启动 Activity 的 Intent,然后直接调用处理 NFC Intent 的方法(因此您可以使用代码onCreateonNewIntent(getIntent());处理传入的共享数据)

因此,当您的应用程序通过读取 NFC 标签启动时,该机制更像是一个 Android Activity 与另一个 Android Activity 共享数据,而不是实际上与 NFC 读取有关。

因此,当您的应用程序未运行时,从 NFC 标签获取数据更多是关于接收“共享”意图,这篇文章可能会对您有所帮助https://muetsch.io/how-to-receive-sharing-intents- in-flutter.html

于 2021-01-30T21:03:44.480 回答