THETAのサンプルコードをAndroidエミュレーターで動かしたい時

某所で少しだけ時間が空いたので、[RICOH THETAの開発者サイト](https://developers.theta360.com/ja/)にあったAndroidのサンプルコードをAndroidエミュレーターで動かそうとしたら少しハマったのでメモ。
Androidの開発を行う場合、エミュレーターではなく実機で行う事の方が多いと思うので、こういうハマり方はしないと思います。

# ダウンロード & インストール
1. [AndroidStudio](https://developer.android.com/sdk/index.html)インストール
    * ダウンロードしてきてインストールするだけなので、解説は色々なサイトにお任せします
2. RICOH_THETA_SDK_forAndroid.0.3.0 ダウンロード
    * 開発者登録が必要なようで、facebookアカウント等が必要になるようです

# Make Project
* 先にダウンロードしてきたフォルダを展開するとRICOH_THETA_SDK_for_Android.0.3.0/ricoh-theta-sample-for-androidが存在しているのでこの子をmake projectしようとするとエラーが発生しました
 * (エラーログや画面を残していませんでした・・・。)
* どうやらAndroid API 19 Platformを利用しているらしく発生するエラー
 * 表示されたエラー画面中にInstallというリンクがあるので、クリックすればインターネットに繋がっていれば、インストール出来るようです

# THETAをノートPCに接続する
SSIDとかパスワードを入力してもノートPCからTHETAに繋ぐ事が出来ませんでした。
[はじめに](https://developers.theta360.com/ja/docs/introduction/)の辺りを読むと、2.4Ghz制限があるようで、ノートPCの設定を見ると5Ghzを併用する設定となっていたらしく、この辺りの兼ね合いで繋がらなかったようです。
私が使っていたVaioですと、Smart Networkにある設定から無線LANのモード変更で2.4Ghzのみとする事が出来ました。
ただ、違う日に試してみたところ、併用の設定でも繋がったので関連は不明です。
この作業をしていた場所に、PCを使う人が多かったせいかもしれません。

なお、Vaioの無線設定方法に関しては、[[Windows 7,Vista,XP]
2.4GHz無線方式と5GHz無線方式を切り替えて使用する方法](http://qa.support.sony.jp/solution/S0306170014089/)が分かりやすいと思います。 

# サンプルアプリ
上記までを行ったら、Run Debugを選択し、エミューレーターでランチします
アプリが起動したら、画面上部のボタンを押しONに変更してしばらく待つと、AndroidEmulatorで以下のような画面が出ます
![選ぶ.png](https://qiita-image-store.s3.amazonaws.com/0/23194/2f3ac041-f0f8-6a4c-5052-792e1dbd1434.png)

ここで、写真を一つ選択すると下記のように落ちてしまいます
![落ちる.png](https://qiita-image-store.s3.amazonaws.com/0/23194/0523cb48-3a1f-109d-19db-888872115e86.png)

## openGLでエラー
この際、下記のようなエラーログが残っていました

```text:logcat
05-28 05:55:18.309    2334-2353/com.theta360.sample E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 170
    Process: com.theta360.sample, PID: 2334
    java.lang.IllegalArgumentException: No config chosen
            at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:869)
            at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1023)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)
```

## 解決策

エラーをググってみると以下の辺りの記事が良さそうでした
[OpenGL ES 2.0 Support for Android?](http://stackoverflow.com/questions/13717470/opengl-es-2-0-support-for-android)
[Android OpenGL demo “No config chosen”](http://stackoverflow.com/questions/14167319/android-opengl-demo-no-config-chosen)

GLに関する設定を追記すると良いようですね。

```java:GLPhotoView.java
    private void initialize(Context context) {

        setEGLContextClientVersion(2);
        super.setEGLConfigChooser(8, 8, 8, 8, 16, 0);

        mRenderer = new GLRenderer();
        setRenderer(mRenderer);
```

というわけで、GLPhotoView.javaの76行目付近に[setEGLConfigChooser](http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setEGLConfigChooser(int, int, int, int, int, int))を記載してみたところ、動きました！

[Android Developers](http://developer.android.com/reference/android/opengl/GLSurfaceView.html#setEGLConfigChooser(int, int, int, int, int, int))には以下のように記載されていますね
> Install a config chooser which will choose a config with at least the specified depthSize and stencilSize, and exactly the specified redSize, greenSize, blueSize and alphaSize.
If this method is called, it must be called before setRenderer(Renderer) is called.
If no setEGLConfigChooser method is called, then by default the view will choose an RGB_888 surface with a depth buffer depth of at least 16 bits.

デフォルトのサフェースがエミュレーターだと使えないという感じなのですかね？

以下の解説とかも分かりやすいかもしれません。
[GL SurfaceView の導入](http://www.techdoctranslator.com/resources/articles/articles-index/glsurfaceview)

とりあえず、動かせたぞー！