读取存储在 NDEF 标签上的消息。安卓

问题描述 投票:0回答:1

我试图找到一个工作示例,说明如何读取存储在应用程序活动 Activity 中 NDEF 标记上的消息。到目前为止,我拥有的最好的就是这样的代码:

public class Activity1_3_1_1 extends AppCompatActivity {

private Button done;
NfcAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity1_3_1_1);

    done = findViewById(R.id.button5);

    done.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            switchActivityTo1();
        }
    });
}

private void switchActivityTo1() {
    Intent switchActivityIntent = new Intent(this, MainActivity.class);
    startActivity(switchActivityIntent);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
        adapter = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);  // get the detected tag
        Parcelable[] msgs =
                intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        NdefRecord firstRecord = ((NdefMessage) msgs[0]).getRecords()[0];
        byte[] payload = firstRecord.getPayload();
        int payloadLength = payload.length;
        int langLength = payload[0];
        int textLength = payloadLength - langLength - 1;
        byte[] text = new byte[textLength];
        System.arraycopy(payload, 1 + langLength, text, 0, textLength);
        Toast.makeText(getApplicationContext(), new String(text), Toast.LENGTH_LONG).show();//display the response on screen
    }
}
}

和清单文件:

...
<uses-permission android:name="android.permission.NFC"/>
<uses-feature android:name="android.hardware.nfc"/>
...
        <activity
        android:name=".Activity1_3_1_1"
        android:exported="true"
        android:alwaysRetainTaskState="true"
        android:launchMode="singleTask">
        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

问题在于 NFC 服务正在启动,而不是应用程序的 onNewIntent() 方法。 对我来说,弄清楚我是否弄乱了清单文件定义(因为解决方案之一是修改清单文件以便 NFC 服务无法启动)还是活动代码本身内部存在问题,这对我来说是一个问题。或者,也许两者兼而有之。

android tags nfc ndef
1个回答
0
投票

所以 Android 中 NFC 的正常模式是:-

1)当您的应用程序未运行并且您希望它在某种类型的 NFC 标签呈现给设备时启动,然后您将

intent-filters
放入清单中。然后,您的应用程序启动并传递一个
Intent
,您需要使用
onCreate
getIntent()

方法中进行处理

2a)您的应用程序已经在前台运行,然后您使用

enableForegroundDispatch
,为其提供一个关于您想要通知的待处理意图,然后当您的应用程序重新启动(暂停和恢复)时,在
onNewIntent
中处理该意图接收意图。

onNewIntent
不会被任何清单条目调用。

2b)您的应用程序已经在前台运行,然后您使用

enableReaderMode
,它是
enableForegroundDispatch
的更好替代品,然后您可以在单独线程中的
onTagDiscovered
中处理标签。

如何处理通过模式1和2a接收到的

Intent
是相同的,只是需要从与触发Intent的方法相匹配的代码中的正确路径调用,即在
onCreate
onNewIntent

查看空 NFC 标签读写 Android 应用程序。扫描空标签时返回移动设备自己的消息,但应用程序无法正常工作?有关如何使用清单和

enableForeGroundDispatch

的示例

Stackoverflow 上也有很多使用

enableReaderMode
的示例。

© www.soinside.com 2019 - 2024. All rights reserved.