Android:如何使用当前应用阅读NFC标签

时间:2014-09-01 16:59:28

标签: android nfc

我正在编写一个需要阅读NFC标签的应用。而不是通过意图过滤器阅读标签打开新应用程序的行为,我希望我当前打开的应用程序只是阅读附近的标签。

我曾尝试使用enableForegroundDispatch()但没有运气。只要有NFC标签,我的设备就会打开标准的“标签”应用程序。

我到目前为止的代码是:

final Intent intent = new Intent(activity.getApplicationContext(), activity.getClass());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
final PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), 0, intent, 0);
IntentFilter[] filters = new IntentFilter[1];
String[][] techList = new String[][]{};
filters[0] = new IntentFilter();
filters[0].addAction(NfcAdapter.ACTION_NDEF_DISCOVERED);
filters[0].addCategory(Intent.CATEGORY_DEFAULT);
try {
    filters[0].addDataType(MIME_TEXT_PLAIN);
} catch (MalformedMimeTypeException e) {
    throw new RuntimeException("Check your mime type.");
}
adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);

(这基本上是从我找到的教程中复制过来的。)

有谁知道这是否是正确的解决方法? 如何防止标准“标签”应用程序打开而不是我自己的应用程序接收NDEF_DISCOVERED意图。

由于

2 个答案:

答案 0 :(得分:7)

首先,你必须获得nfc的AndroidMenifest.xml文件的权限。权限是:

<uses-permission android:name="android.permission.NFC" />

<uses-feature android:name="android.hardware.nfc" />

将执行Nfc读/写操作的Activity,在menifest.xml文件中的该活动中添加此intent过滤器:

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

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

在您的活动onCreate()方法中,您必须初始化NFC适配器并定义Pending Intent:

NfcAdapter mAdapter;
PendingIntent mPendingIntent;
mAdapter = NfcAdapter.getDefaultAdapter(this);   
if (mAdapter == null) {
    //nfc not support your device.
    return;
}
mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,
        getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);

在onResume()中回调启用Foreground Dispatch以检测NFC意图。

mAdapter.enableForegroundDispatch(this, mPendingIntent, null, null);

在onPause()回调中,您必须禁用forground dispatch:

if (mAdapter != null) {
    mAdapter.disableForegroundDispatch(this);
}

在onNewIntent()回调方法中,您将获得新的Nfc Intent。获得The Intent后,您必须解析检测卡的意图:

    @Override
protected void onNewIntent(Intent intent){    
    getTagInfo(intent)
     }
private void getTagInfo(Intent intent) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}

现在你有了标签。然后,您可以检查Tag Tech列表以检测该Tag。标签检测技术在My Another Answer 完整项目位于My GitHub Repo

答案 1 :(得分:0)

您的代码当前注册前台调度系统仅在包含NDEF文本记录(或&#34; text / plain&#34; MIME类型记录)的NFC标签时触发。因此,如果您的标记不包含此类记录,则NFC发现事件将传递给其他应用程序(或者在您的情况下由标准标记应用程序处理)。

因此,您可能希望为适合您标记的意图注册前台调度系统:

IntentFilter[] filters = new IntentFilter[1];
filters[0] = new IntentFilter();
filters[0].addAction(NfcAdapter.ACTION_TECH_DISCOVERED);
filters[0].addCategory(Intent.CATEGORY_DEFAULT);
String[][] techList = new String[][]{ new String[] { NfcA.class.getName() } };
adapter.enableForegroundDispatch(activity, pendingIntent, filters, techList);

或者您可以注册以触发任何标记:

adapter.enableForegroundDispatch(activity, pendingIntent, null, null);