2010年10月31日日曜日

AndroidのCameraアプリ


Androidのカメラアプリだけど、
思いの他はまりました。。。なのでメモとっておきます。
HTC Desire(2.2)で動作確認したアプリを貼り付けときます。
SampleUseCamera.tar.gz
写真とって、保存するだけです。

中身ですが、
デベロッパーサイトには書いてあるんだけど、
意外と他のサイトやサンプルでは違うことが書いてあったりしたのがManifest

uses-permission android:name="android.permission.CAMERA"
uses-feature android:name="android.hardware.camera"
uses-feature android:name="android.hardware.camera.autofocus"
が必要なのと、以下の二つも念のため追加しました。
uses-feature android:name="android.hardware.camera.flash"
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"


で、一番ハマッたのがシャッターの処理だ。
Webや本にあるサンプルだと
シャッターを切ったときにアプリが落ちる。。。だけじゃなく
端末のリソースを解放せずに落ちるので、端末全体でカメラが使えなくなったり。。。
Camera.autoFocusで設定するコールバックの中で、
Camera.takePictureを実行するのが一般的のようだが、
TakePicture後にすぐにもう一度Camera.autoFocusが実行されると落ちるし、
他のActivityを立ち上げようとすると落ちるし。。。
根本的な原因はわからないですが、
画面をタッチしてシャッターを切るようにしてあるコードで、
DOWNで切って、UPでも切ってしまっているのが問題の模様。
なので、


void takePictureAutoFocus(ShutterCallback shutter, PictureCallback raw, PictureCallback jpeg) {
_shutter = shutter;
_raw = raw;
_jpeg = jpeg;

synchronized (lockObject) {
if (takingpicture != false) {
return;
}
takingpicture = true;
}

camera.autoFocus(new AutoFocusCallback() {
@Override
public void onAutoFocus(boolean success, final Camera camera) {
camera.takePicture(_shutter, _raw, _jpeg);

new Thread() {
@Override
public void run() {
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
}
synchronized (lockObject) {
takingpicture = false;
}
if (_auto_focus_listener != null) {
_auto_focus_listener.onTakenPicture();
}
camera.startPreview();
}
}.start();
}
});
}

みたいにして、ちょっと時間がたつまで待ってます。
本当は、もっとちゃんとタイミング計りたいけど、
コードが結合する。。。ので、まあいいか。
CameraPreviewに書いてありますが、

private static final int PREVIEW_WIDTH = 800;
private static final int PREVIEW_HEIGHT = 480; // 800x480 = WVGA
private static final int PICTURE_WIDTH = 1280;
private static final int PICTURE_HEIGHT = 768;

みたいに、端末の画面サイズ(コード的にはカメラのpreviewのサイズ)がWVGA
保存する写真のサイズが1280x768にしてあります。

Java自体なれてないので、変なとこあるとは思いますが、
とりあえずは動くサンプルということで。

2 件のコメント:

  1. ぴょんきち2011年2月27日 20:40

    同じくDesireでカメラアプリを作成しようと思っているものですが、Autofocusの開放がなぜかできなくてアプリが落ちる現象に悩んでいます。

    DOWNで切って、UPでも切ってしまっているのが問題の模様。

    上記はどうやって確認したのですか?
    DDMSでやっぱりログを見て確認したのでしょうか?

    返信削除
  2. Toぴょんきちさん

    うーん、だいぶ昔なので記憶似ていることを答えるだけになってしまいますが、ブレイクをはって確かめたところ、何故か2回シャッター切る処理で止まったからおかしいな?というのが理由です。

    返信削除