Androidのカメラの表示優先で質問です

1,778 views
Skip to first unread message

山田

unread,
Feb 3, 2011, 8:05:06 PM2/3/11
to Android-SDK-Japan
Androidのカメラの表示優先で質問です
別の所でも質問していたのですが
こちらのサイトを見つけたので、削除して質問させてもらいます。

こちらのサイトのサンプルを利用して(http://d.hatena.ne.jp/mustankatti/
20101212/1292108976)
カメラとopenglを利用して表示をおこなっているのですが
メニューにもどってからゲームに戻ると
カメラ->3Dと描画されていたのが
3D->カメラと描画されて
3Dの部分の上にカメラが表示され、3D部分が表示されなくなっています。

ActivityのonCreateで以下のように登録しているのですが

GLView = new GLSurfaceView(this);
setContentView(GLView);
camera = new Camera(this);
addContentView(camera,new
LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

再度ゲームに戻ってきたときにしないといけないような事はあるでしょうか?
なにか対処方法などがありましたらよろしくお願いいたします。

egg

unread,
Feb 3, 2011, 10:20:10 PM2/3/11
to android-...@googlegroups.com
山田さん

江川と申します。
再度その画面に復帰したときにGLSurfaceViewが描画していないということはないでしょうか。
GLThreadがその画面に戻ってきたときにも動いているか(RendererのonDrawFrameが呼ばれているか)確認してみてください。


------------------------------------------
EGAWA Takashi

2011/2/4 山田 <jou...@crest.ocn.ne.jp>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

山田

unread,
Feb 4, 2011, 6:48:01 AM2/4/11
to Android-SDK-Japan
早速ありがとうございます
簡略化していますが以下の処理で確認してみたのですが
ずっと、GL_onDrawFrameと表示されていました。

// 描画処理
public void onDrawFrame(GL10 gl) {
 Log.d("testpas", "GL_onDrawFrame");
}

ちなみにsetとaddの順番を入れ替えると
3D->カメラと描画されていたのが
カメラ->3Dと描画されました。

結果初回は3Dが見えないが
二回目は3Dとカメラが見えるといったことになりました。

egg

unread,
Feb 4, 2011, 7:22:23 AM2/4/11
to android-...@googlegroups.com
そうなんですね。適当なことを言って申し訳ありません。
これもまた推測なのですが、addContentViewを使わずに、
FrameLayoutなど、前後関係のあるレイアウトの中に二つのレイアウトを追加したら
どうなりますでしょうか。

------------------------------------------
EGAWA Takashi

2011/2/4 山田 <jou...@crest.ocn.ne.jp>:

egg

unread,
Feb 4, 2011, 7:34:12 AM2/4/11
to android-...@googlegroups.com

すみません、二つのレイアウトではなく、ふたつのViewです。

2011/02/04 21:22 "egg" <t.e...@gmail.com>:

山田

unread,
Feb 4, 2011, 9:12:40 AM2/4/11
to Android-SDK-Japan
egg様何度もありがとうございます。

なるほどFrameLayoutですか
現在PCがないので明日また試してみてから
報告させていただきます。

山田

unread,
Feb 4, 2011, 8:33:15 PM2/4/11
to Android-SDK-Japan
現在以下のようにしてみましたが結果が同じでした。
普通にやるぶんにはこれで十分だとおもうのですが・・・


ViewGroup.LayoutParams LayoutParam = new
ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
ViewGroup.LayoutParams.FILL_PARENT);

FrameLayout frameLayout = new FrameLayout(this);
setContentView(frameLayout);

GLView = new GTSurfaceView(this);
camera = new CameraPreview(this);

frameLayout.addView(cameraPreview, LayoutParam);
frameLayout.addView(mGLView, 1, LayoutParam);

//------------------------------------------------------------------------
ちなみにアクティビティの
onPauseの時に
GLView.onPause();
camera.releaseCamera();

onResumeの時に
mGLView.onResume();

としています。


山田

unread,
Feb 4, 2011, 8:52:44 PM2/4/11
to Android-SDK-Japan
※追記
つい先ほどGLViewではなく
Buttonで同じ方法で試したところ
メニューにもどっても前後関係が入れ替わったりはしませんでした。

山田

unread,
Feb 4, 2011, 9:30:14 PM2/4/11
to Android-SDK-Japan
※さらに追記です

ちょっと自分のソースのopenglの処理が長くなっていたため
下記のサイトの三角形のポリゴンを表示させるの使いテストした所
http://d.hatena.ne.jp/mustankatti/20110122/1295697517
同じような現象が起こりました。

adamrocker

unread,
Feb 4, 2011, 9:37:43 PM2/4/11
to android-...@googlegroups.com
adamrockerです。

横からスミマセン。
調査に協力したいのですが情報がちょっと断片的で調査が難しいなと思っています。

そこで、山田さんの問題が再現できる最小構成のテストアプリを作って
ソースを公開することはできませんでしょうか?

全体のソースコードが分かれば、手元の端末で試せるので調査がはかどると思います。
実は別の箇所に問題があったという場合も対応できるかもしれません。

全然アドバイスになってなくて申し訳ありませんが、
ご検討頂けると幸いです。

よろしくお願いします。

2011年2月5日11:30 山田 <jou...@crest.ocn.ne.jp>:

山田

unread,
Feb 4, 2011, 10:18:06 PM2/4/11
to Android-SDK-Japan
adamrockerさん
ありがとうございます。
現状私の方も手詰まりになってきたので
adamrockerさんの言うとおりソースを公開させていただきます。
ソース全部書くと長くなりそうなので
アップローダーで公開させてもらいます。

http://www1.axfc.net/uploader/Sc/so/201790
(pass:test)

よろしくお願いします。

adamrocker

unread,
Feb 4, 2011, 10:28:18 PM2/4/11
to android-...@googlegroups.com

山田さん

adamrockerです。
ソースの公開ありがとうございます。
今は見れる環境に居ないので即答は難しいのですが、後で見てみます。
#その前にどなたか解決されるかもしれませんが…(汗

2011/02/05 12:18 "山田" <jou...@crest.ocn.ne.jp>:

山田

unread,
Feb 4, 2011, 11:07:39 PM2/4/11
to Android-SDK-Japan
※もうひとつ追加ですが。
現状動作の確認は実機のXperia(Android 2.1)で行っております
アプリケーションのAndroidのバージョンは1.6です。

シンプルなプログラムなのでさほど問題はないとは思うのですが・・・
よろしくおねがいいたします。

egg

unread,
Feb 5, 2011, 1:37:44 AM2/5/11
to android-...@googlegroups.com
山田さん

江川です。ソースありがとうございます。
試して現象を確認しました。確かにできませんね。。。。

ちょっと検索してみたところそもそもSurfaceViewをひとつのWindow内に複数持つことを推奨していないようです。
http://groups.google.com/group/android-developers/browse_thread/thread/4850fe5c314a3dc6

じゃあ何か回避策は無いのかと議論しているページ
http://stackoverflow.com/questions/4598822/alternative-approach-to-opengl-view-on-top-of-camera
カメラの画像をテクスチャとしてOpenGLで描けとか言われているっぽいですが、画像のフォーマットが違うので
なかなか難しそうですね。
Surface, SurfaceFlinger, WindowManagerに詳しい人なら何か回避策を知っているのではないかとも思いますが。。。

------------------------------------------
EGAWA Takashi

2011/2/5 山田 <jou...@crest.ocn.ne.jp>:

山田

unread,
Feb 5, 2011, 3:17:21 AM2/5/11
to Android-SDK-Japan
eggさんありがとうございます。
なるほど思ったよりもやっかいな問題なような気がしてきました・・・
カメラの画像をonPictureTakenが呼ばれていない段階で
dataを取得するのも難しそうですし・・・
とった画像をopenglで表示するのは、まぁ大丈夫だとは思うのですが。

ARアプリを見てるとDroidshootingなどは戻った後も表示を行っているので
なにか解決策があるとは思うのですが。
もうちょっといろいろ調べてみます。

yusuke akimoto

unread,
Feb 8, 2011, 12:40:29 AM2/8/11
to Android-SDK-Japan
山田さん

穐本と申します。
DroidShootingの開発元の者です。

私もまったく同じ現象が発生し四苦八苦しておりましたが、
去年のABC2010Springでの講演「セカイカメラの育て方」の中で
日本システム開発株式会社 石原様がこの現象についての解説をなさっていました。

その解説によると、Activity内に複数のSurfaceViewがある場合のZ-Order(レイヤの順番)は
管理されていない(=毎回同じ順序になる保証がない)とのことでした。

また、同講演の中で解決策もいくつか提示なさっていて
①1つのActivityに1つのSurfaceViewのみをセット
②setZOrderMediaOverlay()、setZOrderOnTop()を使用してZ-Orderを調整する(API level
5(Android2.0)以降)
といったことでした。

DroidShootingのターゲットはAndroid1.6でしたので、①の解決方法を採用してこの現象を回避しています。
例)
CameraPreviewActivityでCameraPreviewViewをセット後GLViewActivityをコール

GLViewActivityでGLSurfaceViewをセット

(ちなみに②については未検証です。。。)

以上、ご参考になれば幸いです。

Ishihara Masaki

unread,
Feb 8, 2011, 11:58:28 AM2/8/11
to android-...@googlegroups.com
山田さん

石原と申します。

穐本様からご紹介いただきましたが、私も同じ問題で
困っておりました。
実は根本原因はいまだわかっていないのですが…
回避方法としては、

> GLView = new GTSurfaceView(this);

上記で生成したGLSurfaceViewに、

 GLView.setZOrderMediaOverlay(true);

のような感じで生成後一回だけ設定をしておいていただ
ければうまくいくのではないかな?と思います。
(ただし上記メソッドはAndroid2.0以降でないと使用で
 きません)

あとムリクリやる方法としては…

> GLView = new GTSurfaceView(this);
> camera = new CameraPreview(this);
> frameLayout.addView(cameraPreview, LayoutParam);
> frameLayout.addView(mGLView, 1, LayoutParam);

onResume() で再表示させるときに、

 frameLayout.bringChildToFront(camera);

と順番を入れ替えてあげるとうまくいったり。
これは予想なのですが、Androidのバグで順番が入れ替わってし
まうのじゃないかと思っています。なので、その現象に合わせて
順番を入れ替えてあげるとうまくいく…
ですがこの現象はかなり機種依存するので、後者の順番入れ替え
を使う場合は注意してください。
(ターゲットが単一機種のみなら専用の作り込みでもOKかもしれ
 ませんね)

あと参考までに、ABC2010 Springの講演資料はつい先日公開
致しましたので、もしお時間あればご覧下さいませ。
 http://www.android-group.jp/index.php?plugin=attach&pcmd=open&file=SekaiCamera_for_ABC2010_by_ishihara.pdf&refer=%A5%A4%A5%D9%A5%F3%A5%C8%2FAndroid%20Bazaar%20and%20Conference%202010%20Spring

以上、宜しくお願い致します。


2011年2月8日14:40 yusuke akimoto <steamlo...@gmail.com>:

> --
> このメールは Google グループのグループ「Android-SDK-Japan」の登録者に送られています。
> このグループに投稿するには、android-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-sdk-ja...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-sdk-japan?hl=ja からこのグループにアクセスしてください。
>
>

--
==============
石原 正樹 (Masaki Ishihara)
@ishihara_twit

山田

unread,
Feb 8, 2011, 7:06:33 PM2/8/11
to Android-SDK-Japan
穐本様、石原様

山田です。貴重な情報ありがとうございます。
なるほど、こんな方法があったのですね。
多分手当たり次第に調べているとたどり着けなかったと思うので
非常にたすかりました。
週末までは時間が取れないので、検証は週末になるのですが
今回はこれで解決とさせてもらいます。

皆様、本当にありがとうございました。
Reply all
Reply to author
Forward
0 new messages