2011-09-11
■[android]Androidのカメラの向きに関する覚え書き
Androidでカメラを使ったアプリを作っているんだが、端末本体(カメラ)の向きに合わせて撮影した写真の向きも変えるのが結構面倒。その辺のAndroid API仕様の覚え書き。
Androidでは、カメラの向きに関するポリシーは、以下のどちらかになると思われる。
1.が一番簡単。マニフェストファイルの<activity>要素で、android:screenOrientation属性を"landscape"にするだけ。カメラのプレビュー表示も撮影した写真の向きも全部landsacpe(横長)に固定される。
2.が結構面倒。カメラのプレビュー表示と撮影した写真の2つの向きを、それぞれ端末本体の向きに合うように制御する必要がある。
カメラのプレビュー表示の向きを変える
Cameraをopen()したあと、setDisplayOrientation()メソッドでプレビュー表示の向きを、端末本体の向きに合わせて変更する。これをしないと、カメラから撮影する対象の向きと、プレビュー表示の向きが合わなくなる。コードは、下記を参考に。
Camera#setDisplayOrientation()のAPI doc
撮影した写真の向きを変える
最初は、Camera.Parameters#setRotation()で変えられると思ったが、Camera.PictureCallbackで渡されるJPEG画像の向きが変わるかどうかは機種依存らしい。少なくとも手元のXPERIA arcでは向きは変わらなかった。
Camera.Parameters#setRotation()のAPI doc
仕方ないので、自分でBitmapを操作して、端末の向きに合わせて写真の向きを変える事にした。例えば、onPictureTaken()メソッドを下記のように実装する。
public void onPictureTaken(byte[] data, Camera camera) { int rotation = activity.getWindowManager().getDefaultDisplay().getRotation(); int degrees = 0; //端末の向き(度換算) switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } Matrix m = new Matrix(); //Bitmapの回転用Matrix m.setRotate(rotation); Bitmap original = BitmapFactory.decodeByteArray(data, 0, data.length); Bitmap rotated = Bitmap.createBitmap( original, 0, 0, original.getWidth(), original.getHeight(), m, true); savePicture(rotated); }
- 64 http://www.google.co.jp/url?sa=t&rct=j&q=android カメラ 向き&source=web&cd=8&ved=0CFUQFjAH&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=2SWFTqLcHun4mAWD4rDzDw&usg=AFQjCNETA_LRRSHIVIQAy
- 43 http://www.google.co.jp/url?sa=t&rct=j&q=android+カメラ 向き&source=web&cd=9&sqi=2&ved=0CF0QFjAI&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=szHLTvSZJKrkmAX19a3MDQ&usg=AFQjCNETA_L
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cts=1331028016473&ved=0CCkQFjAA&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=BOBVT5biEsPtmAXDxvneCQ&usg=AFQjCNETA_LRRSHIVIQAyyq5sZtZRFXxWA&sig2=xvOtqTfJpE6bcr
- 24 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CCgQFjAB&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=sfUYT6HsFdGfmQXcup2xCg&usg=AFQjCNETA_LRRSHIVIQAyyq5sZtZRFXxWA
- 19 http://www.google.co.jp/url?sa=t&rct=j&q=android 写真の向き&source=web&cd=1&ved=0CDAQFjAA&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=-zSgTon1N4nUmAWgl6zhBA&usg=AFQjCNETA_LRRSHIVIQAyyq5
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&cts=1331615858014&ved=0CDUQFjAC&url=http://d.hatena.ne.jp/NAT_programming/?of=10&ei=2NdeT72rKeOyiQeVzPTCBw&usg=AFQjCNEHKTGGPjqbncDTgkGRC86Ld64eTQ&sig2=RRanXw4oHOIef420dl8Xbw
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&cts=1331122046472&ved=0CEYQFjAD&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=e09XT4zWFYuJmQXE2u3EDw&usg=AFQjCNETA_LRRSHIVIQAyyq5sZtZRFXxWA&sig2=EIxh8GXTjk24wg
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&cts=1331088967127&ved=0CFkQFjAG&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=OM5WT7nDNY_HmQWAlK31CQ&usg=AFQjCNETA_LRRSHIVIQAyyq5sZtZRFXxWA
- 15 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=4&sqi=2&ved=0CDcQFjAD&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=iLA5T_rtEsaQiQfwhqmGCg&usg=AFQjCNETA_LRRSHIVIQAyyq5sZtZRFXxWA
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=android カメラ 向きが&source=web&cd=5&ved=0CEEQFjAE&url=http://d.hatena.ne.jp/NAT_programming/20110911/1315716519&ei=wWfYTua9FandmAXK-8zWCw&usg=