Androidのアプリ開発関連のブログ

QRリーダー制作中

QRリーダー制作中。


まずCameraのPreviewが止まっちゃう場合があってハマったが、
SurfaceHolder.CallbackのsurfaceCreatedでstartPreview()するとそうなるっぽい。
Camera.PreviewCallbackをsetPreviewCallback以外のsetPreviewCallbackWithBufferなんかも試したり、Previewを処理時に意図的に止めたりしてもダメだったが、surfaceCreatedではなくsurfaceChangedでstartPreview()したら問題なくなった。

ついでに、コールバックにTimer試したりもしたんだが、
setPreviewCallbackではなくsetOneShotPreviewCallbackだとコールバックが一回しか発生しない。
プレビューの間隔は端末依存で、手元のだと5fpsが最低ぽかった。
1秒1回も処理できればいいと思うんで、1回だけのsetOneShotPreviewCallbackでコールバックを設定して、
処理完了後にTimerで再度setOneShotPreviewCallbackを設定って方法で1秒間隔に変更した。


あと、カメラの向きとかアスペクト比なんかも考えなきゃと思ったんだが、端末を回転させると落ちることが判明した。
Camera.open()してる状態で再度open()が発生すると落ちるぽいんで、onCreateでopenではなく、onResumeでopenしてonPauseでreleaseにした。
releaseすると、release状態でプレビューの更新とかが発生すると例外が発生するんで、tryで回避した。

向きの変更はcamera.setDisplayOrientation(int)で変更できる(API14以降?)んだが、計算式がめんどくさい。
カメラの前背も考慮する必要がある様でよくわかってないが、リファレンスにサンプルコードが載ってるんで真似した。

アスペクト比は調整すると余白ができちゃうし、調整しなくても良いかなと思うことにした。


あと結果表示領域付けるだけでいいや。
できればQRコードの詳細情報を表示できるようにしたいんだが、ZxingだとDataMatrixの詳細は取得できそうなんだがQRの詳細は取得できなそうな・・・