大佬教程收集整理的这篇文章主要介绍了在Android中阅读多个NFC标签.当屏幕解锁时,IsoDep-tag不会读取,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我设法读取两种类型的标签,但不是我想要的方式. Ndef标签完全没问题.当我尝试阅读我遇到问题的HCE标签时.我只能在手机打开时读取标签,我模拟标签打开(屏幕打开,但锁定打开).每当我解锁屏幕时,它就不会再进行交互了,据我所知,它试图反射.
如果我尝试在没有onNewIntent的情况下直接进入onTagDiscovered,它可以在HCE设备被锁定和解锁的同时工作,但是我无法读取Ndef标签.
在logcat中,当我解锁时读取HCE标签时,我收到消息:Nfcservice LLCP激活消息.
锁定时,我收到消息:NativeNfcTag连接到具有不同句柄的标记(在此之前我得到:audio_hw_priMary SELEct_devices:out_snd_device(2:speaker)in_snd_device(0 :))
我的代码如下:
主要:
public class NfcReader extends Activity implements OnmessageReceived { private static String TAG = NfcReader.class.getSimplename(); private Button sendButton; private ProgressBar callProgress; private NfcAdapter nfcAdapter; private PendingIntent pIntent; privatE intentFilter[] writeTagFilters; private String[][] mTechLists; @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); setContentView(R.layout.activity_main); TextView dateView = (TextView) findViewById(R.id.dateTextView); nfcAdapter = NfcAdapter.getDefaultAdapter(this); pIntent = PendingIntent.getActivity(this,new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOp),0); IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED); writeTagFilters = new IntentFilter[] { tagDetected }; mTechLists = new String[][] {new String[] { Ndef.class.getName(),IsoDep.class.getName() }}; } @Override protected void onPause() { super.onPause(); disableForegroundMode(); } @Override protected void onResume() { super.onResume(); enableForegroundMode(); } public void enableForegroundMode() { Log.d(tag,"onResume"); nfcAdapter.enableForegroundDispatch(this,pIntent,writeTagFilters,mTechLists); } public void disableForegroundMode() { Log.d(tag,"onPause"); nfcAdapter.disableForegroundDispatch(this); } @Override public void onNewIntent(Intent intent) { Log.d(tag,"onNewIntent"); if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())){ Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); Ndef nDef = Ndef.get(tag); if (nDef != null) { onNdefDiscovered(tag); } else { onTagDiscovered(tag); } } } public void onNdefDiscovered(tag tag) { Log.d(tag,"Ndef found"); new ReadTag().execute(tag); } public void onTagDiscovered(tag tag) { Log.d(tag,"HCEfound"); IsoDep isoDep = IsoDep.get(tag); IsoDepTransceiver transceiver = new IsoDepTransceiver(isoDep,this); transceiver.run(); } @Override public void onmessage(final byte[] messagE) { runOnUiThread(new Runnable() { @Override public void run() { String readFromHce = new String(messagE); TextView result = (TextView) findViewById(R.id.refTextView); result.setText(readFromHcE); } }); } @Override public void onError(Exception exception) { onmessage(exception.getmessage().getBytes()); } }
表现:
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.NFC" /> <uses-feature android:name="android.hardware.nfc" android:required="true" /> <application android:allowBACkup="true" android:icon="@drawable/ic_launcher" android:label="@String/app_name" > <activity android:name=".HceReader" 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"/> <action android:name="android.nfc.action.TECH_DISCOVERED"/> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <Meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/filter_nfc"/>
filter_nfc.xml
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> </tech-list> <tech-list> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
有谁知道我做错了什么?我在没有找到解决方案的情况下搜索了很多.
再说一遍.我可以毫无问题地阅读Ndef标签.当HCE设备上的屏幕被锁定时,我只能读取已验证的IsoDep标签.
感谢任何帮助
问候
编辑:以下代码正在运行
public class NfcReader extends Activity implements OnmessageReceived,ReaderCallBACk { private static String TAG = NfcReader.class.getSimplename(); private NfcAdapter nfcAdapter; @Override protected void onCreate(Bundle savedInstanceStatE) { super.onCreate(savedInstanceStatE); setContentView(R.layout.activity_main); TextView result = (TextView) findViewById(R.id.refTextView); nfcAdapter = NfcAdapter.getDefaultAdapter(this); } @Override protected void onPause() { super.onPause(); nfcAdapter.disableReaderMode(this); } @Override protected void onResume() { super.onResume(); nfcAdapter.enableReaderMode(this,this,NfcAdapter.FLAG_READER_NFC_A,null); } public void onTagDiscovered(tag tag) { Log.d(tag,"Tag Found"); Ndef nDef = Ndef.get(tag); IsoDep isoDep = IsoDep.get(tag); if (nDef != null) { new ReadTag().execute(tag); } else if (isoDep != null){ IsoDepTransceiver transceiver = new IsoDepTransceiver(isoDep,this); transceiver.run(); } } @Override public void onmessage(final byte[] messagE) { runOnUiThread(new Runnable() { @Override public void run() { String readFromHce = new String(messagE); TextView result = (TextView) findViewById(R.id.refTextView); result.setText(readFromHcE); } }); } @Override public void onError(Exception exception) { onmessage(exception.getmessage().getBytes()); } }
非常感谢NFC人员提示.
在此模式下,NFC控制器将仅充当NFC标签读取器/写入器,从而禁用此设备上的NFC适配器的任何对等(Android Beam)和卡仿真模式.
要使用Android的基于主机的卡仿真与在其他Android设备上模拟的标签进行交互,建议的标志为FLAG_READER_NFC_A和FLAG_READER_SKIP_NDEF_checK.
以上是大佬教程为你收集整理的在Android中阅读多个NFC标签.当屏幕解锁时,IsoDep-tag不会读取全部内容,希望文章能够帮你解决在Android中阅读多个NFC标签.当屏幕解锁时,IsoDep-tag不会读取所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。