はまったりひらめいたり…とか…

.Net系プログラムで勉強したこととか嵌ったことについて書いたりします。

Xamarin.AndroidでNfc機能の技術検証した話

この記事は

[初心者さん・学生さん大歓迎!] Xamarin その1 Advent Calendar 2017

13日目の記事となります。Advent Calendar初挑戦です。よろしくお願いします!

初めに

Xamarin.Formsはずいぶん前からちょこちょこ触ってましたが

本業はWebの方のお仕事中心で、正直まだまだ初心者の域を脱していません。

ですが、最近、Nativeの技術検証をする機会がありましたので

Xamarinで色々やってみた話です。

Xamarin.Androidの話になります。iOSまでは手を出せませんでした。

今回の記事はコードなしで感想中心となります。

コードは後述するGitHubに上げてますので煮るなり焼くなり致してくださいませ。

技術検証したこと

AndroidNfcを使用し、Suicaとかから履歴情報を引き抜く

まずはkotlin

AndroidにおけるSuicaから履歴を抜く方法については検索してすぐ見つかりました。

特に参考になったのは下記のページです。

qiita.com

qiita.com

www.kotemaru.org

が、JavaやKotlinのコードをC#に素直に変換できるか不安がありました。

なので、まずはkotlinで実装し

どのように動作するのか確認しながらC#に落とし込む手法を取りました。

基本は上記のページを参考に、kotlinの実装と動作を確認しつつ写経しました。

GitHub - Takas0522/FelicaCardReaderSample: FelicaCardReaderをKotlinで作ってみたSample

kotlinで出来上がったのが上記のコードです。

NFCAPIを使用し、Byte配列のコマンドを投げ

リクエストをByte配列で受け取る方式で、カードの履歴情報を取得します。

Xamarin.Android

はまったか?

案外、ハマる部分は少なく、素直に移行できたかと思います。

と、いうのも、NFCのやりとりで使用するNfcFクラスといったクラスの使い方は

ほぼ、kotlinのときと同様の使い方ができたので

その部分については迷うことは少なかったです。

(「Byte配列作る→投げる→Byte配列もらう」だけなので特例とは思いますが…)

なので、Xamarin特有(?)のR→Resourceとか、Intent周り等

基本的な、且つ、kotlinやJavaの記法から変わってる部分で少しハマったりしました。

最終的に、そういった基本的な部分で困ったら

Xamarin公式のドキュメントからサンプルソース落として

基本動作を抑える解決方法に落ち着きました。

kotlinで先に書いてみた恩恵

今回は特殊なケースかもしれませんが

Xamarinでうまく動作できないとき、kotlinで動作させてみて

Byte配列の変数の状態等をチェックすることもできたので

先にkotlinでコード書いてみたのが非常に活かせることができました。

Xamarinでうまく動かないときは

同様な動作をkotlin等のNativeコードで動かしてみると

色々気づきがあるかもしれません。

kotlinの書き換えが地味に多い

kotlinはオブジェクト操作周りが充実している印象で

その周りのC#の書き換えが地味に多かったです。

(Byte配列いじくることばっかやってたのでだいぶ偏った印象かも。。)

.netから見たkotlinの良さは、@amay077 さんの記事が参考になるかと思います。

qiita.com

自分は、Byte配列のここからここまでコピーする。みたいな CopyOfRange とか

Byte配列の Write ファンクションでByte配列に値を格納していくー。みたいな

Kotlin標準の機能の拡張を我慢できずに作ったりはしました。

ほかの言語に触れることでよさげな機能を発見して

C#の実装に取り込むといったことができるのも

Nativeコードに触れる良さかな。と思いました。

まとめ

  • 勉強目的ならNativeコードから書いたほうが格段に良い

    • 使用するNativeAPIの使い方が理解しておくことで、C#への移行がスムーズに。
    • kotlinで動作するものを作ることで、C#で動作しないときの比較検証ができた。
    • JXUGの勉強会ではよく耳にしますが本当に実感できました…!!
  • NativeコードからのC#への移行はあんがいあっさり行えた

    • ただし、NativeAPIをほとんど使用していない。
    • NativeAPIを多用し始めるとまた別の落とし穴が見えてくるはず
  • 基本的な部分はXamarin公式ドキュメントのサンプルで粗方洗える

    • iOSのCoreNFCとか新し目のAPIのサンプルもあったりするので結構ニッチな部分も抑えれるかも…

さいごに

今回作成したXamarin.Androidのコードは下記になります。

GitHub - Takas0522/FelicaCardReaderSampleXamarin

明日のAdventCalendarは @masanori-_-msl さんです。

よろしくお願いします!