Androidでカメラをカスタムで書こうとすると、 機種依存 という敵と真っ向から戦うハメになります。
主な原因は、各ベンダーが好き勝手にオレオレカメラを載せてくるせい。
ハードウェアスペックに依存して、サポートされるサイズやパラメータが異なってきます。
いい加減きれいにまとめてしまいたい!ということで、Fragmentにまとめることにしました。
##機能
今現在
・プレビュー表示
・撮影 保存
・フロントカメラ切り替え
フラッシュ撮影など今後対応していく予定。
##ソース
ソースはこちら。
https://github.com/satoshinew/CameraFragment
CameraFragmentのライブラリプロジェクトと、それを使ったサンプルプロジェクト(CameraSample)に分かれています。
##使い方
ライブラリプロジェクトをライブラリ参照するか、jarにしてプロジェクトのlibsに入れて下さい。( ここ からかっぱらっても良し)
CameraFragmentを表示させたいViewにaddすると、カメラのプレビューが表示されます。
簡単だね!…と言いたいのですが、諸々と設定は必要になってしまいました。
主な原因は、カメラのpreviewSizeの設定。
例えば、画面サイズ一杯にプレビューを表示したいとしても、
画面サイズと同じサイズのpreviewSizeがサポートされてるとは限らないからです。
無理に表示すると、アスペクト比がずれてプレビューが歪みます。
Fragmentをaddする際の諸々の設定は、CameraSampleにある CameraSampleActivity を参考にしてください。
###1. カメラのプレビューを表示する
fl_camera = (FrameLayout) findViewById(R.id.fl_camera);
fl_camera.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
fl_camera.getViewTreeObserver().removeGlobalOnLayoutListener(this);
addCameraFragment(fl_camera.getWidth(), fl_camera.getHeight());
}
});
CameraFragment を入れる対象の View のサイズを取得して、addCameraFragment() を叩きます。
View の width / height に wrapContent / matchParent に指定されている場合、
実際の width / height 値が決まるのを待つ必要があります。
もし、予めサイズが決まっているようであれば、OnGlobalLayoutListener()を使うは必要ありません。
そのままサイズを投げてしまってください。
addCameraFragment() の中身に関しては、プレビュー・保存サイズを よしなに 設定してほしい方は
丸コピで問題ありません。
###2. 撮影、保存
cameraFragment.takePicture(true, new OnTakePictureListener() {
@Override
public void onShutter() {
}
@Override
public void onPictureTaken(Bitmap bitmap, Camera camera) {
String path = Environment.getExternalStorageDirectory().toString() + "/";
cameraFragment.setSavePictureDir(path);
cameraFragment.saveBitmap(bitmap);
}
});
takePicture()を叩くと、シャッターが降りてコールバックが返ってきます。
bitmapを返すので、保存、加工したい方は onPictureTaken() 内で受け取ってください。
申し訳程度に保存するユーティリティも用意してあります。
###3. その他
バック・フロントカメラの切り替えくらいまではできます。(setCameraDirection()を叩いてください)
他にもフラッシュ関連の怪しいメソッドが用意してありますが、絶賛開発中のため、
まともに保障できるのは現段階では上記機能くらいです。
##最後に
必要な機能は今後取り入れていく予定です。
もともと外部に公開する気が毛頭もなかったので、コメントが少なかったり、
命名がナンセンスだったりしますが、追々修正していきます。
カメラの内部処理も公開しているので、参考などになれば幸いです。