我正在设计Android应用以阅读受保护的ntag213标签。我是标签的拥有者。 我已经在pwd之前写过并正确地打包了一个阅读器。
我可以使用Samsung Young 2,Android版本4.4.2阅读它。
当我尝试使用三星Galaxy SIII Neo Android 4.4阅读时,我有一个例外,使用相同的代码发送PWD命令并阅读答案。
当我使用某些应用程序阅读此标签时,作为TagInfo或带有Samsung Galaxy SIII Neo的NFCTools,该标签被识别为ntag203。使用Samsung Young Galaxy 2我没有遇到这个问题,该应用程序认为没问题。 发生了什么?怎么了?
我使用OnePlus One移动设备测试过并且无法正常工作,我也有读取异常。
先谢谢。
的Jaime
这是Exception消息和堆栈:
java.io.IOException: Transceive failed
和stacktrace:
{java.lang.StackTraceElement[18]@830038119016}
0 = {java.lang.StackTraceElement@830038119112} "android.nfc.TransceiveResult.getResponseOrThrow(TransceiveResult.java:52)"
1 = {java.lang.StackTraceElement@830038119440} "android.nfc.tech.BasicTagTechnology.transceive(BasicTagTechnology.java:151)"
2 = {java.lang.StackTraceElement@830038119776} "android.nfc.tech.NfcA.transceive(NfcA.java:120)"
3 = {java.lang.StackTraceElement@830038120048} "com.appname.MainActivity.onNewIntent(MainActivity.java:259)"
4 = {java.lang.StackTraceElement@830038120360} "android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1167)"
5 = {java.lang.StackTraceElement@830038061384} "android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2455)"
6 = {java.lang.StackTraceElement@830038061704} "android.app.ActivityThread.performNewIntents(ActivityThread.java:2468)"
7 = {java.lang.StackTraceElement@830038062024} "android.app.ActivityThread.handleNewIntent(ActivityThread.java:2477)"
8 = {java.lang.StackTraceElement@830038062344} "android.app.ActivityThread.access$1700(ActivityThread.java:169)"
9 = {java.lang.StackTraceElement@830038062608} "android.app.ActivityThread$H.handleMessage(ActivityThread.java:1348)"
10 = {java.lang.StackTraceElement@830038062928} "android.os.Handler.dispatchMessage(Handler.java:102)"
11 = {java.lang.StackTraceElement@830038063216} "android.os.Looper.loop(Looper.java:136)"
12 = {java.lang.StackTraceElement@830038063480} "android.app.ActivityThread.main(ActivityThread.java:5476)"
13 = {java.lang.StackTraceElement@830038063776} "java.lang.reflect.Method.invokeNative(Native Method)"
14 = {java.lang.StackTraceElement@830038064072} "java.lang.reflect.Method.invoke(Method.java:515)"
15 = {java.lang.StackTraceElement@830038064352} "com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)"
16 = {java.lang.StackTraceElement@830038064696} "com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)"
17 = {java.lang.StackTraceElement@830046325096} "dalvik.system.NativeStart.main(Native Method)"
代码:
public class MainActivity extends Activity {
private static final String TAG = "appname MainActivity";
byte[] pwd_NTAG213 = new byte[]{(byte) 0x01, (byte) 0x01, (byte) 0x01, (byte) 0x01};
byte[] pack_NTAG213 = new byte[]{(byte) 0x01, (byte) 0x01};
private NfcAdapter mNfcAdapter;
PendingIntent pendingIntent;
byte[] UID = new byte[8];
byte[][] Buf = new byte[3][16];
byte [] DeviceUID =new byte[16];
public static MainActivity myActivity;
static boolean isActive = false;
static boolean scanTag =false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(layout.activity_main);
myActivity =this;
mNfcAdapter = NfcAdapter.getDefaultAdapter(this);
if (mNfcAdapter == null) {
// Stop here, we definitely need NFC
Toast.makeText(this, "No NFC", Toast.LENGTH_LONG).show();
finish();
return;
}
if (!mNfcAdapter.isEnabled()) {
askUserToOpenNFC();
return;
}
Intent intent = new Intent(this,getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
}
@Override
public void onStart() {
super.onStart();
isActive = true;
}
@Override
public void onStop() {
super.onStop();
isActive = false;
}
@Override
public void onResume(){
super.onResume();
WriteModeOn();
}
public void onPause(){
super.onPause();
WriteModeOff();
}
@SuppressLint("NewApi") private void WriteModeOn(){
final Intent intent = new Intent(this.getApplicationContext(), this.getClass());
final PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 0, intent, 0);
String[][] techList = new String[1][1];
techList[0][0] = "android.nfc.tech.NfcA";
IntentFilter[] filters = new IntentFilter[2];
filters[0] = new IntentFilter();
filters[0].addAction(NfcAdapter.ACTION_TECH_DISCOVERED);
filters[0].addCategory(Intent.CATEGORY_DEFAULT);
filters[1] = new IntentFilter();
filters[1].addAction(NfcAdapter.ACTION_TAG_DISCOVERED);
filters[1].addCategory(Intent.CATEGORY_DEFAULT);
if (mNfcAdapter != null) {
mNfcAdapter.enableForegroundDispatch(this, pendingIntent, filters, techList);
}
}
@SuppressLint("NewApi") private void WriteModeOff(){
mNfcAdapter.disableForegroundDispatch(this);
}
@SuppressLint("NewApi") protected void onNewIntent(Intent intent){
NfcA nfca;
String action = intent.getAction();
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
String device_unique_id = Settings.Secure.getString(this.getContentResolver(),
Settings.Secure.ANDROID_ID);
Toast toast = new Toast(getApplicationContext());
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout,
(ViewGroup) findViewById(id.lytLayout));
TextView txtMsg = (TextView)layout.findViewById(id.txtMensaje);
toast.setDuration(Toast.LENGTH_SHORT);
toast.setView(layout);
if (!scanTag)
return ;
scanTag = false;
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)){
nfca = NfcA.get(tag);
UID = tag.getId();
try {
nfca.connect();
if (!nfca.isConnected()) {
return;
}
//··················································································PassWord +PACK
Log.i(TAG, "NTaG213: Password + PACK");
byte[] BufTmp = new byte[16];
BufTmp = nfca.transceive(new byte[]{(byte) 0x1B,pwd_NTAG213[0],pwd_NTAG213[1], pwd_NTAG213[2], pwd_NTAG213[3]}); /* <----Error here */
if (!Arrays.equals(BufTmp, pack_NTAG213)) {
txtMsg.setText("No read NTAG213");
toast.show();
return;
}
//..................................................................................Lectura del NTAG213
Log.i(TAG, "NTaG213: Read NTAG213");
Buf[0] = nfca.transceive(new byte[]{(byte) 0x30, 28});
Buf[1] = nfca.transceive(new byte[]{(byte) 0x30, 32});
Buf[2] = nfca.transceive(new byte[]{(byte) 0x30, 36});
txtMsg.setText("Read OK!!!");
toast.show();
return;
} catch (IOException Failure) {
Failure.printStackTrace();
txtMsg.setText("Read Error!!!");
toast.show();
return;
}
}
}
我用其他设备测试过。他们读了OK NTAG213标签
三星Galaxy A5 Android v.5.0.2 SM-A500FU
LG-D722v Android v.4.4.2