Android のAPIを使ってSuica/Edy/運転免許証などのIDmを読む方法、NFCタグに情報を読み書きする方法について解説します
Androidはバージョン2.3からNFC(Near Field Communication:近距離無線通信)をサポートしています。Android 2.3は2010年12月発表なので、登場して約2年です。市場にもNFCをサポートしたスマートフォンが出回り、ユーザーの手にも行き渡り、そろそろ実用段階に入ったのではないでしょうか。
今回はAndroid NFCのAPIを使用してSuica/ICOCA/PASMO/Edy/運転免許証などのIDm(カード固有の番号)を読み込む方法、NFCタグへの情報の書き込み・読み出し方法について解説します。
NFCの基本的な情報は記事「NFCは次世代近距離通信のデファクトとなるか」を参照してください。
今回のサンプルアプリは以下の2つです。
アプリでNFCを使用するためには、AndroidManifest.xmlにいくつかの宣言が必要です。NfcDiscoverのAndroidManifest.xmlを例に説明します。
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.android.nfc.discover" android:versionCode="1" android:versionName="1.0" > <uses-feature android:name="android.hardware.nfc" android:required="true" /> 【1】 <uses-permission android:name="android.permission.NFC" />【2】 <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.android.nfc.discover.MainActivity" android:label="@string/app_name" android:permission="android.permission.NFC" > 【3】 <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> 【4】 <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <meta-data android:name="android.nfc.action.TAG_DISCOVERED" android:resource="@xml/nfc_filter" /> 【5】 </activity> </application> </manifest>
NFCを使用するには、【1】のような<uses-feature>と【2】のような<uses-permission>を宣言します(サンプルアプリNfcDiscoverでは、<uses-feature>や<uses-permission>を必要とするAPIは呼び出していないため、必要ありません。どのAPIが宣言が必要であるかはJavadocの各メソッドに記載されているため、開発の際にはそちらを参照してください)。
<activity>の【3】のパーミッション定義は、このアクティビティの起動元もNFCのパーミッションを保持していることを要求するものです。これは特に必要ではありませんが、Eclipseの警告をなくすために付けています。
<intent-filter>の【4】のアクションには、「"android.nfc.action.TAG_DISCOVERED"」のみをセットしています。これで、ランチャーにはアイコンは作成されず、NFCタグを読み込んだ場合にのみ起動します。【4】と【5】のアクションは合わせる必要があります。
<meta-data>の【5】には、起動するアクションと起動するトリガーとなるNFCタグの種類をフィルタとして設定します。
アクションは以下の通り、優先順位があります。
読み込んだタグがNDEF(NFC Data Exchange Format)ペイロードを持つ場合、このアクションが定義されたアクティビティにIntentが通知されます。優先順位としては一番高く、トリガとなるタグは複数登録するのではなく単一にするのが望ましいです。このアクションでアクティビティが起動した場合、ACTION_TECH_DISCOVEREDまたはACTION_TAG_DISCOVEREDで登録されているアクティビティがあっても、起動されることはありません。
ACTION_TAG_DISCOVEREDよりも優先順位が高いアクションです。このアクションでアクティビティが起動した場合、ACTION_TAG_DISCOVEREDのアクティビティは起動しません。フィルタで定義したすべてのタグのand条件で起動します。
最も優先順位が低いアクション。フィルタで定義したすべてのタグのor条件で起動します。
フィルタは以下のようにxmlを記載します。
<?xml version="1.0" encoding="utf-8"?> <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" > <tech-list> <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcBarcode</tech> <tech>android.nfc.tech.NfcF</tech> <tech>android.nfc.tech.NfcV</tech> </tech-list> </resources>
<tech>タグの中には、扱いたい種類のandroid.nfc.techパッケージのクラス名を記載します。
なお、NFCは設定でOFFになっていると使用できません。NFCはBluetoothやGPSのようにAPIからON/OFFを切り替えられないため、必要ならば以下の要領でNFC設定画面を開いてユーザーに変えてもらうとよいでしょう。
startActivity(new Intent(Settings.ACTION_AIRPLANE_MODE_SETTINGS)); // API Level 16以降の場合は以下 startActivity(new Intent(Settings.ACTION_NFC_SETTINGS));
Copyright © ITmedia, Inc. All Rights Reserved.