このドキュメントでは、Android で行う基本的な NFC タスクについて説明します。ここでは、Google Chat のメッセージ送信、 NFC データを NDEF メッセージの形式で受信し、Android フレームワーク API について説明します。 利用できます。NDEF 以外のデータの操作方法など、より高度なトピックについては、 高度な NFC をご覧ください。
NDEF データと Android を使用する場合、主に次の 2 つの使用例があります。
- NDEF データを NFC タグから読み取る
- Android を使用したデバイス間での NDEF メッセージのビーム送信 BeamTM
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 タグを解析し、スキャンしたデータが必要なアプリケーションを特定します。これは、 これは次の方法で行います。
- NFC タグを解析して、データ ペイロードを識別する MIME タイプまたは URI を特定する あります。
- MIME タイプまたは URI、およびペイロードをインテントにカプセル化します。最初の 2 つは 手順については、NFC タグを MIME タイプと URI にマッピングする方法をご覧ください。
- インテントに基づいてアクティビティを開始します。詳しくは、 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
タイプのレコードが見つかると、タグのテクノロジーをカプセル化するインテントが作成されます。
してください。
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 とそのマッピングです。 |
レコードタイプ定義(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 タグとそのタグをカプセル化するインテントを作成します。 インテントを受信して、関連するアプリケーションに インテントのフィルタを指定します。インテントを処理できるアプリが複数ある場合は、アクティビティ選択ツールが ユーザーがアクティビティを選択できるようにします。タグ ディスパッチ システムでは、 優先度の高い順に一覧表示されます。
-
ACTION_NDEF_DISCOVERED
: このインテントは、API 呼び出しを開始するために使用されます。 NDEF ペイロードを含むタグがスキャンされ、認識されたタイプである場合のアクティビティ。これは、 タグ ディスパッチ システムは、このインテントでアクティビティの開始を試みます。 他のインテントよりも優先する必要があります。 ACTION_TECH_DISCOVERED
: どのアクティビティも登録されない場合ACTION_NDEF_DISCOVERED
を処理する タグ ディスパッチ システムは、このインテントを使用してアプリの起動を試みます。この スキャンされたタグがスキャンされた場合、インテントが(最初にACTION_NDEF_DISCOVERED
を起動せずに)直接起動される MIME タイプまたは URI にマッピングできない NDEF データが含まれているか、タグに NDEF が含まれていない場合 既知のタグ技術ですACTION_TAG_DISCOVERED
: このインテントが開始されました。ACTION_NDEF_DISCOVERED
またはACTION_TECH_DISCOVERED
を処理するアクティビティがない場合 作成します。
タグ ディスパッチ システムの基本的な仕組みは次のとおりです。
- タグ ディスパッチ システムによって作成されたインテントでアクティビティを開始してみる
NFC タグの解析時に渡されます。
ACTION_NDEF_DISCOVERED
やACTION_TECH_DISCOVERED
など)。 - そのインテントにアクティビティ フィルタがない場合は、次のアクティビティでアクティビティを開始してみます。
優先度が最も低いインテント(
ACTION_TECH_DISCOVERED
またはACTION_TAG_DISCOVERED
)を、アプリがフィルタするまで タグ ディスパッチ システムが使用可能なすべてのインテントを試行するまで待機します。 - アプリケーションがどのインテントもフィルタしない場合は、何もしません。
可能な限り、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()
によって返されるテクノロジーのサブセットです。これにより、AND
と OR
が提供されます。
セマンティクスとともに使用されます。次の例は、
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 に関する情報を取得できます タグを追加します。スキャンされたタグに応じて、インテントには以下のエクストラを含めることができます。
EXTRA_TAG
(必須):Tag
オブジェクト スキャンされたタグを表します。EXTRA_NDEF_MESSAGES
(省略可): NDEF メッセージの配列 渡されます。このエクストラはACTION_NDEF_DISCOVERED
インテント。EXTRA_ID
(任意): タグの低レベル ID。
これらのエクストラを取得するには、アクティビティが次のいずれかで起動されているかどうかを確認してください。
タグがスキャン済みであることを確認して
使用します。次の例では、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 が含まれている場合、タグ ディスパッチ システムによるディスパッチ方法は以下のとおりです。
- 通常どおりに、インテント フィルタを使用したアクティビティの開始を試みます。一致するアクティビティが インテントが AAR と一致する場合は、アクティビティを開始します。
- インテントをフィルタするアクティビティが一致しなかった場合、 AAR。複数のアクティビティがインテントを処理できる場合、またはインテントを処理するアクティビティがない場合は、 自動的に適用されます。
- 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 ビームを有効にするには:
NdefRecord
を含むNdefMessage
を作成します。 もう 1 つのデバイスにプッシュする エンドポイントを選択しますNdefMessage
でsetNdefPushMessage()
を呼び出すか、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 レコードのタイプをご覧ください。