surfaceViewの不具合?

Androidでカメラアプリを作ったわけですが、原因不明のバグに襲われている。
これだけ先人がいるのに、同じ不具合がググっても出てこないのは、
私が、よほど、アホな作りをしているということか…?

というわけで、誰かヘルプ。
↓以下、その現象。

----
SurfaceViewを2枚重ねて表示している。
下層がカメラのプレビュー、上層をGUIの描画に使用している。
タッチの処理などは、上層で処理。

上層で、カメラのプレビューをOFFにできる機能をつけている。
異なるVIEWからの操作が色々と面倒なので、
上層で、プレビューOFFにされたら、Activityから、
下層のsurfaceView自体を、
setVisibiliry(View.INVISIBLE);
で不可視にしている。

上層⇒Activityもスレッドが異なるため、handlerを使用している。
可視/不可視を処理するメソッドが、これだ。
----

public void setCameraPreview(boolean f) {
if ( f ) {
sv2.setVisibility(SurfaceView.VISIBLE);
} else {
sv2.setVisibility(SurfaceView.INVISIBLE);
}
Log.d("APP LOG", "F:"+ f);
}

----

で、これが問題なく動作するのだ(おいおい
じゃあ何が問題なんだよ、と言うと、だな。

一度「バックキー」などで、アプリを終了させたあと、もう一度起動すると、
このプレビュー切り替えが動作しなくなるのだ。

注目すべきは、処理スレッドのログ。
きちんと、true,falseが表示されているのだ。
つまり、ココの処理までは来ているということだ。

初期プレビューは表示されているため、
再起動時のsurfaceView sv2の初期化に失敗しているというわけでもなさそうだ。
setVisibility()メソッドが、何らかの理由で反応しないのだ。

ホームキーやバックキーでアプリを終了した際、完全に終了するわけではなく、
プロセスは残っている。
このプロセスを殺してから、再起動すると、プレビューは正常に切り替えられる。

いわゆるサスペンド状態のときに、何か不具合を起こしているのだろう。
一日潰したが原因が分からないので、
面倒でパスしてた、異なるViewからの操作で、直接camera.stopPreview();を呼び出しをやってみるわ。
[PR]
by miries | 2012-09-28 12:05 | デジタル系


<< ProgressDialogを... F-10Dのドット抜け >>