gpt4 book ai didi

android - 在 Android 中读取多个 NFC 标签。 IsoDep-tag 在屏幕解锁时无法读取

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:50 28 4
gpt4 key购买 nike

我一直在尝试创建一个可以读取两种不同类型的 NFC 标签的应用程序。一个应该是 HCE-IsoDep,在 Nexus 5 上模拟,一个是 Ndef-tag。但是我遇到了一个小问题:

我设法阅读了两种类型的标签,但不是我想要的方式。 Ndef 标签完全没有问题。当我尝试读取 HCE 标签时遇到了我的问题。我只能在手机开机时读取标签,我模拟标签被锁定(屏幕打开,但锁定已打开)。每当我解锁屏幕时,它都不会再进行交互,据我所知,它会尝试发送信号。

如果我尝试在没有 onNewIntent 的情况下执行此操作并直接转到 onTagDiscovered,它在 HCE 设备锁定和解锁时都有效,但随后我无法读取 Ndef 标签。在 logcat 中,当我在解锁时读取 HCE 标签时收到消息:NfcService LLCP 激活消息

锁定时,我收到消息:NativeNfcTag Connect to a tag with a different handle(在此之前我收到: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, 0, 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());
}
}

list :

<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 专家的提示。

最佳答案

在 Android 4.4 及更高版本上,您应该使用 enableReaderMode()为此。

在此模式下,NFC Controller 将仅充当 NFC 标签读取器/写入器,从而禁用此设备上 NFC 适配器的任何点对点 (Android Beam) 和卡模拟模式。

为了与使用 Android 的基于主机的卡片模拟在另一台 Android 设备上模拟的标签交互,推荐的标志是 FLAG_READER_NFC_A 和 FLAG_READER_SKIP_NDEF_CHECK。

关于android - 在 Android 中读取多个 NFC 标签。 IsoDep-tag 在屏幕解锁时无法读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20698336/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com