こんにちは。ニノです。
今回は「NFCタグ」を使ってAndroidアプリを作っていきます。
NFCタグとは
まず、「NFC(Near Field Communication)」とは近距離無線通信規格の一種です。
データの送受信や機器の認証に使われます。
身近なものとしては、スマホに搭載されている おサイフケータイなどの電子マネー、
SuicaやPASMOなどのICカードにも使われています。
(正確には日本で使われているものは「FeliCa」というソニーが開発した技術であり、NFCの中の規格の一つです。
国際標準規格のNFCに対して日本だけ独自規格になっているため、海外製SIMフリースマホの多くでは
NFCを搭載していてもこれらの電子マネーは使えなかったり…)
次に「NFCタグ」についてですが
NFCタグの外観は、以下のような小さなシールみたいな感じです。こちらのサイズは500円玉ほどの大きさで、
10枚入りが1000円以内で手に入ります。
このNFCタグをどのように使うのかと言いますと、NFCに対応したスマホをかざして、データを書き込んだり、
読み取ったりすることができます。
NFCタグで何ができる?
NFCタグにスマホをかざすだけでデータを読み書きできることを活かして、スマホの操作を自動化することができます。
例えば、事前に固有のアクションを書き込んでおくことで、NFCタグにスマホをかざすだけで
- 家に帰ったときにWiFiに接続したり
- いつも買っている日用品の購入サイトを開いたり
- 寝る前にサクッとアラームを設定したり
- 車に乗ったときにマップアプリを起動してBluetoothをONにしたり
- スマートリモコンと連携して、家電を操作したり
などなど、応用すれば、色々な場所に貼ってちょっとした面白いことができそうです。
ID情報を読み取るAndroidアプリをKotlinで作成
手始めに、NFCタグのID情報を読み取る基本的なAndroidアプリを作りたいと思います。
開発環境は「Android Studio」、言語は「Kotlin」を選びました。
まずは「AndroidManifest.xml」にNFCを扱う権限を追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.nfcsample1">
<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>
</activity>
</application>
<!-- 【追加】NFCの権限 -->
<uses-permission android:name="android.permission.NFC" />
</manifest>
|
次に「MainActivity.kt」になります。
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
package com.example.nfcsample1
import android.app.PendingIntent
import android.nfc.NfcAdapter
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.content.Intent
import android.content.IntentFilter
import android.widget.TextView
class MainActivity : AppCompatActivity() {
private var mNfcAdapter: NfcAdapter? = null
private var pendingIntent: PendingIntent? = null
private var intentFilters: Array<IntentFilter>? = null
private var techLists: Array<Array<String>>? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
pendingIntent = PendingIntent.getActivity(this, 0, intent, 0)
// 受け取るIntentを指定
intentFilters = arrayOf(IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED))
// 反応するタグの種類を指定
techLists = arrayOf(
arrayOf(android.nfc.tech.Ndef::class.java.name),
arrayOf(android.nfc.tech.NdefFormatable::class.java.name))
mNfcAdapter = NfcAdapter.getDefaultAdapter(applicationContext)
}
override fun onResume() {
super.onResume()
// NFCタグの検出を有効化
mNfcAdapter?.enableForegroundDispatch(this, pendingIntent, intentFilters, techLists)
}
/**
* NFCタグの検出時に呼ばれる
*/
override fun onNewIntent(intent: Intent) {
// タグの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))
}
// 画面に表示
var tagTextView: TextView = findViewById(R.id.tagText)
tagTextView.text = list.joinToString(":")
}
override fun onPause() {
super.onPause()
mNfcAdapter?.disableForegroundDispatch(this)
}
}
|
起動時に呼ばれるonCreateメソッドでIntentに必要な情報を設定し、onResumeメソッドでNFCタグの検出を有効化。
あとは、NFCタグを検出するたびにonNewIntentメソッドが呼び出されます。
onNewIntentメソッドでは、NFCタグのID情報をbyte配列で取得、それを16進数に整形し、
画面に定義されたTextViewに表示しています。
実際にNFCタグにAndroidスマホをかざすと、このように画面にID情報が表示されます。
次回はデータの読み書きをやってみようと思います。