阅读受安卓设备保护的NTAG213

时间:2016-01-21 21:47:47

标签: android nfc android-4.4-kitkat

我正在设计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

0 个答案:

没有答案