質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NFC

無線通信

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

解決済

2回答

5227閲覧

Xamarin Forms + NFC 待機状態の作り方

lyunes

総合スコア14

NFC

無線通信

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/07/26 08:25

編集2017/07/27 06:24

Xamarin.FormsでNFCアプリを作ろうとしています。

基本的な読み取りはできることを確認できました。
次のステップとして、アプリっぽくするために「ボタンを押したらNFCへのアクセス可能状態に」→「NFC読み取りを検知してそれぞれの処理へ」といった処理遷移を行いたいと考えていますが、どのような実装が適切でしょうか?

現在実装出来ている範囲では以下のような状態です。
「アプリケーションが起動時に常に読み取り待機状態となる」
「NFC機器のメモリからデータを読み出し、(byte配列情報を変換して)画面等に表示する」

その先の実装に関して不明瞭な点としては

  • 「読み取り待機状態をダイアログ等で表示してNFCアクセスへの待機状態をユーザーに知らせる。」

・・・まず、待機状態ダイアログ周りの実装がうまくいっていません。

  • 「待機状態のときのみ、NFCとの通信を可能にし、待機状態とする」(ボタンを押したらアクセス可能状態に)
  • 「NFCとのアクセスを検知できた場合、画面の状態に合わせて通信内容を変更する」(読み取りを検知して、それぞれの処理へ)

Androidベースで開発してるため、用語がそちらにかたよるかもしれませんが、現状の理解度は以下のような感じです。
・NewIntentはアプリ起動時には常に発生する可能性がある?
・それをキャッチした際に、画面のStatusにより、やるべき処理を切り分ければよい?
・読み取りをしてほしくないタイミング(ダイアログを表示していない場合)では、フラグなどにより処理を無視すればよい?
・そういったフラグやstatusは、MainActivity内に実装すべき?ViewModel側で制御可能?

非同期処理的な考えかたと、イベントの発生に関する理解が足りていないことが問題かと認識しています。
よろしければご意見お聞かせいただきたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amay077

2017/07/26 11:54

具体的な質問が不明です。「基本的な読み取りはできることを確認できた」のであれば次のステップとして上げられている2つも既に解っていると思えるのですが、具体的には何で困られているのでしょうか?
lyunes

2017/07/27 06:27

申し訳ありません。ご指摘ありがとうございます。イベント周りのことなので、Rxとかも考えたほうが良いのかもしれませんが・・・それ以前の理解を深めるほうが先決とも思っています。
guest

回答2

0

Androidベースで開発してるため、用語がそちらにかたよるかも

この内容でしたら Xamarin はほとんど関係なく、 Java-Android の質問として投稿された方が回答が得られやすいと思います。

その上で Java-Android に関する点で答えられる点に回答します。

NewIntentはアプリ起動時には常に発生する可能性がある?

Activity のライフサイクル再確認 - Qiita

にある通り、OnNewIntent は、LaunchMode によって発生する場合としない場合があります。
そしていずれもアプリの起動時ではなく、起動中のActivityに対して何らかのアクションを起こしたときに発生します。

NFC の読み取り待機状態については、OnNewIntent で受け取る方法に加え、「NFC Reader Mode」と呼ばれる、コールバックで受け取る方法もあります。

Android 4.4で追加されたNFC reader mode - Qiita

Reader Mode を使う場合は、Activity のライフサイクルを意識しなくてよいので、こちらの方が使いやすいかも知れません。

投稿2017/07/28 02:30

amay077

総合スコア1075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyunes

2017/07/28 06:31

ありがとうございます。自分の基礎知識の低さに嘆くばかりです。 教えていただいた記事やキーワードをもとに理解を深めていこうと思います
guest

0

自己解決

色々と試行錯誤した結果、とりあえず想定した実装は行えました。

MainActivityでのOnNewIntet内において、インターフェースのNewTagイベントを発生させています。
ViewModel側の処理で、NewTagイベントに処理をしたいときのみ、イベントハンドラにメソッドをあて、処理が終わったら解除する形にしてみたところ、それなりに想定していた動きになりました。

必要なときのみ、イベント処理を割り当てるといったイメージです。
どちらかというとイベントハンドラの上手な使い方がまだ理解できていなったのが問題だったかと思います。

INfc.cs

lang

1public interfase INfc{ 2 //何かしたいとき以外は、メソッドを割り当てておかないようにする。 3 event EventHandler NewTag; 4}

DetailPageViewModel.cs

lang

1 2//タグ発見通知変数 3private bool IsDetectedTag = false; 4//NFCインターフェース 5private INfc device; 6 7//読込ボタンにバインドしているメソッド 8async void WriteTagStandby(){ 9 try 10 { 11 this.IsDetected = false; //タグ発見フラグ 12 device.NewTag += ReadTag; //NewTagイベントにその時動かしたいメソッドを登録 13 14 //10秒待ってみる(このときダイアログ的なものを出せれば見た目もよい) 15 var start = DateTime.Now; 16 while ((DateTime.Now - start).TotalSeconds <= 10) 17 { 18 //待機中に、NewTagイベントが発生し、ReadTagが発火。 19 //ReadTag内で、IsDetectedTagがTrueになるのを待つ。 20 if (this.IsDetectedTag) break; 21 } 22 return; 23 } 24 finally 25 { 26 device.NewTag -= ReadTag; //イベントを解除しておく 27 } 28} 29 30void ReadTag(object sender,EventArg e) 31{ 32 //色々な処理 33 this.IsDetectedTag = true; //処理の中で、待機完了を通知する。 34}

Android側のNFC実装部分は省略。

投稿2017/08/02 08:12

lyunes

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amay077

2017/08/04 03:20

``while ((DateTime.Now - start).TotalSeconds <= 10) { … }`` の箇所ですが、この処理はボタンが押されたUIスレッドで行われるため、最大10秒間アプリがフリーズしてしまうと思います。ここは ``Timer`` や ``await Task.Delay(10000)`` などを使って、UIスレッドをブロックせずに10秒後に ``device.NewTag -= ReadTag;`` を呼び出すようにした方がよいと思います。
lyunes

2017/08/07 07:16

貴重なご意見ありがとうございます。 今のところ、ダイアログ表示も実装でき、待機状態であることの提示とキャンセル処理も含め何とか動いています。が、ちょっとソースもきれいではないのでご意見参考にしつつ、整頓していきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問