阅读NFC标签包含Android Play应用的内容

时间:2014-11-08 13:22:38

标签: android android-intent nfc

我的标签包含Android Play应用的内容。当手机接近时,它会默认在Android Play商店中打开应用页面。 现在我想做的是写一个应用程序可以阅读这个标签。所以我修改AndroidManifest.xml如下:

<uses-permission android:name="android.permission.NFC" />
......
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <action android:name="android.nfc.action.NDEF_DISCOVERED" />
            <category android:name="android.intent.category.DEFAULT" />
            <data
                android:host="ext"
                android:pathPrefix="/android.com:pkg"
                android:scheme="vnd.android.nfc" />
        </intent-filter>
......

我使用另一个标记应用来阅读此标记,其内容如下:

NDEF message
EXTERNAL: urn:nfc:ext:android.com:pkg
com.example.app

我认为关键点是意图过滤器。但是当我接近这个标签时,我不能在App上吃午饭。无论我的应用程序是在后台还是前台。有人能帮帮我吗?感谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案。我让这个APP在前台运行时误解了前景的含义。它必须添加enableForegroundDispatch,如下所示:

private NfcAdapter nfcAdapter;
private PendingIntent mPendingIntent;
private IntentFilter[] mFilters;
private String[][] mTechLists;

protected void onCreate(Bundle savedInstanceState)
    nfcAdapter = NfcAdapter.getDefaultAdapter(this);
    mPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
    IntentFilter ndefPkg = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
    try {
        ndefPkg.addDataScheme("vnd.android.nfc");
        ndefPkg.addDataAuthority("ext", null);
        ndefPkg.addDataPath("/android.com:pkg", 0);
    } catch (Exception e) {
        e.printStackTrace();
    }
    mFilters = new IntentFilter[] {ndefPkg;
    mTechLists = new String[][] { new String[] { NfcF.class.getName() } };
}

protected void onResume() {
    super.onResume();
    nfcAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);
}

protected void onPause() {
    super.onPause();
    nfcAdapter.disableForegroundDispatch(this);
}