0

ここでは、NFC タグのレコードを読み取る android アプリを開発しています。これは、タグを読み取るための私のプログラムのコードの一部です。読み取り時に、範囲外の例外が発生します。

NdefMessage[] msgs = null;
    String action = intent.getAction();
    if(NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)||
            NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)){
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if(rawMsgs != null){
            msgs = new NdefMessage[rawMsgs.length];
            for(int i=0; i<rawMsgs.length; i++){
                msgs[i] = (NdefMessage) rawMsgs[i];
            }
        }else{
            byte[] empty = new byte[]{};
            NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
            msgs = new NdefMessage[]{msg};
        }

    }
    if(msgs==null){
        String[] array = new String[]{"No Tag discovered!"};
        return array;
    }else{
        String[] array = new String[]{new String(msgs[0].getRecords()[0].getPayload()), 
                                        new String(msgs[1].getRecords()[0].getPayload())
        };
        return array;
    }

タグ内のレコード

この「new String( msgs 1 .getRecords()[0].getPayload())」という文を非表示にすると、プログラムがスムーズに実行されるので、プログラムがこの行にあることは間違いありません。どうすれば問題を解決できますか?

4

1 に答える 1

1

はい、問題はこの行で確実です

new String[]{new String(msgs[0].getRecords()[0].getPayload()), 
                                            new String(msgs[1].getRecords([0].getPayload())

msgs[1].getRecords上記の行でアクセスしようとしているためです。しかし、コードが表示された場合、次のような状態で

else{
            byte[] empty = new byte[]{};
            NdefRecord record = new NdefRecord(NdefRecord.TNF_UNKNOWN, empty, empty, empty);
            NdefMessage msg = new NdefMessage(new NdefRecord[]{record});
            msgs = new NdefMessage[]{msg};
        }

msgs 配列には要素が 1 つしか含まれていませんが、存在しない 2 番目の要素にアクセスしようとしています。そのため、配列にアクセスする前に、コードを変更して条件を適用してください。

于 2012-07-17T08:52:02.137 に答える