NFC通信の読み取りサンプル

■まず、NFC通信で読み取りができないか試す。
はじめ Android Developers のウェブサイトのサンプルをもとに読み取りのコードを試そうと思ったけど、その中で使用されている CreateNdefMessageCallback は、APIレベル29で既に廃止されており、そのまま使用ではできなかった。作成時のAPIレベルを落とせば使用できるのかな。最近スマホを機種変更し、Android 13 (APIレベル33)になったので、なるべくそれで使えるものを探す。

ネット上からサンプルを探して、下の読み取りのコードを試した。

package com.example.sampleproject012_nfc;

import androidx.appcompat.app.AppCompatActivity;

import android.app.PendingIntent;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.nfc.Tag;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    NfcAdapter nfcAdapter_;
    PendingIntent pendingIntent_;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        nfcAdapter_ = NfcAdapter.getDefaultAdapter(this);
        pendingIntent_ = PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), PendingIntent.FLAG_MUTABLE);
    }

    @Override
    protected void onResume() {
        super.onResume();
        assert nfcAdapter_ != null;
        nfcAdapter_.enableForegroundDispatch(this, pendingIntent_, null, null);
    }

    protected void onPause() {
        super.onPause();
        if (nfcAdapter_ != null) {
            nfcAdapter_.disableForegroundDispatch(this);
        }
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        resolveIntent(intent);
    }

    private void resolveIntent(Intent intent) {
        String action = intent.getAction();
        if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
                || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) {
            Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            assert tag != null;
            TextView tv = findViewById(R.id.tv1);
            tv.setText(tag.toString());
        }
    }
}

このコードをAndroid Stuidoのデバッグで実機に対して実行すると、実機上で次の画面が表示される。

ここに、Suicaのカードをスマホにかざすとポコンという音とともに文字列が変更される。

とりあえず読み取ることはこれでできたようなので、次はデータについて見ていく。また、クレジットカードとかも同じ動作になったので、他のカードも試してみたい。