「NFC Pay」はAndroid端末でも使えるようになるのか

この記事。

セブン-イレブン・ジャパンは18日、全国約2万店のセブン-イレブンにおいて、2020年6月からVisa/Mastercard/JCB/Amex/ダイナースの5つのクレジットカードブランドを用いたNFC Type-A/Bによる非接触決済サービスの取り扱いを開始予定であると発表した。実際の利用時は対応カードなどをレジのリーダーにかざすだけで、サインや暗証番号が不要で支払いが完了できる。

今後も訪日外国人の増加が期待されるなか、セブン-イレブンでも海外で主流の決済サービスに対応するのは重要なトピックと言える。

👉 ASCII.jp:セブン-イレブンで6月からクレカ5ブランドのNFC Payが使用可能に 

そうだよな。確かにクレカは差し込む方式だよな。

あれ?

Android端末を使った Google Pay や おサイフケータイ でクレカを直接登録して非接触のかざすだけで使えるようになるのかな?


👉 一目で分かる「Pay(ペイ)」の基本 

 

そもそもハードウェアは対応してるのか

ぼんやり、

「国内版Androidはガラパゴス仕様チップNFC=FeliCa」で海外版のグルーバルのNFCと違う。

と認識してましたが。

こんな Pixel公式説明もあります。

日本で購入された Pixel 4、Pixel 3a、Pixel 3 スマートフォンの場合は、NFC と同じ箇所に FeliCa チップが取り付けられています。

👉 Pixel スマートフォンのハードウェアの図 - Pixel Phone ヘルプ 

これを見る限り、「ハードウェア的なNFC」は、国内版と海外版で違うような説明に見えますが、しかし。

Why is Google turning off FeliCa on Pixel models outside of Japan? I doubt it is a licensing restriction because the whole point of NXP PN81 is having all the global NFC licensing pieces, NFC A-B-F/EMV/FeliCa/MIFARE, all on one chip, all ready to go.

日本以外のPixelモデルでFeliCaをオフにしているのはなぜですか? NXP PN81のすべてのポイントは、すべてのグローバルNFCライセンスの一部であるNFC A-B-F / EMV / FeliCa / MIFAREをすべて1つのチップに搭載しており、すべて準備が整っているからです。

👉 No global NFC evolution for Pixel 4? – Ata Distance 

Google might have left a backdoor to activate FeliCa later on non-JP Pixel 4 models

Googleは、後に非日本版Pixel4にFeliCaを有効化するバックドアを残した可能性があります。

👉 Pixel 4 goes cheap instead of deep – Ata Distance 

日本版Pixel4と同じチップでFeliCaのみ使えないものが海外版Pixel4搭載のチップ、ではないかと言っています。

では、実際Pixel3ではどうなっているのでしょうか。

 

日本版NFCチップこそグローバル?!

規格については、NFC周りはややこしくて流動的です。

👉 AndroidのHCE-Fについて調べてみたメモとサンプルソース - Qiita 
👉 NFC関係用語と解説 - Qiita 
👉 Advances with Osaifu-Keitai ―Starting Services Supporting NFC (Type A/B) on NTT DOCOMO UIM Cards 

このようなアプリがあります。


👉 NFC TagInfo by NXP - Apps on Google Play 

端末にかざしたモノに反応して、その情報を表示してくれます。

日本独自のFeliCa代表としてPASMOをかざしてみます。

反応して FeliCaな「NFC-Type F」を表示しました。

続いて、AmericanExpress をかざしてみます。セブンイレブンなどでは差し込む方式で、非接触としては使えないものです。

ガラパゴスなFeliCaでない「NFC-Type A」が反応しています。

 

まとめ

国内版Android端末(ハードウェア)は、海外仕様だと言われている「NFC Type-A」にも対応している。

海外版Android端末(ハードウェア)は、「NFC Type-F FeliCa」に対応していない。

Google Pay や おサイフケータイアプリ が対応すれば、きっと、クレカ登録だけでタッチ決済ができるようになりそうに思えます。

いや、大人の事情があるのかな。

👉 一目で分かる「Pay(ペイ)」の基本 


LifecycleLogger とか。

今になって、Android SDK の根本的な

「ライフサイクル」
「フラグメント」
「バックスタック」

とかで苦労すること多くなってきました。


👉 Handling Lifecycles with Lifecycle-Aware Components 

ライフサイクルやそのオーナーの状況変化具合を眺めながら進みたいですよね?



意外と使える androidx.lifecycle.* 。

今更か。


Kotlin で Result

どう書くべきでしょうか、リポジトリが返す Result。

data クラス で書きますか?

それとも、Kotlin ビルトインのを使いますか?

👉 Result - Kotlin Programming Language 

 

Sealed クラス で書くべし

enum の拡張的なイメージで使いましょう、

👉 Sealed Classes - Kotlin Programming Language 

👉 architecture-samples/Result.kt

できるだけ長く広く便利に使えるものがいいですよね。

👉 【MVVM】Flow vs LiveData 


【MVVM】Flow vs LiveData

👉 Using LiveData & Flow in MVVM — Part I - ProAndroidDev 

Kotlin Flow の登場で盛り上がってきました。

どれにします? どの流れにします?

Repository

Result を返す。

Flow<Result>を返す。

ViewModel

Result を受けて、LiveData<Result> を渡す。

Flow<Result> を受けて、LiveData<Result> を渡す。


Fragment

LiveData<Result> を受け取る。

Flow<Result> を受け取る。


override fun onActivityCreated(savedInstanceState: Bundle?) {
  super.onActivityCreated(savedInstanceState)

  viewModel = ViewModelProviders.of(
      this,
      viewModelFactory
  ).get(WeatherForecastDataStreamFlowViewModel::class.java)

  // Consume data when fragment is started
  lifecycleScope.launchWhenStarted {

    // Since collect is a suspend function it needs to be called
    // from a coroutine scope
    viewModel.weatherForecast.collect {
      when (it) {
        Result.Loading -> {
          Toast.makeText(context, "Loading", Toast.LENGTH_SHORT).show()
        }
        is Result.Success -> {
          tvDegree.text = it.data.toString()
        }
        Result.Error -> {
          Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show()
        }
      }
    }
  }
}

WeatherForecastDataStreamFlowFragment #L47-L75

まとめ

とはいえ、今はまだ、完全に LiveData は捨てれんよの。

👉 Kotlin で Result 
👉 Kotlin Flow vs Android LiveData - Stack Overflow 
👉 From RxJava 2 to Kotlin Flow: Threading - ProAndroidDev 

追記: ホットな Flow が登場したので以下。

👉 【MVVM】 Kotlin Flow で使える5つの利用パターン 


SoundFlowerからBlackHoleに移行してOBS接続おさらい

仮想オーディオデバイスと各音声の流れを整理します。

macOS版OBSでは「デスクトップ音声」を受け取ることができません。

一方、「マイク音声」は「Built-in Microphone」として受け取ることができます。

なので、配信時の音声は、「マイク音声」のみとなります。

簡単な図にするとこうなります。

デスクトップ音声も流したいですよね。

そこで、仮想オーディオデバイスを使います。

OBSは仮想オーディオデバイスを受け取ることができます。

今回は仮想オーディオデバイスとして SoundFlower の代替として BlackHole を使います。

👉 ExistentialAudio/BlackHole: BlackHole is a modern macOS virtual audio driver that allows applications to pass audio to other applications with zero additional latency. 

インストールすると、BlackHoleを経由したデスクトップ音声をマイク音声2として受け取れるようになります。

この状態では、パソコンのスピーカーからデスクトップの音声は聞こえないので、AUDIO MIDI設定から複数出力装置を作成して内蔵出力(パソコンのスピーカー)にも流れるように分岐します。

これでマイクとデスクトップの音声をOBS経由で配信や録画することができるようになりました。

大まかに各音声の流れを掴みながら細かい設定をしていくと混乱せずに設定していくことができます。

詳細設定は画面キャプを参考にいけると思います。



👉 OBS出力から 仮想カメラ デバイス を作成する【macOS】 
👉 【OBS】複数のURL/APIキーを管理させる - YouTube 
👉 Soundflower と Audio MIDI設定 
👉 How to setup OBS on macOS Catalina using BlackHole - YouTube 

👉 このサイト内で「OBS」で検索する