読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

Google Play ServicesとGoogle Maps Android API v2について調べて見たメモ

僕の理解の限りでは、これまではMapViewはActivityでしかつかえず、Fragmentとして使うことができなかった。

作ればわかる! Androidプログラミング 第2版 -SDK4対応- (Smart Mobile Developer)

作ればわかる! Androidプログラミング 第2版 -SDK4対応- (Smart Mobile Developer)


でも、どうしても使いたくなったので、「何か抜け道的なものはないか」と調べていたら、ちょうど数日前(3日くらい?)に公式にサポートされたようだった。ラッキー!

https://developers.google.com/maps/documentation/android/

Maps are now encapsulated in the MapFragment class, an extension of Android's Fragment class. Now you can add a map as a piece of a larger Activity. With a MapFragment object,

MapsはFragmentクラスを継承したMapFragmentクラスに含まれるようになり、Activityの一部にMapFragmentオブジェクトとして追加できるようになりました!

で、詳しく説明を読んでみると「Google Map API v2はGoogle Play services SDKとして配布されることになりました」と書いてある。Google Play servicesSDKというものの存在自体を知らんかった。ので、Google Play servicesSDKについて調べて、かつ、Google Maps Android API v2の動作確認をしたメモ。

Google Play Services

概要
  • 自作アプリ<->Google Play Service <-> Google系のサービスのAPI という感じでMapsとかGoogle+Google系のサービスとの中継役をしてくれる。
  • APK(つまり1アプリケーションとして)としてGoogle Playから配布され、バックグラウンドで動いている。※自分の実機(2.3.3)を設定>アプリケーションで調べたら確かにあった。
  • サポート対象はAndroid2.2以上、かつ、Google Play Storeアプリがインストールされているデバイス
メリット
  • サポートしているサービスのAPIがプラットフォーム依存(サポート対象のデバイスであれば)を気にせずに利用できる。
    • ただしデバイスにインストールされているGoogle Play Serviceのアップデート状況は気にする必要がある(後述)
  • MapsなどのAPIがアップデートされたときに、アップデート内容に興味がなければアプリ開発者は何もしなくてもいい。
  • デバイスに設定されたGoogleアカウントのOAuth2認証情報と連携できる。
  • アプリサイズにもやさしい。のかな?

ここまでの参考:http://developer.android.com/google/play-services/index.html

セットアップ(IntelliJ寄りの手順)
  • SDKマネージャでExtrasの中にある Google Play servicesをインストール。
    • /extras/google/google_play_services/にインストールされる
    • っていうか、ディスク容量がマジでない、とかの事情がなければここらにあるやつは全部入れておいてもいいんじゃない?
  • ライブラリプロジェクトである/extras/google/google_play_services/libproject/google-play-services_libをプロジェクトディレクトリ)/Users/USER_NAME/IdeaProjects)にコピーする
  • Project Structure > Module > +ボタンでNew Module > Library Moduleを選択して、さっきコピーしたディレクトリを選択してFinish
  • Module > 自分のアプリを選択 > Dependenciesタブ選択で、下の+ボタンクリック > Module Dependency...で追加
  • ProGuardを利用している場合は以下のコードを/proguard-project.txtに追加
-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}
デバイスにGoogle Play services APKがインストールされているかの確認
  • 1アプリとして配布するかたちを取る以上、Google Play servicesがインストールされてるかどうかは保証できない。バージョンの状況も同じく。Google Play servicesの状態として考えられるのは以下4つ。
    1. 最新のGoogle Play Storeアプリがインストールされていて、Google Play servicesアプリも最新のものがインストールされている。
    2. 最新のGoogle Play Storeアプリがインストールされているが、Google Play servicesアプリが最新ではない。
    3. Google Play Storeアプリが最新でなく、しかもそれはGoogle Play servicesアプリのアップデートをしない。
    4. Gppgle Play Servicesアプリが消えているか無効にされている。※ユーザーが明示的に行わないとならない。
  • 1が正常かつ、通常の状態だが、他のパターンも起こりうるので、Google Play servicesの状況はチェックし、それぞれの状況に対応する必要がある。
    • 上記チェックはmain activityのonResume()で行うことが望ましい
  • Google Play servicesのクライアントライブラリにはデバイスのGoogle Play servicesアプリの状況をチェックし、必要に応じてGoogle Play Storeに遷移させる機能がある
    • ちなみにGoogle Play servicesは普通にGoogle Play Storeを検索しても見つからないようになっている
  • isGooglePlayServicesAvailable()でチェックできるのでリファレンスをよく読もう。

ちなみになんもやらずにエミュレータで実行してみたらこんな感じになってワラタ。

Updateボタン押すとエラーで落ちるよ。

ここまでの参考:http://developer.android.com/google/play-services/setup.html

Google Maps Android API v2

概要
  • Google Maps Android API v2の導入は以下の手順
    1. Google Play services SDKをセットアップ。※前項で実施済み
    2. API keyをゲットする
      • v1のAPI keyは使えない
    3. Manifestファイルの編集
サンプルコードを使った実習

書き始めたけどちょっと時間がないのと、こちらのサイトのほうが丁寧でいいと思う。
Google Maps Android API v2の使い方

その他
  • 免責事項の掲載必須

Google Maps Android APIを使うんなら、アプリのどこかに「Legal Notices(免責事項)」を表示させてね。とのことです。
文章は GooglePlayServicesUtil.getOpenSourceSoftwareLicenseInfo.で取得できるとのこと。

  • エミュレータじゃ動かねえよ?

最初のほうに書いてあるけど、Google Play servicesの動作条件のひとつに、Google Play Storeがインスコされていること、というのがあって、エミュにはインスコされてないから動かない。グーメン。

が、動かす剛の者が世の中にはいるんですね。
http://nemanjakovacevic.net/blog/2012/12/how-to-make-android-google-maps-v2-work-in-android-emulator/

  • 各種エラー対応
java: RawMapViewDemoActivity.java:19: package com.google.android.gms.maps does not exist

こういう系のコンパイルエラーが出てるときはgoogle-play-services.jarを足してちょ。

java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable

こういう系のランタイムエラーが出てて、IntelliJユーザーの人はここを注目
http://youtrack.jetbrains.com/issue/IDEA-96525
IntelliJのバグで、google-play-services_libみたいにsrcがないLibraryプロジェクトだと、勝手にメインプロジェクトのパッケージとか作られちゃって参照がそっちに食われちゃうからっぽい。
以下のとおり回避するにはダミーのクラス作るっていう。。

With IDEA 12 use following instruction:
1. Copy "google-play-services_lib" into your project directory
2. Create a file Dummy.java in google-play-.../src folder and add the text "class Dummy {}" there (it is needed because of this bug)
3. Go to "File | Import module", choose "google-play-..." directory, then choose "Create module from existing sources"
4. Go through all the wizard steps and make sure that module "google-play-..." is created
5. Add dependency on "google-play-..." for the modules where you would like to use it (File | Project Structure | Modules)

まあ、この様子ならすぐに直してくれるでしょう。

  • mavenでインスコ

maven使ってる人はhttps://github.com/mosabua/maven-android-sdk-deployer←から最新のを落として解凍してmaven-android-sdk-deployer-master/extras/google-play-servicesに行ってmvn installして

        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>3</version>
            <type>apklib</type>
        </dependency>
        <dependency>
            <groupId>com.google.android.gms</groupId>
            <artifactId>google-play-services</artifactId>
            <version>3</version>
            <type>jar</type>
        </dependency>

だ!
※mavenインスコはIntelliJの人は不幸になるかもしれないのでお気をつけください。http://d.hatena.ne.jp/ria10/20121126/1353906139

スマートにプログラミング Android入門編 第3版 SDK4.x対応

スマートにプログラミング Android入門編 第3版 SDK4.x対応