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

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

Androidで位置情報 その1

Android

いつも仕事への行き帰りは走ったり歩いたりしているので、ログを取ってみることにしました。

今回やること

  • 地図(Google Map)を表示する
  • 一定時間ごとに位置情報を取得して、その場所にマーカーを追加する

準備

APIキー

まずGoogle Mapを使用するにあたってAPIのキーを取得する必要があります。

Google Developers Consoleでプロジェクトを作成し、以下のようなサイトを参考に、[Google Maps Android API v2]を有効にしてAPIキーを取得します。

途中で必要になるフィンガープリント(SHA1)を取得するには、ターミナルで以下のコマンドを実行します(なおYosemiteで実行しましたが、文字化けは発生しませんでした)。

keytool -v -list -keystore ~/.android/debug.keystore

Google Play Services

Google Mapの使用には、SDKマネージャーで[Google Play services]をインストールする必要があります。

Extras>Google Play servicesがインストールされていなければチェックを入れてインストールします。

地図を表示する

  1. プロジェクトを作成してActivityとして[Google Maps Activity]を選択します。
  2. app>res>values>google_maps_api.xmlの中にある[google_maps_key]の「YOUR_KEY_HERE」を準備で取得したAPIキーに置き換えます。
  3. Androidの実機端末を接続して実行します。

以上。

...というのが一番早いのですがw、ここではBlank Activityに色々追加して実現してみます。

※ここから先、地図の表示や現在地の取得などの機能ごとにまとめていきますが、まとめたものを見たい方はGithubに上げたのでそちらをどうぞ。
masanori840816/Roadrawer - GitHub

build.gradle (app)

プロジェクトに[com.android.support:appcompat-v7]と[com.google.android.gms:play-services]を加えてやります。

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

AndroidManifest.xml

ここに追加するのはMap表示に必要なOpenGLの宣言とバージョンの指定、各種権限の指定、Google Play Serviceのバージョン指定、Google APIの指定です。

< ? xml version="1.0" encoding="utf-8" ? >
< manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="jp.co.masanori.roadrawer" >
    < !--OpenGL ES-- >
    < uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" / >
    < !--ネットアクセス-->
    < uses-permission android:name="android.permission.INTERNET"/ >
    < !--ネットワーク状態の取得-->
    < uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/ >
    < !--SDカードへの書き込み-->
    < uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/ >
    < !--Google APIの読み込み-->
    < uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/ >
    < !--ネットワークを使った位置情報の取得-->
    < uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/ >
    < !--GPSを使った位置情報の取得-->
    < uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/ >
    < application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
            < intent-filter >
                < action android:name="android.intent.action.MAIN" / >

                < category android:name="android.intent.category.LAUNCHER" / >
            < /intent-filter >
        < /activity >
        < !--Google Play Servicesのバージョンを指定-- >
        < meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" / >
        < !-- API Keyの指定 -- >
        < meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="取得したAPIキーを記述します"/ >
    < /application >

< /manifest >

activity_main.xml

< 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=".MainActivity" >
    < fragment xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
        android:layout_height="400dp" android:id="@+id/map" tools:context=".MapsActivity"
        android:name="com.google.android.gms.maps.SupportMapFragment" / >
< /RelativeLayout >

MainActivity.java

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MainActivity extends FragmentActivity
{
  private GoogleMap _ggmMap;
  private MainActivity _actMain;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    _actMain = new MainActivity();

    this.showMap();
    this.addMarker(_actMain);
  }
  private void showMap()
  {
    if (_actMain._ggmMap == null)
    {
      // マップの表示.
      _actMain._ggmMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    }
  }
  public void addMarker(MainActivity actMain)
  {
    if (actMain._ggmMap != null)
    {
        // 表示したマップにマーカーを追加する.
        actMain._ggmMap.addMarker(new MarkerOptions().position(
                new LatLng(0, 0)).title("世界さん チーッス"));
    }
  }
}

【参考】

なお、わざわざ「actMain.ggmMap」のようにしているのは、のちにタイマーをセットして、別スレッドから実行するためです。

次回に続きます。