gpt4 book ai didi

android - 未针对 NFC Intent 显示正确的操作

转载 作者:搜寻专家 更新时间:2023-11-01 08:50:27 25 4
gpt4 key购买 nike

我正在处理配备 Android NFC 的设备,只是试图读取标签并从 Activity 接收信息。标记的类型为 MifareUltralight .刚刚在 Android docs 中阅读了那个案例看来我首先必须在 list 文件中注册启动我的 Activity 的 Intent,然后我才能从中接收 NFC Intent。这就是我的 list 文件的样子:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.android">

<uses-feature android:name="android.hardware.nfc" android:required="false" />
<uses-permission android:name="android.permission.NFC" />

<application
android:allowBackup="true"
android:label="Test">

<activity
android:name="com.mycompany.android.activities.NfcTestActivity"
android:launchMode="singleTop"
android:label="Test">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

</application>

</manifest>

我将 nfc 功能设置为不需要,因为它不是我的应用运行所必需的。关于 NFC 技术过滤器,这是我的 nfc_tech_filter.xml 文件:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list>
<tech>android.nfc.tech.IsoDep</tech>
<tech>android.nfc.tech.NfcA</tech>
<tech>android.nfc.tech.NfcB</tech>
<tech>android.nfc.tech.NfcF</tech>
<tech>android.nfc.tech.NfcV</tech>
<tech>android.nfc.tech.Ndef</tech>
<tech>android.nfc.tech.NdefFormatable</tech>
<tech>android.nfc.tech.MifareClassic</tech>
<tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>

好吧,配置完成后,我的 NfcTestActivity 似乎应该能够接收 NFC Intents。这就是我实现它的方式:

public class NfcTestActivity  extends Activity {

final String TAG = NfcTestActivity.class.getSimpleName();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i(TAG, "IntentAction (onCreate): " + getIntent().getAction());
NfcManager manager = (NfcManager) getSystemService(Context.NFC_SERVICE);
NfcAdapter adapter = manager.getDefaultAdapter();
if (adapter != null && adapter.isEnabled()) {
Log.i(TAG, "NFC adapter is enabled");
} else {
Log.i(TAG, "NFC adapter is disabled");
}
}

@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.i(TAG, "IntentAction (onNewIntent): " + getIntent().getAction());
}

@Override
public void onResume() {
super.onResume();
Log.i(TAG, "IntentAction (onResume): " + getIntent().getAction());
}

}

当我启动应用程序时,我得到以下日志:

05-28 10:41:52.044  31182-31182/com.mycompany.android I/NfcTestActivity? IntentAction (onCreate): android.intent.action.MAIN
05-28 10:41:52.054 31182-31182/com.mycompany.android I/NfcTestActivity? NFC adapter is enabled
05-28 10:41:52.054 31182-31182/com.mycompany.android I/NfcTestActivity? IntentAction (onResume): android.intent.action.MAIN

稍后,我读取了我的标签并显示了这个日志:

05-28 10:41:59.661  31182-31182/com.mycompany.android I/NfcTestActivity? IntentAction (onResume): android.intent.action.MAIN

这意味着 Activity#onResume如文档所述,读取标签时调用的方法,但是,我在这里得到的是 android.intent.action.MAIN而不是 NFC 一个( ACTION_NDEF_DISCOVEREDACTION_TECH_DISCOVEREDACTION_TAG_DISCOVERED )。

此外,作为线索,当我从我的 Activity 声明中删除这段代码时,在我读取标记时不会出现 onResume 日志:

<intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

所以看来 TAG_DISCOVERED 操作肯定是以某种方式启动的,而不是其他方式,但我无法从 Activity 中正确地捕获它。

有人知道吗?

最佳答案

经过一些头脑 Storm ,我意识到默认 android.nfc.action.TAG_DISCOVERED 而不是 android.nfc.action.NDEF_DISCOVERED 为我完成了工作:

 <intent-filter>
<action android:name="android.nfc.action.TAG_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>

当我的标签类型被 TECH_DISCOVERED 覆盖时,我仍然不知道为什么我应该使用 TAG_DISCOVERED,这更适合使用。无论如何,这就是我稍后用来获取标签 ID 的代码:

@Override
public void onResume() {
super.onResume();
Log.d(TAG, "onResume: action-"+getIntent().getAction());
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(getIntent().getAction())) {
Tag tag = getIntent().getParcelableExtra(NfcAdapter.EXTRA_TAG);
String tagId = bytesToHexString(tag.getId());
Log.i(TAG, "NFC tag: " + tagId);
}
}

另请参阅:

关于android - 未针对 NFC Intent 显示正确的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23906818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com