Android入門 データを読み込む


データを読む

前回やったようにセクタの情報を取ってくるには認証が必要となります。
買ってきたタグは普通default-keyと呼ばれる鍵が入っていてそれで読み書きできるように設定されています。
その鍵はわかっている鍵なのでそれを使ってタグの中の情報を読んでみましょう。
前回作ったプロジェクトのMainActivityの中身をこうします

package com.example.nfc;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.nfc.tech.MifareClassic;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        Intent intent = getIntent();
        byte[] tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
       
        int sector = 0;
        if(tag!=null)
        {
            Log.i("nfc","nfc tagid="+stringFromBytes(tagid));
            MifareClassic mfc = MifareClassic.get(tag);
            try {
                if(!mfc.isConnected())mfc.connect();
                if(mfc.authenticateSectorWithKeyA(sector,MifareClassic.KEY_DEFAULT)){
                    byte[] Block0 = mfc.readBlock(0);
                    String Block0String = stringFromBytes(Block0);
                    Log.i("nfc","nfc Block0="+Block0String);
                }else{
                    Log.i("nfc","nfc auth fail");
                }
                mfc.close();
            }catch (Exception e)
            {
                 Log.i("nfc","nfc connection fail");
            }finally{

            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
   
    public String stringFromBytes(byte[] bytes) {
        StringBuilder buffer = new StringBuilder();
        for (byte b : bytes) {
            String hex = String.format("%02X", b);
            buffer.append(hex);
        }

        String text = buffer.toString().trim();
        return text;
    }

}

前回作ったプロジェクトのMainActivityの中身をこうします
そしてタグにあててタグからこのアプリを起動しましょう。するとLogCatにこういうのが出るはず



これが出たら成功です。

では、ソースを追ってみましょう。
        Intent intent = getIntent();
        byte[] tagid = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        Tag tag = (Tag)intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
この部分がタグへアクセスするためのオブジェクト取得の部分です。
タグからアプリを起動した場合、インテントのエクストラの中にタグの情報が入っています。
上がタグidで、下がタグそのものです。で、
        mfc.authenticateSectorWithKeyA(sector,MifareClassic.KEY_DEFAULT)
この部分で認証しています。sectorはセクタ番号。今回は0です。そこへMifareClassic.KEY_DEFAULTという鍵でKeyAとして認証
しています。
これが成功したらif文が通ってその中が実行されます。
そして、実際のデータの読み込みは
byte[] Block0 = mfc.readBlock(0);
この部分ですね。
注意しなきゃいけないのがreadBlock(0)の0はセクタの中の位置じゃなくて全体の中の位置となります。
つまりセクタ0のブロック0は0ですがセクタ1のブロック0は4になるってことです。
当然認証していないブロックの読み込みはエラーとなります。
今回はセクタ0のブロック0を読んでみました。ここにはタグIdなんかが格納されています。
だから頭のほうはtagidと一致してD20537C4でしょ?
これで読み込みは完了ですね。
次に書き込みをしてみましょうか。
 

ホームへ