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标记)回调方法接收已发现的标记句柄.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值