android9怎样适配nfc,android – 如何使用NFC动作
我試圖以編程方式注冊接收器,以便在檢測到NFC標簽后收到通知.如我的代碼所示,我注冊了所需的操作,并以編程方式創建了廣播接收器.我還在清單文件中添加了所需的權限,但問題是從不調用onReceive.
請讓我知道我做錯了什么以及如何解決它.
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction("android.nfc.action.TAG_DISCOVERED");
registerReceiver(mBCR_TAG_DISCOVERED, intentFilter1);
private BroadcastReceiver mBCR_TAG_DISCOVERED = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
mTv.setText("mBCR_TAG_DISCOVERED");
}
};
AndroidManifest.xml中:
package="example.com.myapplication">
android:name="android.hardware.nfc"
android:required="true" />
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
解決方法:
意圖android.nfc.action.TAG_DISCOVERED,就像所有NFC意圖一樣,是一種活動意圖,而不是廣播意圖.根本不可能為它注冊廣播接收器.您可以做的是注冊活動以接收NFC意圖.這可以通過清單,NFC前臺調度系統或Android 4.4通過NFC閱讀器模式API完成.
1.清單
根據標簽上的數據,您要么注冊NDEF_DISCOVERED意圖(如果標簽上有NDEF結構化數據),要么注冊TECH_DISCOVERED意圖(如果您只想監聽某些標簽技術而不管數據是什么)標簽).您通常不希望注冊TAG_DISCOVERED意圖過濾器,因為當通過AndroidManifest.xml使用時,這僅僅意味著作為回退機制(捕獲未被任何其他應用程序處理的事件).
例如.如果您的標記包含URL http://www.example.com/,則可以使用以下intent過濾器:
...
如果您的標記不包含任何特定數據且可能是任何標記技術,則可以使用以下intent過濾器:
...
android:resource="@xml/nfc_tech_filter" />
要使此intent過濾器起作用,您還需要在應用程序的res /目錄中使用XML資源xml / nfc_tech_filter.xml.如果技術過濾器應該只匹配任何標記,那么該文件將包含:
android.nfc.tech.NfcA
android.nfc.tech.NfcB
android.nfc.tech.NfcF
android.nfc.tech.NfcV
android.nfc.tech.NfcBarcode
注冊您的活動以接收這些事件后,您可以通過onCreate()(如果您的活動由NFC事件啟動)或通過onNewIntent()(如果您的活動在打開時收到后續NFC意圖)在您的活動中收到這些意圖):
@Override
public void onCreate(Bundle savedInstanceState) {
[...]
Intent startIntent = getIntent();
if ((startIntent != null) &&
(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(startIntent.getAction()) ||
NfcAdapter.ACTION_TECH_DISCOVERED.equals(startIntent.getAction()))) {
// TODO: process intent
}
}
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction()) ||
NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
// TODO: process intent
}
}
2.前景調度系統
如果您只對在前臺可見活動時接收NFC發現意圖感興趣,最好使用NFC前臺調度系統,而不是通過清單注冊接收NFC事件.您可以通過在onResume()期間注冊您的活動來完成此操作:
@Override
public void onResume() {
super.onResume();
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
您還必須確保在onPause()期間取消注冊:
@Override
public void onPause() {
super.onPause();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);
}
然后,您將通過onNewIntent()以TAG_DISCOVERED意圖接收NFC事件:
@Override
public void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
// TODO: process intent
}
}
3. Reader Mode API
如果您只對檢測NFC標簽感興趣,并且只有當您的活動在前臺可見且您只需要定位Android 4.4時,最好的方法可能是使用NFC閱讀器模式API.您可以通過在onStart()期間注冊您的活動來完成此操作:
@Override
public void onStart() {
super.onStart();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(Tag tag) {
// TODO: use NFC tag
}
}, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B | NfcAdapter.FLAG_READER_NFC_F | NfcAdapter.FLAG_READER_NFC_V | NfcAdapter.FLAG_READER_NFC_BARCODE, null);
}
您還應確保在onStop()期間取消注冊:
@Override
public void onStop() {
super.onStop();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableReaderMode(this);
}
您通過onTagDiscovered(Tag標記)回調方法接收已發現的標記句柄.
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的android9怎样适配nfc,android – 如何使用NFC动作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android listview下拉动画
- 下一篇: android 个人理财系统,基于And