まだアンドロイド開発に慣れきっていない。修行中のそんちょーです。
最近NFCタグを使ったアプリを作っていて、アプリ内でNFCタグを読み込む方法の記事はあっても、
ホーム画面とかで特定のNFCタグを読み込んだ際に開発したアプリを起動し、
その読み込んだNFCの情報をアプリ内で受け取る方法がなかなか見つからなかったので残しておきます。
言語はKotlinです。
アプリ内でのNFCの読み書きの方法を知りたい方は、ここのサイト様がめちゃくちゃ丁寧でわかりやすかったので先にそちらを参考にどうぞ。
AndroidManifest
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<?xml version="1.0" encoding="utf-8"?/> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.hellokotolin2"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"/> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/customHere" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.NFC" /> </manifest> |
見てもらいたいのは17-21行目のintent-filterです。
1 2 3 4 5 |
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/customHere" /> </intent-filter> |
intent-filterに指定した条件に引っかかったときに特定のアクティビティが呼び出されます。
上の例では、NDEFを発見した時かつ、NFCに設定されたmimeTypeがtext/customeHereだった時に呼び出されるようになっています。
mimeTypeを指定しないでいると、あらゆるNFCを読み込んだ時に起動する迷惑なアプリが誕生します。
customeHeraの部分を編集して、自分のアプリで書き込んだNFCからしか起動しないようにしましょう。
NFCに特定のmimeTypeを書き込む。
次にNFCタグにmimeTypeを設定しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
fun writeNfc(intent:Intent){ val text ="write-test" if(NfcAdapter.ACTION_TECH_DISCOVERED==intent.action|| NfcAdapter.ACTION_NDEF_DISCOVERED==intent.action){ val tag=intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)?:return; val ndef=Ndef.get(tag)?:return if(ndef.isWritable){ //mimeTypeとテキストをバイト配列で渡す val record=NdefRecord(NdefRecord.TNF_MIME_MEDIA,"text/customHere".toByteArray(), byteArrayOf(),"customText".toByteArray()) val msg = NdefMessage(record); ndef.connect() ndef.writeNdefMessage(msg) ndef.close() } } } |
この関数を呼べばいいだけです。
11行目のNdefRecord関数の二つ目の引数に自分の設定したいmimeTypeをbyte配列で渡してください。
onCreateからだとintentにNFCタグの情報がまだ埋め込まれてないのでボタンからでも呼び出しましょう。
NFCでアプリを起動してデータを読む
1 2 3 4 5 6 7 8 9 10 11 |
override fun onResume() { // タグのIDを取得 val tagId : ByteArray =intent.getByteArrayExtra(NfcAdapter.EXTRA_ID) ?: return var list = ArrayList<String>() for(byte in tagId) { list.add(String.format("%02X", byte.toInt() and 0xFF)) } Lod.d("NFC Id",list.joinToString(":")) } |
上の例ではNFCのIDを取得してログに出力してます。
onResume内でintentからデータを取得すればいいだけです。
どうやらonCreate内のintentからでは取得できない様子なのでonResumeを使いましょう。
ここのブロックのコードの8割はこちらから使わせていただきました。