Android から Google Drive にアクセス時のエラーメッセージ

年末に Android から Google Drive にアクセスする方法を調べてみたのだけど、とりあえずは Google の QuickStart アプリを動かすことにした。
https://github.com/googledrive/android-quickstart


Android Studio でサクっと起動してアカウント選択画面が表示されたのだけど、アカウントを選択してもまたアカウント選択画面になって先に進まない…。


ログには下記のメッセージが表示されている。

GoogleApiClient connection failed: ConnectionResult{statusCode=SIGN_IN_REQUIRED...

ググると stackoverflow のこんなページが見つかった
http://stackoverflow.com/questions/23736137/onconnectionfailed-geving-sign-in-required


けど、ちょっと違うかな〜と悩んでいたらピコン!と思い出した。

「アプリの OAuth 2.0 の設定してなかった…」

というわけで、Google Developer Console で OAuth 2.0 の設定をしたら問題は解決!

Kotlin の Android Extensions でワーニング

Kotlin の Android Extensions を使うと findViewById から解放されて気持ち良くなれるのだけど、気が付いたら View の id の部分にこんなワーニングが出てる。

Use properties from the build variant packages

気持ち悪いので調べてみたら
http://stackoverflow.com/questions/34107344/what-does-the-warning-use-properties-from-the-build-variant-packages-mean/34117173
ということだそうだ。


特に build bariants を増やしたりしていないので今回は main を指定すれば良いのかな。


というわけで、オリジナルの import の部分

import kotlinx.android.synthetic.activity_panorama.*

これを下記の様に修正してワーニングは消えました!

import kotlinx.android.synthetic.main.activity_panorama.*

AndroidStudioのbuild.gradleに出るワーニング(エラー)

AndroidStudioをアップデートして、以前の設定をそのまま使うようにすると

default config cannot be applied to groovy.lang.closure

なんてワーニングが出て、なんともうざったい状態になることがある。

これを解消する手順をメモ。


とりあえず、検索すると出てくるのはここ。
http://stackoverflow.com/questions/29133601/buildtypes-cannot-be-applied-to-groovy-lang-closure
ここでは問題は

buildTypes cannot be applied to groovy.lang.closure

になっているけど、原因は同じ。

設定で gradle の場所を指定しているところに、指定された gradle がないのが原因。

たぶん、アップデート時に gradle もアップデートされて、本来ならそこへのパスが設定に書き込まれるのだろうけど、以前の設定をそのまま使うようにしたから見つからなくて困ってる。

というわけで、設定画面で現在の gradle の場所(ファイル)を指定しなおせば問題は解決。

AndroidStudioでgradleがキャッシュが壊れているというエラー

さっきまでちゃんとビルドできていたプロジェクト、急に gradle がエラーを出してビルドできなくなった…。

Error:org.gradle.api.internal.changedetection.state.DefaultFileCollectionSnapshotter$FileCollectionSnapshotImpl cannot be cast to org.gradle.api.internal.changedetection.state.OutputFilesCollectionSnapshotter$OutputFilesSnapshot
Possible causes for this unexpected error include:<ul><li>Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
<a href="syncProject">Re-download dependencies and sync project (requires network)</a></li><li>The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
<a href="stopGradleDaemons">Stop Gradle build processes (requires restart)</a></li></ul>In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

言われるままに AndroidStudio を終了して、念のために iMac を再起動して試みるも、やはり同じエラーが出て先に進めない。
ProjectをReBuildしたりしてもダメ!


というわけで、Google 先生に聞いてみたら教えてくれたのが以下のページ。
やはり安定の stackoverflow!

教えに従ってターミナルから {project dir}/.gradle/2.2.1 を削除。
念のために AndroidStudioを再起動してからプロジェクトを読み込んでビルドしてみると…無事エラーなしで終了!
良かった〜。

ちょっと Kotlinっぽく書き換えてみる

自動でコンバートした状態でも問題なく動きますが、実はテンプレートのファイルが古い?為に deprecated なメソッドを呼んでいる箇所があります。
45行目の getMap() です。
今は getMap() でなく、非同期だけど返ってくる GoogleMap が null にならない、getMapAsync() を使うことになっています。
というわけで、この部分とここから呼び出される setUpMap を少し書き換えてみました。

    private fun setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            (getSupportFragmentManager().findFragmentById(R.id.map) as SupportMapFragment)
                .getMapAsync({(googleMap:GoogleMap) -> setUpMap(googleMap)})
        }
    }

    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p/>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private fun setUpMap(googleMap: GoogleMap) {
        mMap = googleMap
        googleMap.addMarker(MarkerOptions().position(LatLng(0.0, 0.0)).title("Marker"))
    }

これで、deprecated なメソッドはなくなって、getMapAsync() の呼び出しも Javaっぽくなくなりました。
もちろん、動作も問題ありません。
(!!がどうにも嫌だったのでこんな書き方になってますが…)


というわけで、GoogleMapテンプレートで作った地図アプリを Kotlin にコンバートして動かしてみました。
基本的に”自動”でコンバートしてくれるので、特に難しいところはありません。
あとは、位置情報を取得したり、画面を書き換えたり、ジオフェンスでアラート出したりする部分をガシガシ kotlin で書いてみると、その良さをもっともっと感じられると思います。

Android Studio のテンプレートにある Google Map を Kotlin で動かしてみる

環境が整ったので、Android Studio のテンプレートにある Google Map を Kotlin にコンバートして動かしてみます。

まずは、Google Map のテンプレートでプロジェクトを新規作成します。

ウイザートに従って…


これで Java のプロジェクトが作成されました。
もちろんコードも Java です。


まずは、表示されている google_maps_api.xml の内容に従って api キーを取得して書き換えておきます。
(Kotlin は関係ない部分なので詳細は省略)


api キーの書き換えが終わったら MainActivity.java を選択して表示します。


次に [Code] メニューの [Convert Java File to Kotlin File] を実行します。


サクっと MainActivity.java が MainActivity.kt になりました。簡単!


アラートが表示されていますが、気にせずにプロジェクトを Kotlin 対応にします。
[Tools] メニューの [Kotlin] から [Configure Kotlin in Project] を実行します。


ダイアログには [OK] と答えます。


これでプロジェクトが Kotlin 対応になりました。
build.gradle に変更が加えられたので、画面に表示された [Sync Now] をクリックします。


更に「Kotlin external annotations for Android SDK are not set for 'Android API 21 Platform' Set up Kotlin Android SDK annotations」と表示されるので、[Set up Kotlin Android SDK annotations] をクリックします。


ここで MainActivity.kt を見ると「Kotlin file in Gradle Project should be under source root with name 'kotlin'」と表示されています。
(先ほどスルーしたアラートです)


現在 MainActivity.kt は java フォルダに入っていますが、Kotlin の .kt ファイルは kotlin フォルダに入れなければなりません。
が、まだ kotlin フォルダがないので source root に kotlin フォルダを作成します。
app/src/main を選択して、コンテキストメニューの [New] から [Directory] を実行して kotlin フォルダを作成します。


すると、先ほどのアラートの右に [Move file] が表示されるので、これをクリックすると MainActivity.kt ファイルが今作成した kotlin フォルダに移動します。


以上で、プロジェクト及び MainActivity.java の Kotlin へのコンバートが終了しました。


しかし、このままではまだ MainActivity.kt にエラーがあって実行できません。


Double を渡すところに integer を渡しているのでこれを修正します。


とりあえず、エラーは無くなったので早速実行です!

ちゃんと、マップが表示されました〜!

Android Studio に kotlin のプラグインをインストール

今回は Kotlin の下記のページを参考に、Android Studio を使って Android アプリを作成します。

まずは Android Studio に Kotlin のプラグインをインストールします。プラグインは一度インストールしてしまえば、2度目以降はインストールする必要ありません。
参考ページには .kt の拡張子のファイルを作成すれば、Android Studioプラグインをインストールするかどうか確認してくれるとも書いてありますが、今回はAndroid Studio のコマンドを呼び出してプラグインをインストールします。

1. Android Studio の Preferences... メニューを開きます


2. 左のリストから Plug-in を選択します


3. 検索窓に kotlin と入力して、browse をクリックします


4. 表示されたリストから Kotlin を選択、表示された install ボタンをクリックしてインストールを開始します


5. ダイアログでは OK をクリックします


6. インストールが終わると Restart Android Studio ボタンが表示されるので Close をクリックして表示されるダイアログで Restart ボタンをクリックして Android Studio を再起動します

以上でプラグインのインストールは完了です。