連載
» 2012年11月27日 18時00分 UPDATE

Androidで動く携帯Javaアプリ作成入門(38):AndroidアプリでNFCタグを読み書きするための基礎知識 (1/3)

Android のAPIを使ってSuica/Edy/運転免許証などのIDmを読む方法、NFCタグに情報を読み書きする方法について解説します

[緒方聡,イーフロー]

実用段階に入った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タグを使用するために

 アプリで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タグの種類をフィルタとして設定します。

NFCに関するアクション

 アクションは以下の通り、優先順位があります。

  • android.nfc.action.ACTION_NDEF_DISCOVERED

 読み込んだタグがNDEF(NFC Data Exchange Format)ペイロードを持つ場合、このアクションが定義されたアクティビティにIntentが通知されます。優先順位としては一番高く、トリガとなるタグは複数登録するのではなく単一にするのが望ましいです。このアクションでアクティビティが起動した場合、ACTION_TECH_DISCOVEREDまたはACTION_TAG_DISCOVEREDで登録されているアクティビティがあっても、起動されることはありません。

  • android.nfc.action.ACTION_TECH_DISCOVERED

 ACTION_TAG_DISCOVEREDよりも優先順位が高いアクションです。このアクションでアクティビティが起動した場合、ACTION_TAG_DISCOVEREDのアクティビティは起動しません。フィルタで定義したすべてのタグのand条件で起動します。

  • android.nfc.action.ACTION_TAG_DISCOVERED

 最も優先順位が低いアクション。フィルタで定義したすべてのタグのor条件で起動します。

NFCのフィルタ

 フィルタは以下のように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設定画面でONにしないと使えない

 なお、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));
android_dev38_1.jpg
       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。