繁体   English   中英

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

[英]Reading a message stored on NDEF tag. Android

我试图找到一个工作示例,说明如何读取存储在应用程序活动活动中的 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 中 NFC 的正常模式是:-

1)当您的应用程序未运行时,您希望它在某种类型的 NFC 标签呈现给设备时启动,然后您将您的intent-filters放入清单中。 然后您的应用程序将启动并传递您需要在onCreate方法中使用getIntent()处理的Intent

2a)您的应用程序已经在前台运行,然后您使用enableForegroundDispatch ,给它一个待处理的 Intent 您想要通知的内容,然后在您的应用程序重新启动(暂停和恢复)以接收 Intent 时在onNewIntent中进行处理。

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

或者

2b)您的应用程序已经在前台运行,然后您使用enableReaderMode ,它是enableForegroundDispatch的更好替代品,然后您在onTagDiscovered中处理标签,它位于单独的线程中。

如何处理通过模式 1 和 2a 接收到的Intent是相同的,只是需要从与触发 Intent 的方法相匹配的代码中的正确路径调用它们,即在onCreateonNewIntent

查看空 NFC 标签读写 Android 应用程序。 扫描空标签时移动自己的消息返回但应用程序不起作用? 有关如何使用 Manifest 和enableForeGroundDispatch的示例

还有很多在 Stackoverflow 上使用enableReaderMode的例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM