40
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Android】カメラのライブラリを作ってみた

Last updated at Posted at 2013-12-17

Androidでカメラをカスタムで書こうとすると、 機種依存 という敵と真っ向から戦うハメになります。
主な原因は、各ベンダーが好き勝手にオレオレカメラを載せてくるせい。
ハードウェアスペックに依存して、サポートされるサイズやパラメータが異なってきます。

いい加減きれいにまとめてしまいたい!ということで、Fragmentにまとめることにしました。

##機能

今現在
・プレビュー表示
・撮影 保存
・フロントカメラ切り替え

フラッシュ撮影など今後対応していく予定。

##ソース

ソースはこちら。
https://github.com/satoshinew/CameraFragment

CameraFragmentのライブラリプロジェクトと、それを使ったサンプルプロジェクト(CameraSample)に分かれています。

##使い方

ライブラリプロジェクトをライブラリ参照するか、jarにしてプロジェクトのlibsに入れて下さい。( ここ からかっぱらっても良し)
CameraFragmentを表示させたいViewにaddすると、カメラのプレビューが表示されます。

簡単だね!…と言いたいのですが、諸々と設定は必要になってしまいました。

主な原因は、カメラのpreviewSizeの設定。
例えば、画面サイズ一杯にプレビューを表示したいとしても、
画面サイズと同じサイズのpreviewSizeがサポートされてるとは限らないからです。
無理に表示すると、アスペクト比がずれてプレビューが歪みます。

Fragmentをaddする際の諸々の設定は、CameraSampleにある CameraSampleActivity を参考にしてください。

###1. カメラのプレビューを表示する

CameraSampleActivity.java
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. 撮影、保存

CameraSampleActivity.java
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()を叩いてください)
他にもフラッシュ関連の怪しいメソッドが用意してありますが、絶賛開発中のため、
まともに保障できるのは現段階では上記機能くらいです。

##最後に

必要な機能は今後取り入れていく予定です。
もともと外部に公開する気が毛頭もなかったので、コメントが少なかったり、
命名がナンセンスだったりしますが、追々修正していきます。

カメラの内部処理も公開しているので、参考などになれば幸いです。

40
40
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
40

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?