WindowsPhone

根性を用いてUWPでバーコードスキャナを実装する

この記事はWindows Phone / Windows 10 Mobile Advent Calendar 2015の14日目の記事の(予備と)して書かれました。

余談:

本当は楽に済まそうと思ってLumia950のレビューを書こうと思っていたのですが、Cloveが11月末入荷予定からずるずると出荷を遅らせ、最終的に届いたのが11/12でした。小心者の私はLumiaが届かないだろうと思ってこのエントリをすでにバリバリと書き始めてしまったので、Advent Calendarにはこちらの記事を投稿することにしました。結局ギリギリになって950も届いたがためにレビューの執筆も間に合ってしまいました(つらい日曜日だった)。よろしければあわせてご覧ください。

http://blog.naotaco.com/archives/979

本題

まともなNFCがiPhoneに載る気配がないせいか、現代においてもQRコードはとても広く使われています。自分のWindowsPhone/Windows 10 mobileアプリでもQRコードを読みたくなるのが人情というものでしょう。今年のAdvent calendarのトップバッター@tanaka_733さんのエントリをみる限りWP8.1だと比較的楽に実装ができるそうですが、我らがUWP勢にそのような甘えは許されません。 1

必要なものはこちら:

  • 根性
  • W10M端末, もしくはWindows 10 desktop + WebCam
  • ZXing.Net

どうやっていいかわからなかったので、まずはカメラのプレビュー映像を表示して、そこから一定間隔で画像を抜き取り、それをZxing.Netに投げるという方式で進めることにします。作りが雑すぎて故郷の母にはとても見せられないような感じになりますが、強い気持ちで乗り越えてください。

さて、まずはXAMLに置いたUIElementにカメラのプレビュー画像を表示させます。Androidで言うとSurfaceViewに描画するような感じです 2。とにかくMicrosoft謹製のサンプルがあるので、そこのCameraGetPreviewFrameを全力で参考にします。

作ったサンプルコードのソースはGitHubに上げておきました。

Continue reading

Notes:

  1. ていうかZXing.MobileのMobileBarcodeScannerとか今知ったよ……。
  2. 最近は違うのかもしれないですが。。

WindowsPhone8からWindows8.1 universalにコードをコピペしたらクソはまった話

愚痴です。

UserControlを作ってそのプロパティにデータをbindすることはたくさんあると思いますが、WindowsPhone8用に書いてたプロジェクトからWindows 8.1 Universal (Phone/Windows)のプロジェクトにコードをコピペしたらドはまりした愚痴です。

PropertyMetadataのコンストラクタのオーバーロードが、PhoneとUniversalで違っているっぽいです。MSDNのページには記載が見当たりませんが、PropertyChangedCallback 1引数のみのコンストラクタがUniversalには無くなっています。

Windows Phone 8 project (VS2012)

2012_1 2012_2 2012_3

 

Windows 8.1 universal project (VS2013)2013_1 2013_2

 

 

なんやこれ。

もともとWP8アプリで2 of 3のコンストラクタを使っていたぼくは思いっきりコードをコピペして2時間くらい悩んでいたのですが、1引数で渡していたCallbackがいつのまにかデフォルト値になっていただけだったのでした。せめてPropertyChangedCallbackをintにキャストした段階でException投げてくれよ。。。。

つらかった。

真に型安全な世界を探して生きていきたいです。

Exifをパースした話

JPEGにはExifと呼ばれるメタデータがはいっていて、F値やらジオタグやらなんやらが入っている(ことがある)のだが、Windowsphoneでそれをいい感じにパースして、さらにジオタグを足してくれるライブラリが見当たらなかったので、自分で適当に書いていた

基本的なフォーマットはぐぐれば割と出てくる(のだが、断片的な解説だけだったりして、複数の情報をながめながら感覚で作っていくしかない)。当然、公式の規格書[PDF]を読む根性など持ち合わせていない。

そんなかんじで自分のプロジェクトで使っていたのだが、最近になってバグがぽろぽろ見つかったのでテストをがんがん増やして直したりしていた。つらかった。はまったことをメモしておく。

  • App1 marker内はbig endianかlittle endianかがベンダによって異なる。すごい。にも関わらずその外側はだいたいbig固定。意味が不明。
  • App1 marker内だけ見たいので固定アドレスを見に行きたくなるが、なぜかたまにApp0 markerとかいうのを持ってるやつがいる。最新の規格書には記載がないようだが… いずれにせよフォーマットは同じなのでしっかり無視してあげればよさそう。
  • だいたいの値がUnsignedなのでまったく気付かなかったのだが、signedな負の数もたまに入ってくる。露出補正値とか。ちなみに2の補数で入っているっぽい。ぐぐってもわからんかったので適当にやってたらばぐって苦労したが、いま仕様書みたらちゃんと書いてあった。最初から読めばよかった。
  • 基本的に小数(実数)は分数の形で入っているのだが、カメラメーカー以外はシャッター時間の入れ方が雑。QX100とかはちゃんと分子に1, 分母に100とかって入れてくるのだが、Lumia 920なんかはすごくて、40003/1000000 みたいな値を入れてくる。おまえその3/1000000秒絶対嘘だろ。表示に気を遣う必要がある。だるい。
  • なんかフォーマットたくさんありそうだしあらゆる画像にちゃんと対応するの無理感がある
  • NFCは単純な構造で楽だった
  • Windowsのエクスプローラは1クリックでメタデータをいじれるようになってしまっているので危険。当然だが1カ所でもいじるとメタデータすべて再構成されるのでバイトオーダも変わるしただひたすらつらい
  • 0th IFDにGPS IFDへのOffsetが書いてあるにもかかわらずGPS IFDの中身が空とかそういう画像もあった。規格上問題ないのかもしれないがつらい。
  • つらい

 

以上

UserControlのプロパティに値をBindingする

BindingとUserControlはとても便利なのであわせてWPアプリ開発でも使いたいところ。詰まったところをメモしておきます。どうでもよいですがWindows関係は、.NETで使えるのかSilverlightで使えるのかStore appで使えるのかPhoneで使えるのかぱっと見分からない情報が多くて困りますね。なおWP8に関する日本語の情報はほぼ存在しない模様。

Continue reading

はじめてWPアプリをリリースした

Androidアプリは個人的にいくつか作ったり、いろいろな(内部的な)用途で作ったことはあったのだけど、ストアに出したことはありませんでした。気付いたらストアのアプリはあふれかえっていて、特にモチベーションも上がらなかった新規性のあるアプリが思いつかなかったのです。僕がAndroid黎明期にそれなりにコードを書ければなにか出していたのだろうけど。5年って長いね。

その点Windows Phone8は凄いよな、ローンチから1年半経ってもまだろくにアプリが出そろってないぜ。

ということで、WP のアプリを作ってストアにリリースしました。

http://www.windowsphone.com/en-us/store/app/nt-nfc-reader/b5f24e65-5537-46a7-b6ad-0547d12697e3

元々別のWPアプリを友人と開発していて、そこで書いたNDEFパーサを持ってきてちゃちゃっと作っただけのアプリです。いくらWPとはいえ、普通のNFCリーダアプリは既にストアにあったので、デベロッパフレンドリなアプリにしました。単にNDEFの中身がasciiなりhexで見られるだけという。

wp_ss_20140514_0002

バイナリアン向け

ソースはgithubにあるのでフィードバックください。追加機能のアイデアとか。

作ってて思ったこと

User controlとCode behindがちょうべんり

なんか便利。難しいことはよくわからないので、User controlにアニメーションとかのコードを書いといて、そこにデータを放り込む的な。動的なレイアウトを作るときにとても便利です。

VS2012がちょうべんり

IDE部分については言うまでも無いが、レイアウトエディタ?的なやつの完成度が某Androidの某Eclipseとは段違いですね。ちゃんと動く。

NFCの扱いが微妙

NFCタグにタッチするとWPのOSがデータを渡してくれるんだけど、OSが対応してないタグだと非対応のメッセージが出てくる。やかましいわ。NDEFのバイナリ自体はちゃんとアプリまで渡ってくるので、ちゃんとパースすれば全ての情報が見えるのだが、OSにエラー出されるとアプリがバグってるみたいでかなしい。

日本語の情報が皆無

つら

ストアに出しやすい(ような気がする)

WPストアは下々のデベロッパは署名とか考えなくてよいらしいので、ただアプリのパッケージをアップロードするだけでよい。らくちん。といっても他のストアのことは知らん。

 

世界中(適当)のNFC開発者に大人気(適当)のアプリですので、皆さんもNFCのついたWP8端末を買って使ってみてください。

Lumia 920 with IIJmio SMS SIM

さすがに8Sは常用するにはつらくなってきた。

特に(Lumia1020とかそういうエクストリームなものはおいといて)素晴らしい端末は出てこなかったので、Lumia920を中古で買ってきた。25k。

時を同じくしてIIJmioでSMS対応SIMが開始されたので、早速申し込んだ。

Cellularの設定は以前のまま、特にSMS APNなどの設定をすることなくSMS有効になって、3G下でもピクトが表示されるようになった。

バッテリの持ちがどうかと言われると、別に変わらんかなという感じもするのだが、だいぶ使いやすくなったのでよしとする。

Lumia920はカメラと画面がどっちもかなり上等になったな、という程度の印象。普段Xperia SPを使ってるから重いのには慣れた。つるつるボディは品位いいと思うけど、あまりデブフレンドリーではないよね。

8Sと920があればWPアプリ開発でも不便なくていいですね。

HTC 8S を買った

DSC01276

買ってしまった。

さいきんAndroid端末にもめっきり飽きてきて、Solaを5月に買ったきりAndroidには手を出してない。

(実際はICSになってクソ重くなったSolaに嫌気が差してSX買おうとしたりはしたんだけどそれもなんだかなー的な葛藤があったりもしたが)

 

かといって他に欲しいものもなくてぼけっとしていたところにWindows phone 8が発表された。最初はLumia920の発表をわくわくしながら深夜に見て、920を買うぞと決意を固めていたのだが、発売まで1ヶ月以上経ったりして、そのあいだにNEX-5RとSEL1018を買ってしまってお金がなくなったりして、結局WP8端末で一番安いHTCの8Sを買うことになったのだった。

11/25くらい:Cloveの「11月末に黒入荷して、12/4に青入荷するわ」という記載をみて、黒を注文

11.30:Cloveから「黒いつ来るかわかんなくなった。青にしない?」というメールがきたので、仕方なく青に変更してもらう

12/4:予定通りDHLで発送、ヒースローを発つ

12/5:ドイツ経由

12/6:中国経由で入国、通関、そのまま我が家へ(不在)

12/7:再配達受け取り完了

DHLさん仕事はやすぎてびびった。

 

色が青になっちゃったこともあってデザインは気にくわないが、WP8は割といい感じである。小気味よく動くし。

 

Windows Phone 8 について

Google+のアプリがないこと以外は、WP8はかなりすばらしいと思った。WP7.xのアプリも動くので、Storeもそこそこ充実してる印象。Evernote, Amazon, Google reader, Google map, facebook, Dropboxあたりは対応アプリがある。

当然だけどSkydriveにExcel / Power pointファイルを置いてPCとWP8端末からいじるのはかなり便利。プライベートにその必要はほとんどないが、とにかく便利。Excelを使ってみたけど、関数で計算くらいはいっしゅんでできるし、操作も携帯向けに最適化されていてなかなか。ただ、「データの入力規則」を使ったファイルを開いたら “Can’t edit file” とかいって編集できなかったりしたけど。

Google+のAPIはよ。あ、あと日本サービス未提供のBing mapもなんとかしてほしい。日本で発売されないならどうにもならないのかもしれないが、、、

 

8Sについて

Cloveの商品ページのFAQに「Standard SIM」と書いてあったにも関わらず、実際のSIMサイズはmicroだったりした。はははこやつめ。

そして検索キーが右側にあるんだけど、これの使用頻度が低すぎてなかなか。アプリストアを開いてから検索キー押すと、アプリの検索じゃなくて問答無用にBing web検索に飛ばされるあたり、何がしたいのかよくわからん。

日本語IMEは設定からインストール可能(要ダウンロード→要再起動)で、本体言語設定に日本語はなくて、さらに言うと日本語フォントはクソです。

あと、IIJ mioのSIMをさしたらデータ通信は問題なく出来たけどアンテナピクトは圏外表示になって、でもバッテリはAndroidより遙かに持つ という夢を見ました。