2016年11月5日土曜日

またしてもたった一行が:Ancroid SDK Camera2で位置情報を写真に保存する #EXIF #Android

みなさまこんばんは。
今日はCamera2で位置情報保存するにはCaptureRequest.JPEG_GPS_LOCATIONしないとだめだよ、ってお話です。あるいは、リファレンスはちゃんと読め、というお話・・・。
週末ですねー。
週末といってもさっぱり休めてませんが、皆様いかがお過ごしでしょうか。

まあ休めていない理由の一つに、今月のABC 2016までに公開しようと目論んでるアプリの進捗が思わしくないことがあるんですけど。
あと二週間だよ。基本的な機能もまだ実装できてないよママン。

で、今日も空き時間を見つけてカリカリとコードを書いてました。
・・・やっぱCamera2難しいわ。
いや、「難しそう」と最初に先入観持ってしまったから、余計そう思うのかもしれませんが。

だってサンプル少ないんだもん。

カメラで撮影して、画像にOpenStreetMapの地図を合成して、ApacheのCommons Imagingを使ってEXIF情報をのっけたまではできたんですが。
肝心な位置情報がどうしても保存できない・・・。
GPSからはきちんと位置情報取れてるのになー。

・・・位置情報だけはExifInterface使わないとダメなのかな?
と思って、嫌々(理由はこちら)試してみるも、玉砕。

まあそんなわきゃねえか。

ここまでで既に一時間。コードを書いちゃ消し・・・はせずに「もったいないから」とコメントアウト。過ぎ去っていく時間に比例して増えていくコメント行。ああ。

でも、ふと、ぶれいくするーは訪れるもので。
「そもそも、位置情報を保存するようにカメラに言わなきゃだめなんじゃね?」

・・・あったあった。
CaptureRequest」に、「JPEG_GPS_LOCATION」ってのがしっかりと・・・。

こんな感じで。前後ちょっとはしょりますが。

Location crrLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
...
final CaptureRequest.Builder captureBuilder =
     mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
...
captureBuilder.set(CaptureRequest.JPEG_GPS_LOCATION, crrLocation);

これだけ。この最後の一行だけ。
この一行追加しただけで、あっさりと位置情報保存してくれた。
一時間半経過して、ようやくガッツポーズ。周囲に人いなくてよかった。

・・・何もカメラに要求しないでも、GPSさえ有効にしておけば、カメラちゃんの方で勝手に位置情報をメタデータに保存してくれる、って私が思い込んでたんですよねー。

Camera2ではいちいちきちんと要求しないといけない、ということなのかしら。

まあ、Commons Imagingの使い方を疑ったりExifInterfaceに擦り寄ったり、そういう回り道したからこそ、CaptureRequestしないとダメなんでは?と着想したわけで、何つーの?急がば回れ、的な・・・

・・・いや、最初からドキュメント読んどきゃええねん・・・ orz

あともうちょっと。頑張ろう。



0 件のコメント:

コメントを投稿