NFC の基本

このドキュメントでは、Android で行う基本的な NFC タスクについて説明します。ここでは、Google Chat のメッセージ送信、 NFC データを NDEF メッセージの形式で受信し、Android フレームワーク API について説明します。 利用できます。NDEF 以外のデータの操作方法など、より高度なトピックについては、 高度な NFC をご覧ください。

NDEF データと Android を使用する場合、主に次の 2 つの使用例があります。

NFC タグからの NDEF データの読み取りは、タグ ディスパッチによって処理されます。 システム: 検出された NFC タグを分析し、データを適切に分類して、 分類されたデータに関心のあるアプリケーションです。アプリケーションでこのアプリケーションの スキャンされた NFC タグでインテント フィルタを宣言し、 データを処理します

Android BeamTM 機能を使用すると、デバイスから NDEF メッセージを 2 台のデバイスを物理的にタップすることで、別のデバイスに接続できます。このインタラクションによって、 ワイヤレス技術(Bluetooth など)よりもデータ送信が高速 検出またはペア設定が必要です。2 台のデバイスが接続されると、接続が自動的に開始されます 範囲内にあります。Android ビームは NFC API のセットを介して利用できるため、どのアプリでも デバイス間で通信を行えます。たとえば、連絡先、ブラウザ、YouTube の各アプリケーションでは、 Android ビームにより、連絡先、ウェブページ、動画を他のデバイスと共有できます。

タグ ディスパッチ システム

Android デバイスは通常、画面が表示されたときに NFC タグを探します。 デバイスの [設定] メニューで NFC が無効になっていない限り、ロックが解除されます。 Android 搭載デバイスで NFC タグが検出されると、 ユーザーにどのアプリを尋ねることなく、最適なアクティビティにインテントを処理させるという方法もあります。 使用できます。デバイスは NFC タグを非常に短い距離でスキャンするため、ユーザーが手作業で NFC タグをスキャンし、 アクティビティを選択すると、強制的にデバイスがタグから離れ、接続が切断されます。 アクティビティで重要な NFC タグのみを処理するように開発する必要があります。 アクティビティ選択ツールが表示されないようにできます。

この目標を達成できるように、Android には、スキャンされたスキャンされたタグを分析する特別なタグ ディスパッチ システムが用意されています。 NFC タグや NFC タグを解析し、スキャンしたデータが必要なアプリケーションを特定します。これは、 これは次の方法で行います。

  1. NFC タグを解析して、データ ペイロードを識別する MIME タイプまたは URI を特定する あります。
  2. MIME タイプまたは URI、およびペイロードをインテントにカプセル化します。最初の 2 つは 手順については、NFC タグを MIME タイプと URI にマッピングする方法をご覧ください。
  3. インテントに基づいてアクティビティを開始します。詳しくは、 NFC タグがアプリにディスパッチされる方法

NFC タグが MIME タイプと URI にマッピングされる仕組み

NFC アプリケーションの作成を開始する前に、 NFC タグのタイプ、タグ ディスパッチ システムが NFC タグを解析する方法、タグが ディスパッチ システムは、NDEF メッセージを検出したときに実行します。NFC タグは、 データを書き込むことができます。 Android は、NFC フォーラムで定義されている NDEF 規格を最もサポートしています。

NDEF データは、1 つを含むメッセージ(NdefMessage)内にカプセル化されます。 件以上のレコード(NdefRecord 件)。各 NDEF レコードは、 作成するレコードのタイプの仕様です。Android また、NDEF データを含まない他のタイプのタグもサポートしています。これらのタグは、 android.nfc.tech パッケージ内のクラス。関連資料 詳しくは、高度な NFC に関するトピックをご覧ください。使用するタグのタイプは タグと通信するための独自のプロトコル スタックを記述するため、NDEF を使用することをおすすめします。 することで、Android 搭載デバイス向けの開発の容易さと最大限のサポートが実現しました。

注: NDEF の仕様全体をダウンロードするには、NFC フォーラムの仕様および申請ドキュメントのサイトにアクセスして、 作成方法の例: 一般的なタイプの NDEF レコードを作成する NDEF レコードを作成します。

NFC タグについて理解できたところで、以降のセクションでは Android は NDEF 形式のタグを処理します。Android 搭載デバイスで NDEF を含む NFC タグをスキャンしたとき フォーマット済みデータを処理する場合、メッセージを解析して、データの MIME タイプや、 URI です。そのために、システムは NdefMessage 内の最初の NdefRecord を読み取り、NDEF メッセージ全体の解釈方法を決定します(NDEF メッセージは 含まれている場合)。正しい形式の NDEF メッセージでは、最初の NdefRecord 次のフィールドがあります。

3 ビットの TNF(Type Name Format)
可変長タイプのフィールドの解釈方法を示します。有効な値は次のとおりです。 表 1 をご覧ください。
可変長タイプ
レコードのタイプを記述します。TNF_WELL_KNOWN を使用する場合は、次を使用します。 このフィールドでレコードタイプ定義(RTD)を指定します。有効な RTD 値は表 2 に記載されています。
可変長 ID
当該レコードの一意の識別子。このフィールドはあまり使用されませんが、 タグを一意に識別する必要がある場合は、タグの ID を作成できます。
可変長ペイロード
読み書きする実際のデータ ペイロード。NDEF メッセージには複数の NDEF レコードを含めることができるため、完全なペイロードが最初の NDEF にあるとは想定しない NDEF メッセージのレコードです。

タグ ディスパッチ システムは、TNF フィールドとタイプ フィールドを使用して、MIME タイプまたは URI を NDEF メッセージ。成功した場合は、その情報を実際のペイロードとともに ACTION_NDEF_DISCOVERED インテント内にカプセル化します。しかし、 タグ ディスパッチ システムが最初の NDEF に基づいてデータのタイプを判断できない 記録します。これは、NDEF データを MIME タイプまたは URI にマッピングできない場合、または そもそも NFC タグに NDEF データが含まれていません。その場合、タグのテクノロジーとペイロードに関する情報を含む Tag オブジェクトが使用されます。 ACTION_TECH_DISCOVERED インテント内にカプセル化されています。

表 1 は、タグ ディスパッチ システムが TNF とタイプをマッピングする方法を示しています。 MIME タイプまたは URI に変換できますまた、MIME タイプまたは URI にマッピングできない TNF についても説明します。 この場合、タグ ディスパッチ システムは ACTION_TECH_DISCOVERED

たとえば、タグ ディスパッチ システムは TNF_ABSOLUTE_URI 型のレコードを検出した場合、そのレコードの可変長型のフィールドをマッピングします。 URI に変換します。タグ ディスパッチ システムは、その URI を、タグに関するその他の情報とともに ACTION_NDEF_DISCOVERED インテントのデータ フィールドにカプセル化します。 保存できます。一方、TNF_UNKNOWN タイプのレコードが見つかると、タグのテクノロジーをカプセル化するインテントが作成されます。 してください。

表 1. サポートされている TNF とそのマッピング

Type Name Format(TNF) マッピング
TNF_ABSOLUTE_URI タイプ フィールドに基づく URI。
TNF_EMPTY ACTION_TECH_DISCOVERED にフォールバックします。
TNF_EXTERNAL_TYPE タイプ フィールドの URN に基づく URI。URN は、UDM の NDEF タイプ フィールドにエンコード 短縮形: <domain_name>:<service_name>。 Android は次の形式の URI にマッピングします。 vnd.android.nfc://ext/<domain_name>:<service_name>
TNF_MIME_MEDIA タイプ フィールドに基づく MIME タイプ。
TNF_UNCHANGED 最初のレコードは無効だったため、 ACTION_TECH_DISCOVERED
TNF_UNKNOWN ACTION_TECH_DISCOVERED にフォールバックします。
TNF_WELL_KNOWN MIME タイプまたは URI( type フィールド。詳細については、表 2 をご覧ください。 使用可能な RTD とそのマッピングです。

表 2. TNF_WELL_KNOWN でサポートされている RTD と マッピング

レコードタイプ定義(RTD) マッピング
RTD_ALTERNATIVE_CARRIER ACTION_TECH_DISCOVERED にフォールバックします。
RTD_HANDOVER_CARRIER ACTION_TECH_DISCOVERED にフォールバックします。
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED にフォールバックします。
RTD_HANDOVER_SELECT ACTION_TECH_DISCOVERED にフォールバックします。
RTD_SMART_POSTER ペイロードのパースに基づく URI。
RTD_TEXT text/plain の MIME タイプ。
RTD_URI ペイロードに基づく URI。

NFC タグがアプリケーションにディスパッチされる仕組み

タグ ディスパッチ システムが完了したら、NFC タグとそのタグをカプセル化するインテントを作成します。 インテントを受信して、関連するアプリケーションに インテントのフィルタを指定します。インテントを処理できるアプリが複数ある場合は、アクティビティ選択ツールが ユーザーがアクティビティを選択できるようにします。タグ ディスパッチ システムでは、 優先度の高い順に一覧表示されます。

  1. ACTION_NDEF_DISCOVERED: このインテントは、API 呼び出しを開始するために使用されます。 NDEF ペイロードを含むタグがスキャンされ、認識されたタイプである場合のアクティビティ。これは、 タグ ディスパッチ システムは、このインテントでアクティビティの開始を試みます。 他のインテントよりも優先する必要があります。
  2. ACTION_TECH_DISCOVERED: どのアクティビティも登録されない場合 ACTION_NDEF_DISCOVERED を処理する タグ ディスパッチ システムは、このインテントを使用してアプリの起動を試みます。この スキャンされたタグがスキャンされた場合、インテントが(最初に ACTION_NDEF_DISCOVERED を起動せずに)直接起動される MIME タイプまたは URI にマッピングできない NDEF データが含まれているか、タグに NDEF が含まれていない場合 既知のタグ技術です
  3. ACTION_TAG_DISCOVERED: このインテントが開始されました。 ACTION_NDEF_DISCOVERED または ACTION_TECH_DISCOVERED を処理するアクティビティがない場合 作成します。

タグ ディスパッチ システムの基本的な仕組みは次のとおりです。

  1. タグ ディスパッチ システムによって作成されたインテントでアクティビティを開始してみる NFC タグの解析時に渡されます。 ACTION_NDEF_DISCOVEREDACTION_TECH_DISCOVERED など)。
  2. そのインテントにアクティビティ フィルタがない場合は、次のアクティビティでアクティビティを開始してみます。 優先度が最も低いインテント(ACTION_TECH_DISCOVERED または ACTION_TAG_DISCOVERED)を、アプリがフィルタするまで タグ ディスパッチ システムが使用可能なすべてのインテントを試行するまで待機します。
  3. アプリケーションがどのインテントもフィルタしない場合は、何もしません。
で確認できます。 <ph type="x-smartling-placeholder">
</ph>
図 1. タグ ディスパッチ システム

可能な限り、NDEF メッセージと ACTION_NDEF_DISCOVERED インテントを使用してください。これは、 説明します。このインテントを使用すると、より適切なタイミングでアプリを開始できます。 ユーザー エクスペリエンスが向上します。

Android マニフェストで NFC アクセスをリクエストする

デバイスの NFC ハードウェアにアクセスして NFC インテントを適切に処理する前に、 AndroidManifest.xml ファイル内のアイテム:

  • NFC ハードウェアにアクセスするための NFC <uses-permission> 要素:
    <uses-permission android:name="android.permission.NFC" />
    
  • アプリケーションでサポート可能な SDK の最小バージョン。API レベル 9 では、 ACTION_TAG_DISCOVERED によるタグのディスパッチが制限され、 EXTRA_NDEF_MESSAGES エクストラによる NDEF メッセージへのアクセス。× 他のタグプロパティや I/O オペレーションにはアクセスできます。API レベル 10 包括的なリーダー/ライターのサポート、フォアグラウンド NDEF プッシュ、API レベルを含む Android 14 では、Android ビームと追加の機能を使用して、NDEF メッセージを他のデバイスに簡単にプッシュできます。 NDEF レコードを作成するための便利なメソッドが用意されています。
    <uses-sdk android:minSdkVersion="10"/>
    
  • アプリを Google Play に表示する uses-feature 要素 NFC ハードウェアを搭載したデバイスの場合のみ:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    

    アプリで NFC 機能を使用するが、その機能は uses-feature 要素を省略して、NFC の可用性を確認できます。 実行するために、getDefaultAdapter()null です。

NFC インテントのフィルタ

処理する NFC タグのスキャン時にアプリケーションを起動するには、 Android マニフェストの NFC インテントのうち、1 つ、2 つ、または 3 つすべてでフィルタできます。ただし、 通常は、ACTION_NDEF_DISCOVERED インテントをフィルタして、 アプリケーションの起動のタイミングを最も細かく制御できます。ACTION_TECH_DISCOVERED インテントは、フィルタするアプリがない場合の ACTION_NDEF_DISCOVERED のフォールバックです。 ACTION_NDEF_DISCOVERED またはペイロードが Pod に NDEF。ACTION_TAG_DISCOVERED のフィルタリングは、通常、 選択します。多くのアプリケーションは、ACTION_TAG_DISCOVERED の前に ACTION_NDEF_DISCOVERED または ACTION_TECH_DISCOVERED でフィルタするため、このアプリケーションで 開始します。ACTION_TAG_DISCOVERED は最後の手段としてのみ利用可能です 他のアプリケーションがインストールされていない場合に、アプリケーションでフィルタできます。 ACTION_NDEF_DISCOVERED または ACTION_TECH_DISCOVERED インテント。

NFC タグの導入は多種多様で、その多くは管理が困難であるため、 そのため、必要に応じて他の 2 つのインテントにフォールバックできます。新しい 書き込まれるタグやデータの種類を制御するには、NDEF を使用して できます。次のセクションでは、インテントのタイプごとにフィルタを適用する方法について説明します。

ACTION_NDEF_DISCOVERED

ACTION_NDEF_DISCOVERED インテントをフィルタするには、 インテント フィルタと、フィルタするデータのタイプを指定します。「 次のサンプルは、ACTION_NDEF_DISCOVERED のフィルタです。 MIME タイプ text/plain のインテントを指定します。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>

次の例では、 https://developer.android.com/index.html

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
   <data android:scheme="https"
              android:host="developer.android.com"
              android:pathPrefix="/index.html" />
</intent-filter>

ACTION_TECH_DISCOVERED

アクティビティで ACTION_TECH_DISCOVERED インテントをフィルタする場合、 アクティビティがサポートするテクノロジーを指定する XML リソース ファイルを作成する必要があります。 tech-list セット内です。アクティビティ: tech-list セットが、次のテクノロジーのサブセットである場合に、一致とみなされます。 タグでサポートされているもの。これは getTechList() を呼び出すことで取得できます。

たとえば、スキャンされたタグが MifareClassic、NdefFormatable、NfcA をサポートしている場合、 tech-list セットでは、3 つ、2 つ、または 1 つの技術すべてを指定する必要があります(何も指定しません)。 一致するようにする必要があります。

次の例では、テクノロジーをすべて定義しています。有効でないものは削除する必要があります。 NFC タグに対応している必要があります。このファイルを <project-root>/res/xml フォルダ。

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

また、複数の tech-list セットを指定できます。tech-list のそれぞれ 各セットは独立して考えられ、アクティビティ セットにいずれか 1 つでも一致した場合、 tech-list セットは、getTechList() によって返されるテクノロジーのサブセットです。これにより、ANDOR が提供されます。 セマンティクスとともに使用されます。次の例は、 NfcA および Ndef テクノロジー、または NfcB テクノロジーと Ndef テクノロジーをサポートできる:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

AndroidManifest.xml ファイルで、作成したリソース ファイルを指定します。 <activity> 内の <meta-data> 要素内 要素を示しています。

<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>

タグ テクノロジーと ACTION_TECH_DISCOVERED インテントの使用について詳しくは、サポートされているタグを使用する テクノロジーをご覧ください。

ACTION_TAG_DISCOVERED

ACTION_TAG_DISCOVERED をフィルタするには、次のインテントを使用します。 filter:

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

インテントから情報を取得する

NFC インテントによってアクティビティが開始した場合は、スキャンされた NFC に関する情報を取得できます タグを追加します。スキャンされたタグに応じて、インテントには以下のエクストラを含めることができます。

これらのエクストラを取得するには、アクティビティが次のいずれかで起動されているかどうかを確認してください。 タグがスキャン済みであることを確認して 使用します。次の例では、ACTION_NDEF_DISCOVERED NDEF メッセージをインテント エクストラから取得します。

Kotlin

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
            val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }
            // Process the messages array.
            ...
        }
    }
}

Java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages =
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i++) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            // Process the messages array.
            ...
        }
    }
}

または、インテントから Tag オブジェクトを取得することもできます。この場合、 にペイロードが含まれ、タグのテクノロジーを列挙できます。

Kotlin

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Java

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

一般的なタイプの NDEF レコードを作成する

このセクションでは、一般的なタイプの NDEF レコードを作成して、 NFC タグや Android ビームによるデータの送信。Android 4.0(API レベル 14)以降、 createUri() メソッドを使用すると、 URI が自動的に記録されます。Android 4.1(API レベル 16)以降では、 createExternal()createMime() を使用して、 MIME タイプと外部タイプの NDEF レコード。間違いを避けるため、可能な限り以下のヘルパー メソッドを使用してください。 NDEF レコードを手動で作成することもできます。

このセクションでは、対応する そのレコードのインテント フィルタが作成されます。これらの NDEF レコードの例はすべて、最初の NDEF に配置する必要があります。 タグまたはビームに書き込む NDEF メッセージのレコード。

TNF_ABSOLUTE_URI

注: 代わりに「RTD_URI」と入力してください TNF_ABSOLUTE_URI です。これはより効率的であるためです。

TNF_ABSOLUTE_URI NDEF レコードは次の方法で作成できます。 :

Kotlin

val uriRecord = ByteArray(0).let { emptyByteArray ->
    NdefRecord(
            TNF_ABSOLUTE_URI,
            "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")),
            emptyByteArray,
            emptyByteArray
    )
}

Java

NdefRecord uriRecord = new NdefRecord(
    NdefRecord.TNF_ABSOLUTE_URI ,
    "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")),
    new byte[0], new byte[0]);

前の NDEF レコードのインテント フィルタは次のようになります。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="https"
        android:host="developer.android.com"
        android:pathPrefix="/index.html" />
</intent-filter>

TNF_MIME_MEDIA

TNF_MIME_MEDIA NDEF レコードは次の方法で作成できます。

createMime() メソッドを使用:

Kotlin

val mimeRecord = NdefRecord.createMime(
        "application/vnd.com.example.android.beam",
        "Beam me up, Android".toByteArray(Charset.forName("US-ASCII"))
)

Java

NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam",
    "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));

手動で NdefRecord を作成:

Kotlin

val mimeRecord = Charset.forName("US-ASCII").let { usAscii ->
    NdefRecord(
            NdefRecord.TNF_MIME_MEDIA,
            "application/vnd.com.example.android.beam".toByteArray(usAscii),
            ByteArray(0),
            "Beam me up, Android!".toByteArray(usAscii)
    )
}

Java

NdefRecord mimeRecord = new NdefRecord(
    NdefRecord.TNF_MIME_MEDIA ,
    "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")),
    new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));

前の NDEF レコードのインテント フィルタは次のようになります。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="application/vnd.com.example.android.beam" />
</intent-filter>

TNF_WELL_KNOWN(RTD_TEXT)

TNF_WELL_KNOWN NDEF レコードは、次の方法で作成できます。

Kotlin

fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord {
    val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII"))
    val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16")
    val textBytes = payload.toByteArray(utfEncoding)
    val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7
    val status = (utfBit + langBytes.size).toChar()
    val data = ByteArray(1 + langBytes.size + textBytes.size)
    data[0] = status.toByte()
    System.arraycopy(langBytes, 0, data, 1, langBytes.size)
    System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size)
    return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data)
}

Java

public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
    byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit + langBytes.length);
    byte[] data = new byte[1 + langBytes.length + textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}

前の NDEF レコードのインテント フィルタは次のようになります。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

TNF_WELL_KNOWN(RTD_URI)

TNF_WELL_KNOWN NDEF レコードは次の方法で作成できます。

createUri(String) メソッドを使用:

Kotlin

val rtdUriRecord1 = NdefRecord.createUri("https://example.com")

Java

NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");

createUri(Uri) メソッドを使用:

Kotlin

val rtdUriRecord2 = Uri.parse("https://example.com").let { uri ->
    NdefRecord.createUri(uri)
}

Java

Uri uri = Uri.parse("https://example.com");
NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);

手動で NdefRecord を作成:

Kotlin

val uriField = "example.com".toByteArray(Charset.forName("US-ASCII"))
val payload = ByteArray(uriField.size + 1)                   //add 1 for the URI Prefix
payload [0] = 0x01                                           //prefixes https://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.size)     //appends URI to payload
val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload)

Java

byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length + 1];              //add 1 for the URI Prefix
payload[0] = 0x01;                                           //prefixes https://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.length);  //appends URI to payload
NdefRecord rtdUriRecord = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);

前の NDEF レコードのインテント フィルタは次のようになります。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="https"
        android:host="example.com"
        android:pathPrefix="" />
</intent-filter>

TNF_EXTERNAL_TYPE

次のファイルで TNF_EXTERNAL_TYPE NDEF レコードを作成できます。 方法:

createExternal() メソッドを使用する場合:

Kotlin

var payload: ByteArray //assign to your data
val domain = "com.example" //usually your app's package name
val type = "externalType"
val extRecord = NdefRecord.createExternal(domain, type, payload)

Java

byte[] payload; //assign to your data
String domain = "com.example"; //usually your app's package name
String type = "externalType";
NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);

手動で NdefRecord を作成:

Kotlin

var payload: ByteArray
...
val extRecord = NdefRecord(
        NdefRecord.TNF_EXTERNAL_TYPE,
        "com.example:externalType".toByteArray(Charset.forName("US-ASCII")),
        ByteArray(0),
        payload
)

Java

byte[] payload;
...
NdefRecord extRecord = new NdefRecord(
    NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")),
    new byte[0], payload);

前の NDEF レコードのインテント フィルタは次のようになります。

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="vnd.android.nfc"
        android:host="ext"
        android:pathPrefix="/com.example:externalType"/>
</intent-filter>

より一般的な NFC タグのデプロイには TNF_EXTERNAL_TYPE を使用し、両方を適切にサポート Android 搭載デバイスと、Android 以外のデバイス。

: TNF_EXTERNAL_TYPE の URN の形式は次のとおりです。 urn:nfc:ext:example.com:externalType。ただし、NFC Forum RTD の仕様 は、URN の urn:nfc:ext: 部分を NDEF レコード。そのため、指定する必要があるのはドメイン(この例では example.com)だけです。 と型(この例では externalType)をコロンで区切って指定します。 TNF_EXTERNAL_TYPE をディスパッチする際、Android は urn:nfc:ext:example.com:externalType URN を vnd.android.nfc://ext/example.com:externalType URI に変換します。これが、 のインテント フィルタを宣言します。

Android アプリのレコード

Android 4.0(API レベル 14)で導入された Android Application Record(AAR)は、 NFC タグのスキャン時にアプリが確実に起動されるようにします。AAR のパッケージ名 NDEF レコードに埋め込まれたアプリケーションのAAR は NDEF の任意の NDEF レコードに追加できます Android では NDEF メッセージ全体で AAR の有無が検索されるためです。AAR が見つかった場合は、 AAR 内のパッケージ名に基づいて自動的にアプリへの追加が行われます。アプリケーションが Google Play が起動してアプリをダウンロードします。

AAR は、他のアプリで同じインテントや デプロイした特定のタグを 処理できるとは限りませんAAR は パッケージ名の制約により、アプリ レベルではなく、 使用します。アクティビティ レベルでインテントを処理する場合は、インテント フィルタを使用します。

タグに AAR が含まれている場合、タグ ディスパッチ システムによるディスパッチ方法は以下のとおりです。

  1. 通常どおりに、インテント フィルタを使用したアクティビティの開始を試みます。一致するアクティビティが インテントが AAR と一致する場合は、アクティビティを開始します。
  2. インテントをフィルタするアクティビティが一致しなかった場合、 AAR。複数のアクティビティがインテントを処理できる場合、またはインテントを処理するアクティビティがない場合は、 自動的に適用されます。
  3. AAR を導入できるアプリがない場合は、Google Play にアクセスして 自動的に適用されます

注: AAR とインテント ディスパッチ システムは、 フォアグラウンド ディスパッチ システム: NFC タグが実装されている場合にフォアグラウンド アクティビティを優先できます。 検出されます。この方法では、AAR をオーバーライドするためにアクティビティがフォアグラウンドにある必要があります。また、 インテント ディスパッチ システムです。

スキャンしたタグのうち、AAR が含まれていないタグでフィルタしたい場合は、 通常どおりインテント フィルタが適用されます。これは、アプリケーションが他のタグに関心がある場合に有効です AAR を含んでいない広告ですたとえば、アプリケーションでこのアプリケーションの処理を 独自のタグと第三者によってデプロイされる一般的なタグです。留意点 AAR は Android 4.0 以降のデバイスに固有のものであるため、 AAR と MIME タイプ/URI を組み合わせて使用し、幅広いデバイスに対応できるようにしました。イン また、NFC タグを実装する際は、NFC タグをどのように記述して ほとんどのデバイス(Android デバイスおよびその他のデバイス)のサポート。これを行うには、 比較的一意の MIME タイプまたは URI を定義して、アプリケーションで区別できるようにします。

Android には、AAR を作成するためのシンプルな API が用意されています。 createApplicationRecord()。必要なすべての機能 NdefMessage の任意の場所に AAR を埋め込みます。望まないものは NdefMessage の最初のレコードを使用する(AAR が唯一のレコードである場合を除く) NdefMessage に記録します。これは、Android アプリが システムは NdefMessage の最初のレコードを確認して、MIME タイプを特定します。つまり、 タグの URI。アプリでフィルタするインテントを作成するために使用されます。次のコードでは、 : AAR の作成方法:

Kotlin

val msg = NdefMessage(
        arrayOf(
                ...,
                NdefRecord.createApplicationRecord("com.example.android.beam")
        )
)

Java

NdefMessage msg = new NdefMessage(
        new NdefRecord[] {
            ...,
            NdefRecord.createApplicationRecord("com.example.android.beam")}
        );
)

NDEF メッセージを他のデバイスにビームする

Android ビームを使用すると、2 台の Android デバイス間でシンプルなピアツーピアのデータ交換が可能になります。「 別のデバイスにデータをビームするアプリケーションは、フォアグラウンドにあり、 ロックされてはいけません。ビーム照射デバイスが十分に 受信側デバイスに「タップしてビーム」と表示されます。UI です。ユーザーは 受信側デバイスにビームするかどうかを指定します。

注: フォアグラウンド NDEF プッシュは API レベル 10、 Android ビームと同様の機能を提供します。これらの API は非推奨となりましたが、 古いデバイスのサポートに 利用できます詳しくは、enableForegroundNdefPush() をご覧ください。

アプリケーションの Android ビームを有効にするには、次の 2 つのメソッドのいずれかを呼び出します。

  • setNdefPushMessage(): NdefMessage: ビームするメッセージとして設定します。メッセージを自動的にビームする 2 つのデバイスが十分に近接しているとき。
  • setNdefPushMessageCallback(): 次を含むコールバックを createNdefMessage() これは、デバイスがデータビームの範囲内にある場合に呼び出されます。このコールバックを使用すると、 NDEF メッセージを送ります。

アクティビティは一度に 1 つの NDEF メッセージしかプッシュできないため、setNdefPushMessageCallback() が優先されます。 両方が設定されている場合は setNdefPushMessage() 以上になります。用途 Android ビームを使用する場合は、次の一般的なガイドラインに従う必要があります。

  • データをビームするアクティビティは、フォアグラウンドでなければなりません。両方のデバイスに 画面のロックが解除されました。
  • ビームするデータを NdefMessage にカプセル化する必要があります。 渡されます。
  • ビームされたデータを受信する NFC デバイスは、 com.android.npp NDEF プッシュ プロトコルまたは NFC フォーラムの SNEP(Simple NDEF Exchange) Protocol)。com.android.npp プロトコルは、API レベル 9(Android)のデバイスでは必須です。 2.3)から API レベル 13(Android 3.2)にアップグレードする必要があります。com.android.npp と SNEP はどちらも必須です API レベル 14(Android 4.0)以降。

注: アクティビティで Android ビームが有効になっていて、 標準のインテント ディスパッチ システムが無効になります。アクティビティが <ph type="x-smartling-placeholder"></ph>を有効にします フォアグラウンド ディスパッチングを参照している場合は、 フォアグラウンド ディスパッチ。

Android ビームを有効にするには:

  1. NdefRecord を含む NdefMessage を作成します。 もう 1 つのデバイスにプッシュする エンドポイントを選択します
  2. NdefMessagesetNdefPushMessage() を呼び出すか、setNdefPushMessageCallback を呼び出して、次の onCreate() メソッドで NfcAdapter.CreateNdefMessageCallback オブジェクトを渡します。 確認できます。これらのメソッドには、Android で有効にするアクティビティが少なくとも 1 つ必要です Beam と、アクティブにするその他のアクティビティのオプション リスト。

    一般に、アクティビティで必要な場合にのみ setNdefPushMessage() を使用します。 通信する 2 つのデバイスが近くにある場合、常に同じ NDEF メッセージをプッシュする。使用しているデバイス setNdefPushMessageCallback を アプリケーションが現在のコンテキストを考慮し、NDEF メッセージを push する必要がある アプリ内でのユーザー行動に応じて異なります。

次のサンプルは、単純なアクティビティが、スマートフォンの onCreate() メソッドで NfcAdapter.CreateNdefMessageCallback を呼び出す方法を示しています。 (AndroidBeamDemo を参照) をご覧ください)。この例には、MIME レコードの作成に便利なメソッドもあります。

Kotlin

package com.example.android.beam

import android.app.Activity
import android.content.Intent
import android.nfc.NdefMessage
import android.nfc.NdefRecord
import android.nfc.NfcAdapter
import android.nfc.NfcAdapter.CreateNdefMessageCallback
import android.nfc.NfcEvent
import android.os.Bundle
import android.os.Parcelable
import android.widget.TextView
import android.widget.Toast
import java.nio.charset.Charset

class Beam : Activity(), NfcAdapter.CreateNdefMessageCallback {
    
    private var nfcAdapter: NfcAdapter? = null
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        textView = findViewById(R.id.textView)
        // Check for available NFC Adapter
        nfcAdapter = NfcAdapter.getDefaultAdapter(this)
        if (nfcAdapter == null) {
            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show()
            finish()
            return
        }
        // Register callback
        nfcAdapter?.setNdefPushMessageCallback(this, this)
    }

    override fun createNdefMessage(event: NfcEvent): NdefMessage {
        val text = "Beam me up, Android!\n\n" +
                "Beam Time: " + System.currentTimeMillis()
        return NdefMessage(
                arrayOf(
                        createMime("application/vnd.com.example.android.beam", text.toByteArray())
                )
                /**
                 * The Android Application Record (AAR) is commented out. When a device
                 * receives a push with an AAR in it, the application specified in the AAR
                 * is guaranteed to run. The AAR overrides the tag dispatch system.
                 * You can add it back in to guarantee that this
                 * activity starts when receiving a beamed message. For now, this code
                 * uses the tag dispatch system.
                 *///,NdefRecord.createApplicationRecord("com.example.android.beam")
        )
    }

    override fun onResume() {
        super.onResume()
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
            processIntent(intent)
        }
    }

    override fun onNewIntent(intent: Intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent)
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    private fun processIntent(intent: Intent) {
        textView = findViewById(R.id.textView)
        // only one message sent during the beam
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMsgs ->
            (rawMsgs[0] as NdefMessage).apply {
                // record 0 contains the MIME type, record 1 is the AAR, if present
                textView.text = String(records[0].payload)
            }
        }
    }
}

Java

package com.example.android.beam;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;


public class Beam extends Activity implements CreateNdefMessageCallback {
    NfcAdapter nfcAdapter;
    TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.textView);
        // Check for available NFC Adapter
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (nfcAdapter == null) {
            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        // Register callback
        nfcAdapter.setNdefPushMessageCallback(this, this);
    }

    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        String text = ("Beam me up, Android!\n\n" +
                "Beam Time: " + System.currentTimeMillis());
        NdefMessage msg = new NdefMessage(
                new NdefRecord[] { createMime(
                        "application/vnd.com.example.android.beam", text.getBytes())
         /**
          * The Android Application Record (AAR) is commented out. When a device
          * receives a push with an AAR in it, the application specified in the AAR
          * is guaranteed to run. The AAR overrides the tag dispatch system.
          * You can add it back in to guarantee that this
          * activity starts when receiving a beamed message. For now, this code
          * uses the tag dispatch system.
          */
          //,NdefRecord.createApplicationRecord("com.example.android.beam")
        });
        return msg;
    }

    @Override
    public void onResume() {
        super.onResume();
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    void processIntent(Intent intent) {
        textView = (TextView) findViewById(R.id.textView);
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];
        // record 0 contains the MIME type, record 1 is the AAR, if present
        textView.setText(new String(msg.getRecords()[0].getPayload()));
    }
}

AAR に関するコードはコメントアウトされており、削除できます。AAR を有効にすると、 アプリは、常に Android Beam メッセージを受信します。アプリケーションが Google Play がアプリのダウンロードを開始します。したがって、次のインテントでは、 Android 4.0 以降のデバイスでは AAR を使用している場合は、フィルタを使用する必要はありません。

<intent-filter>
  <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/vnd.com.example.android.beam"/>
</intent-filter>

このインテント フィルタにより、com.example.android.beam アプリを起動できるようになりました NFC タグをスキャンするか、次の AAR が設定された Android ビームを受信したとき タイプ com.example.android.beam、または NDEF 形式のメッセージに MIME レコードが含まれている場合 タイプ application/vnd.com.example.android.beam

AAR はアプリの起動やダウンロードを保証しますが、インテント フィルタは 推奨されます。デフォルトの設定で、任意のアクティビティを開始できるためです。 常に AAR で指定されたパッケージ内でメイン アクティビティを起動するわけではありません。 AAR にはアクティビティ レベルの粒度はありません。また、一部の Android 搭載デバイスは、 AAR をサポートする場合、NDEF の最初の NDEF レコードに識別情報を埋め込む必要もあります それでフィルタすることもできます詳細については、アプリケーションの NDEF レコードのタイプをご覧ください。