Google Maps Android API覚え書き

Google Maps Android API v2でとりあえず地図が表示できるところまで試したので、(主に自分用の) メモとして作業手順を書いておきます。

前提バージョン

1. Android Studio上でプロジェクト作成

ここでは以下のように入力。

  • Application Name: SampleMapApp
  • Company Domain: example.org
  • Package name: org.example.samplemapapp
  • Target Android Devices: Phone and Tablet, Minimum SDK: API 15
  • Activity: Blank Activity
  • Activity Name: MainActivity
  • Layout Name: activity_main
  • Title: MainActivity
  • Menu Resource Name: menu_main


2. キーストア作成+アプリ鍵生成

Android Studioのプロジェクト画面上で、Build→Generate Signed APKを選択。

ここで、Key store path: の下のCreate new...を選択する。

New Key Storeのダイアログに、以下のように入力。

  • トップレベ
    • Key store path: C:\android\keystore\sample_keystore.jks
    • Password: <適当なパスワード>
  • Key
    • Alias: googlemaps_appkey
    • Password: <適当なパスワード>
  • Certificate
    • First and Last Name: Sample Name
    • Organization: Example
    • Country Code: JP

ここでOKを押すと、先ほどのGenerate Signed APKのダイアログにパラメータが入った状態になる。

Next→APK Destination Folderを適当に選んでFinish。

3. アプリケーション鍵のSHA1フィンガープリント出力

コマンドプロンプト上で以下のコマンドを実行して、SHA1フィンガープリントを取得する (Mac等の場合は適宜読み替え)。

> cd C:\android\keytool
> keytool -list -keystore sample_keystore.jks

出力結果 (抜粋)

キーストアには1エントリが含まれます

googlemaps_appkey,2015/05/10, PrivateKeyEntry,
証明書のフィンガプリント(SHA1): ***

4. Google Developer Console上でプロジェクト作成&APIキー取得

Webブラウザから、Google Developer Consoleに接続し、今回作るAndroidアプリに対応したプロジェクトを作成し、Google Maps Android API利用のためのAPIキーを取得する。

Google Developer Consoleから「プロジェクトを作成」を選択し、以下のように入力する。

  • プロジェクト名: SampleMapApp
  • プロジェクトID: デフォルトのまま

プロジェクト画面から、APIGoogle Maps Android API→「APIを有効にする」の順に選択する。

さらに、プロジェクト画面から、認証情報→「公開APIへのアクセス」の下の「新しいキーを作成」→「Androidキー」の順に選択する。
Androidキーの作成と許可対象Androidアプリの設定」画面が出てくるので、3で取得したアプリ鍵のSHA1フィンガープリントと、1で作成したパッケージ名をセミコロン区切りで並べて入力し、「作成」を押すと、生成されたAPIキーが表示される。

5. Android StudioプロジェクトへのGoogle Play servicesパッケージの追加

Android Studioでサンプルアプリ用プロジェクト (SampleMapApp) を開き、File→Project Structureを選択する。
Project Structure画面上で、app→Dependenciesのタブを開き、+ボタンを押し、さらに「1 Library dependency」を選択する。

Choose Library Dependencyの画面で、play-servicesを選択して、OKを押す。

この状態で再度OKを押す。

6. AndroidManifestへのAPIキーとパーミッションの追加

Google Play serviceの呼び出しのため、<application>の子要素に以下の記述を追加する。

<meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

<application>の子要素として、4で取得したAPIキーを記述する (以下の "APK_KEY" の部分)。

<meta-data
    android:name="com.google.android.geo.API_KEY"
    android:value="API_KEY" />

<manifest>の子要素としてパーミッションを記述する。
Google Maps Android APIの呼び出しには以下のパーミッションが必須。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

現在位置の取得のためには、以下のパーミッションが追加で必要。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Google Maps Android APIは、地図のレンダリングOpenGL ES version 2を使うため、<manifest>の子要素に以下の記述が必要。

<uses-feature
    android:glEsVersion="0x00020000"
    android:required="true" />

7. レイアウトの記述

res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/map"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:name="com.google.android.gms.maps.MapFragment"/>

8. アプリケーションコードの記述

MainActivity.java

package com.example.samplemapapp;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

9. 署名付きAPKファイルの生成

作成したAndroidアプリをエミュレータあるいは実機で動かすためには、署名付きAPKファイルを生成する必要がある。
Android Studio上で、Build→Generate Signed APKを選択して、1で作成したキーストアおよび鍵を指定する。

生成したAPKファイルをadb installでインストールすると、以下のように地図が表示される。

Android 4.4におけるSDカード書き込みを試してみる

Android 4.4 (Kit Kat) ではアプリからSDカードへの書き込みが制限されたという話を聞きますが、このたびmicroSDカードスロットを持つAndroid 4.4機: HTC J butterfly (HTL23) を入手したので、少し試してみました。

Android 4.4における外部ストレージ関連の仕様

Android公式ドキュメントの Android 4.4 APIs によると、外部ストレージへのアクセスに関して以下の仕様が記述されています。

  • 新設されたgetExternalFilesDirs() により、複数の外部ストレージ (典型的にはエミュレートされたストレージとSDカード) 上のアプリ固有のディレクトリが、Fileオブジェクトの配列として取得できる。
  • getExternalFilesDirs() で得られるFile配列の最初の要素は、デバイスのプライマリ外部ストレージ (primary external storage) とみなされる。これは、従来から用意されているgetExternalFilesDir() の戻り値と同一である。
  • アプリ固有のストレージ領域 (getExternalFilesDirs() で得られるディレクトリ配下) への書き込みには、WRITE_EXTERNAL_STORAGE権限は不要。
  • アプリ間で共有されるストレージ領域 (getExternalStoragePublicDirectory() で得られるディレクトリ配下) への書き込みには、WRITE_EXTERNAL_STORAGE権限が必要。

上記のドキュメントでは明言されていないようですが、HTL23を含む多くのAndroid 4.4機種では、アプリからのSDカードへの書き込みは、アプリ固有ディレクトリ配下に限定されるようです。SDカードのディレクトリ名を取得する標準的な手段が提供されたのは改善点で、SDカードへの書き込みが制限されたのはセキュリティ向上であるにせよ面倒には違いないというところでしょうか。

実験

HTL23は内蔵ストレージ+SDカードという構成で、それぞれ以下のディレクトリが割り当てられています。

  • 内蔵ストレージ: /storage/emulated/0/
  • SDカード: /storage/ext_sd/

Google Playから取得可能なファイルマネージャ系アプリからのファイル作成を試してみると、内蔵ストレージ上には新規ファイルが作れるものの、SDカードには作れないことが分かります。

Android 4.4 API仕様との対応でこの挙動を確認するために、簡単なサンプルアプリを作ってみました。コード全体はGitHubに上げています。
https://github.com/m-kawato/KitKatStorageTest

f:id:m-kawato:20140907231129p:plain

共有ストレージ領域の取得 (Environment.getExternalStorageDirectory())

getExternalStorageDirectory() は、初期のAndroidから用意されているメソッドで、"primary external storage directory" を返すと定義されています。Android APIリファレンスによると、実際のSDカードとは限らず、デバイス内蔵ストレージのディレクトリが返される実装もある旨が記載されています。

Environment | Android Developers

StorageTest.java

String externalDir = Environment.getExternalStorageDirectory().getPath();
// => "/storage/emulated/0"

アプリ固有ディレクトリのリスト取得 (Context#getExternalFilesDirs())

Context#getExternalFilesDirs は、Android 4.4で追加されたメソッドで、内蔵ストレージ・SDカード含めた、アプリ専用に割り当てられたディレクトリのリスト (Fileオブジェクトの配列) を取得します。

StorageTest.java

File[] dirs = getExternalFilesDirs(null);
// =>
// dirs[0].path() == /storage/emulated/0/Android/data/net.m_kawato.storagetest/files
// dirs[1].path() == /storage/ext_sd/Android/data/net.m_kawato.storagetest/files

ファイル書き込みとパーミッション

getExternalFilesDirs() で取得されるディレクトリと、その上位の内部ストレージ/SDカードのトップディレクトリへのファイル書き込みを試行しました。さらに、WRITE_EXTERNAL_STORAGE パーミッションを指定した場合と指定しない場合の違いについても試してみました。

  • (A) 内蔵ストレージ内のアプリ固有領域 /storage/emulated/0/Android/data/net.m_kawato.storagetest/files
  • (B) 内蔵ストレージのトップディレクトリ /storage/emulated/0
  • (C) SDカード内のアプリ固有領域 /storage/ext_sd/Android/data/net.m_kawato.storagetest/files
  • (D) SDカードのトップディレクトリ /storage/ext_sd

AndroidManifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

結果は以下の通りです。

  • (A)(C)は WRITE_EXTERNAL_STORAGE 有無に関わらず成功
  • (B)は WRITE_EXTERNAL_STORAGE を指定した場合に限り成功
  • (D)は WRITE_EXTERNAL_STORAGE 有無に関わらず失敗

(A)(C)については、getExternalFilesDirs() で取得されるディレクトリはパーミッション不要で読み書き可能というAPI仕様に一致します。(B)については、getExternalStorageDirectory() で取得されるストレージ=primary external storageはWRITE_EXTERNAL_STORAGE権限で書き込み可能というAPI仕様に一致します。(D)については明確な記述を見つけられませんでしたが、アプリ固有ディレクトリでもprimary external storageでもないディレクトリは、パーミッション指定に関わらず書き込み禁止と解釈しました。
(primary external storageがSDカードであるようなAndroid 4.4機種が存在するかどうかにも興味がありますが)

f:id:m-kawato:20140908001629p:plain

読書メモ: 『10年後の仕事のカタチ10のヒント シリコンバレーと、アジア新興国から考える、僕達の仕事のゆくえ』

『10年後の仕事のカタチ10のヒント シリコンバレーと、アジア新興国から考える、僕達の仕事のゆくえ』(電子版専用書籍) 読書メモ。

  • 人件費の安い新興国に仕事が移るという状況の中で、どういう働き方をすべきかが全体のテーマ。
  • 個別の技能だけでなく、仕事の「仕組みづくり」が重要 (一方で、得意なことに集中すべしとのアドバイスもあり)。
  • 日本のような先進国ではあたり前のことも、新興国では存在しないことがしばしばあり、そのようなビジネスを立ち上げるのは必ずしも困難ではない (例: 賃貸仲介業者)。
  • 国によっては生活費が日本よりも大幅に安く、「生活するための稼ぎ」のハードルは必ずしも高くない。

世界一/世界初を目指すとかの壮大な目標というよりも、世界の中で自分の生きるポジションをどう確保するかという視点が重要と感じました。

あと、今後日本人の海外移住が進み、海外の日本人コミュニティが拡大するに従って海外移住のハードルが下がるというような要因もあるかなと虫のいいことを考えてみたり。

 

 

Kindle Fire HDファーストインプレッション

3,000円OFFセールに釣られて購入しました。

Kindle Fire HD 16GB タブレット

Kindle Fire HD 16GB タブレット

以下、1週間ほど使ってみたインプレです。総合的には、値段を考えると十分実用的という評価。

  • 表示品質は良好で、ピクセル密度も十分なレベル。
  • 買う前から分かっていたものの、額縁部分が広くてもったいない感じ。特に横幅の表示範囲が狭いように感じる。
  • 指紋はつきやすい部類。
  • Androidタブレットと見ると、ホーム画面はかなりエキゾチックな印象。Kindle for Androidをホーム画面に拡張した感じ。本を読むためのUIと見るとこれはこれで妥当か。
  • Kindle for Androidと比較すると、英文フォントが選択できるのはGOOD。というかKindle for Androidでフォント選択できないのはおかしい。
  • Amazonのアプリストアは充実しているとは言えない。想定の範囲内ではあるものの、他社電子書籍リーダーが軒並みストアから入れられないのは厳しい。
  • Kindle Fire用にapkファイルをWebで配布しているアプリも結構あって重宝する。今までに試した範囲では、BOOK☆WALKERアプリとAldiko Book Readerがこの形で配布していた。
  • アプリ公式サイトでKindle Fire用apkファイルを配布していない場合でもKindle Fireにインストール手段があることは把握しているものの、おそらくKindle Fire上ではまともにテストされていないので実際に試してはいない。