2014/09/20

MapsActivity を表示したら Google Play開発者サービスの更新を求められてしまった場合の対処方法

Android で Google Maps v2 対応の MapsActivity や MapFragment を表示しようとすると、以下のようなエラーが出て表示できないことがあります。

「このアプリの実行には、Google Play開発者サービスの更新が必要です。」


このエラー、要は「Google Play開発者サービス」のバージョンが以下の状態になっているということです。

アプリをビルドする時にリンクしたバージョン > デバイスにインストールされているバージョン

そのため、普通は「更新」ボタンを押してデバイスにインストールされている「Google Play開発者サービス」を最新にすれば良いはずです。

問題点

しかし、そう簡単にいかない場合が存在します。
それは Android Studio がデフォルトでリンクするバージョンが Google Play で提供されているものより新しい場合です。
例えば、以下のように Android Studio のメニューから MapsActivity を追加します。

New → Google → Google Maps Activity

この時、dependencies には以下のように ver. 5.2.08 が追加されます(2014/9/19 現在)。

build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services:5.2.08'
    compile 'com.android.support:appcompat-v7:20.0.0'
}

この時、デバイスにインストール出来る最新の「Google Play開発者サービス」は バージョン 5.0.89 です(2014/9/19 現在)。

「アップデートの削除」ボタンが表示されていることからも最新のものがインストールされていることがわかると思います。
つまり、「更新」ボタンを押しても「アンインストール」か「開く」しか出てこず、更新できないわけです…

解決策

デバイスの方は新しくできないので、ビルドに使用するバージョンを下げるしかありません。
以下のように、play-services のバージョンをデバイスのものと合わせます。

build.gradle
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.gms:play-services:5.0.89'
    compile 'com.android.support:appcompat-v7:20.0.0'
}

これで動くようになるはずです。

2014/09/19

nextFocusForward は imeOptions に actionNext を設定していないと有効にならない

Android の EditText は属性に singleLine を指定していると、自動的に「次へ」というボタンがあらわれ使用しているソフトウェアキーボードによりますが、大抵のものは出てくるはずです、入力後に押すと次の View へ移動してくれるようになります。

この機能、便利なのですが、時々自分の意図していない View に飛んでしまうことがあります。
たとえば、以下のような画面で、矢印のように遷移して欲しいとします。
ところが、デフォルトのままだと、右の View に移動してしまい、想定する動作にはなりません。

こういうときは、nextFocusForward という属性を使用すればよいのですが、単に指定しただけでは駄目です。
以下のように imeOptions に actionNext を指定しないと nextFocusForward は有効にならないのです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MyActivity">

    <EditText
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello world!"
        android:singleLine="true"
        android:imeOptions="actionNext"
        android:nextFocusForward="@+id/hello2"/>

    <EditText
        android:id="@+id/hello2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/hello"
        android:text="Hello world 2"
        android:singleLine="true"
        android:imeOptions="actionNext"
        android:nextFocusForward="@+id/hello3"/>

    <EditText
        android:id="@+id/hello3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/hello"
        android:text="Hello world 3"
        android:singleLine="true" />

</RelativeLayout>

気付くまでに、結構時間を使ってしまった…

2014/09/14

aapt を実行するも No such file or directory と出てコンパイルができなくなった

Ubuntu 14.04 LTS (64bit) を新規インストールしたマシンで Android プロジェクトをビルドしようとしたら、以下のようなエラーが出てビルド出来ませんでした。
R.java が作成されていないようです。
他のマシンではコンパイルが通っているプロジェクトをそのまま持ってきている形なので、プロジェクトには問題がないはず。

Error executing aapt: Cannot run program "/home/yusuke/local/android-studio/sdk/build-tools/19.1.0/aapt": error=2, No such file or directory: error=2, No such file or directory SQLiteViewer line 1 Android ADT Problem

もちろん、表示されているディレクトリに aapt ファイルは存在しているし、実行権限もあります。
困ったなぁと思って、もう一度よく見てみると、その下に Hint なるものが表示されていました。

Hint: On 64-bit systems, make sure the 32-bit libraries are installed: "sudo apt-get install ia32-libs" or on some systems, "sudo apt-get install lib32z1" SQLiteViewer  line 1 Android ADT Problem

なるほど。
ia32-libs か lib32z1 をインストールすればいいのね。14.04 LTS だと lib32z1 をインストールすれば良い様子。
また、lib32z1 をインストールしただけでは、 libstdc++.so.6 が無いって怒られるので、そちらもインストール。

$ sudo apt-get install lib32z1
$ sudo apt-get install lib32stdc++6

これで、無事ビルドが通るようになりました。