勉強会

Android SDK WG 第2回 セッション

無事終了しました!!

  • 日時: 2008年11月29日(土曜日) 13:00 - 17:30
  • 場所: 東京都新宿区西新宿二丁目1番1号 新宿三井ビル34階 株式会社豆蔵 大会議室
  • 定員: 20名弱
    • お申込は締め切らせていただきました。多数の方にお申込頂き誠にありがとうございました。
  • 参加料: 無料

内容

発表者の方に、各々の担当内容について自由に述べて頂き、皆でそれを聞きながら色々考えます。質問や疑問は随時出して、皆で共有していきましょう。
今回の発表者の方はこちらです!

開催記録メモ的なもの

途中退出ありで時間を延長し、13:00から19:00までの長い時間、どっぷりAndroid SDKに浸りました。

  • 安生さんのViewに関する開発情報の取得方法
  • 小山さんの2時間以上に及ぶServiceの超大作セッション
  • 神林さんのOpenGLを触ってみよう講座 の3本立てでした。

Intentは時間が無かったのでまたの機会に!

View

  • ApiDemosはよくできているが、見ること専用で部分的に取り出して使うことはできない。取り出して使いたい場合は、みんな試行錯誤してる
  • ソースを勉強する上では、NotePadがおすすめ
  • 一番上の層がイベントを拾うので、Viewを追加する順番には気をつけよう
  • ApiDemosのリストに出るのは何を基準に出してるの?
    • 次回までに誰かが調べる!
  • AutoCompleteTextViewには、Adapterを入れると色々出る
  • MapViewのズームコントロールはちょっとクセあり(以下を見よう)
  • UITipsは、また今度安生さんがやってくれる!

Service

mp3を再生するまでの流れを、サンプルアプリケーションを元に勉強

エミュレータでmp3の再生方法

はじめに、次のような手順で、mp3ファイルをAndroidのエミュレータで再生できることを確認しました。

1. $ANDROID_HOME/toolsにパスを通す。 2. SDカードイメージを作成する。(単位は、M:メガ, K:キロ のように大文字にすること)

  $ mksdcard 128M sdcard.img

3. エミュレータを起動する。

  $ emulator -sdcard sdcard.img

4. 作成したイメージにmp3ファイルを追加する。(エミュレータを起動後)

  $ adb push *.mp3 /sdcard

5. ちゃんとmp3ファイルを追加できたかを確認する。

  $ adb shell
  > ls -l /sdcard
  ----rw-rw- system   system    1373458 2008-11-29 14:07 minagiru.mp3

6. エミュレータでメディアの設定をする。

  [Dev Tools]->[Media Scanner]を選択し、"Media Scanner finished scanning /sdcard"とでればOK。

7. エミュレータでメディアを再生する。

  [Music]->[Songs]に追加したmp3の楽曲が表示されるので、再生できることを確認する。

Windows Vistaだとうまくいかない人がいくらかおられました。

ServiceとActivityの違い

SimplePlayerのサンプルアプリケーションを元に、先ほど再生したmp3の楽曲を再生するアプリケーションのソースコードをみながら勉強しました。

1. SimplePlayerは、Serviceを使っていないのでアプリケーションをバックボタンで停止すると再生も止まることを確認する。
2. SimplePlayerをServiceで再生するためのサンプルアプリケーション(SimpleService)を実行すると、バックボタンで停止しても、再生は止まらないことを確認する。

  • 必ず、AndroidManifest.xmlにservice要素を追加してやる必要がある。これはよくはまるポイントなので注意。Serviceは、Activityと違い、バックグラウンドで実行されるため、Activityを停止しても、Serviceで再生している楽曲は停止しない。
  • Androidでは、メディアの再生はMediaPlayerクラスを利用する。必ず、prepearメソッドをstartメソッドの前に呼び出してやること。

Serviceとの通信について

プロセス間通信の方法としてIPCを抽象化する方法がAIDLです。IDLはCOLBAで利用 されていました。AIDLは、".aidl"という拡張しのファイルを作成して保存すると、自動的にEclipseがプリコンパイルしてくれます。このとき、AIDLと同じ名前のJavaファイルが生成されますが、このファイルには編集しないように注意してください。

ちなみに、AIDLはJavaのインタフェースの実装に似ています。AIDLファイルはクラスパスが通っているところであれば、どこに配置してもかまいませんが、package名とInterface名を配置するディレクトリとファイル名にちゃんとあわせるようにしてください。

Stubは、ActivityからServiceを呼び出すための窓口になります。また、Callbackは、ServiceからActivityに通知する手段です。Parcellableは、ActivityとServiceでclassを共有したい場合に利用します。Bundle自信もParcellableです。

ContentProviderで楽曲情報の取得

Media Scannerを実行すると、ファイルを読み込みながらデータベースを作成してくれます。このとき作成されたデータベースから 楽曲ファイルの情報(タイトルやアーティストなど)を取得することができます。

  • 作成されるデータベースは、data/data/com.android.providers.media/databasesの中にある。
  • Androidは、基本的に/data/data/アプリケーションのpackage名/databasesにアプリケーション用のデータベースを作成する。

Notification

Notificationに任意のActivityを表示させるには、PendingIntentに設定するIntentに対して表示させたいActivityのクラスを指定すればよい。

その他

Androidは省電力をもっとも重視していますので、Serviceを利用する場合は本当に必要かどうかをよく考えることが重要です。

  • IPC:interprocess communication
  • IDL:Interface Definition Language
  • AIDL:Android Interface Definition Language

OpenGL

全体的にメモが怪しいです汗

  • 現バージョンのSurfaceViewはマルチスレッド強制で、onDrawが呼ばれないので自分で描画スレッドをつくってやる感じ。
  • EGL10(EGLContext.getEGL()の結果)は、DEPTHの設定だけはずせば、うまくデフォルト値を利用してくれる。G1では、8bitでは動かないので、実機で動かす場合は、明示的に指定しないほうがよいでしょう。機種を意識しなくてよくなります。
  • 座標は右手でフレミングの法則のような形を作って中指を自分の方向に向け、親指から順番にX、Y、Z
  • GL10.GL_FLOATとGLFixedの2つの方法がある。GL_FLOATは遅いが、サンデープログラマでやる分には楽なのでおすすめ。
  • glDrawArraysに指定するGL10.GL_TRAIANGLE_STRIPは頂点の指定方法で、そのほかにはFAN(扇形方式)などがあるようです。GL10とGL11など、どれを利用するかは実機に乗っているバージョンにあわせる必要がありそうです。
  • OpenGLを利用する場合、表面のEGLDisplayと、裏面のEGLSurfaceで2画面分を持っていて、それを切り替えることで画面をちらつきなく、表示させています。この切り替えは、G10#eglSwapBuffersメソッドで切り替えることができます。
  • テクスチャの向きが逆に貼られていた
    • なぜ?
  • Textureが実機で表示されない場合があるので、次の2行を追加しないとダメ(高橋さんより)
glTextParameterf(GL10.GL_TEXTURE_2D, CL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
glTextParameterf(GL10.GL_TEXTURE_2D, CL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);

Intent

時間切れのため次回

みんなの感想

  • もっと勉強をしたいという気になった
  • OpenGLはやったことがなかったので難しかったけど面白かった
    • テクスチャが出せるようになっただけでもかなり助かる
    • もっと勉強したい
    • ゲームを作ってみたい
  • OpenGL部分は変わらないのでiPhoneから移植したい
  • 円卓は前の教室よりも話しやすい!
  • Serviceは奥が深いということがわかった
  • プロセス間通信面白い
  • 初心者向けとそうでないものと、別にした方がいいんじゃ
  • ネットワークを絡めたところをやり直したい
  • 会社で試作やってるので、話せる時期が来たら話す
  • サンデープログラマーだとモチベーション維持が難しいが、こういう機会があるとやる気になる
  • Dalvik VMに興味がある。いずれ話したい
  • ソースコードを見る時間をもうけた方がいいか。
    • ソースコードを見る時間と、説明する時間と2部構成にしては?
  • Androidならではのところと、一般的なところを切り分けて話すようにしたらいいんじゃ?
  • どういう風にお金儲けをしていくのかというところを話したい
  • 今週初めて触った。動かせてよかった。
  • 情報の引っ張り方にヒントをもらったのが嬉しかった。
  • 次回はApiDemosを見てはどうか
  • ServiceはIntentの理解にいい

次回予定

1月下旬。発表者随時募集中です!お気軽にメール下さい。 egg あっとまーく android-group.jp