Android で GoogleMAP を使ってみる

# はじめに

GoogleMapの使い方を簡単に記載します。

# 前準備

GoogleMapを使うための事前準備として以下の手順を行う
1. GoogleMap(Google Maps Android v2 API）のAPIキーを用意する
1. AndroidManifest.xmlにAPIキーの設定を行う
1. build.gradle(Module:app)にGoogleMapのアドレスをimplementationする



```xml
<!-- AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="hoge.example.googlemapsample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
        <!-- ここにAPIキーを追加する -->
        <meta-data
        android:name="com.google.android.geo.API_KEY"
        android:value="@string/google_maps_key"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>
```

```gradle
// build.gradle(Module:app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "hoge.example.com.googlemapsample"
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.google.android.gms:play-services-maps:11.0.2'  // GoogleMapを使うために追加する

    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:0.5'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'
}
```

# GoogleMapの使い方

Android Studioの新規作成で選択できる「Google Map Activity」を使って動作確認をいましたが、
画面全体ではなく一部のエリアに表示したかったのでレイアウトにある MapView を使ってみる事にしました。
しかし調べてみると以下の事が分かりました。


+ MapViewをビューとして使用するには、MapActivityを継承する必要がある。
+ com.google.android.maps.MapActivity（Google Maps Android v1 API）は現在はサポートされていない
+  Google Maps Android v1 API 用のAPIキーを新規発行出来ない(現在の発行されているAPIキーを使うとグレー表示のままになる)
+ そのため現在ではGoogleMap(Google Maps Android v2 API）を使う。
+ GoogleMapを使う為にはgetMapAsync()を MapFragment か MapView を使って呼び出さなくてはならない。

結論から言うと MapView は MapActivity を継承せずに使う事が出来るが MapFragment は必ず使う必要があると言う事が分かった。

以下に地図を表示する簡単なサンプルを残して置きます(__AndroidManifest.xmlにAPIキーを設定する__こと__ build.gradle(Module:app)にGoogleMapのアドレスをimplementationする__ことを絶対に忘れない事)

# Fragmentを使う場合

```xml
// activity_map_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapActivity">

    <TextView
        android:text="filename: sample.jpg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="経度: 59.0311"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:text="緯度: 130.1515666"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/mapFragment"
        android:name="com.google.android.gms.maps.MapFragment"/>

</LinearLayout>
```


```java
// MapActivity.java
public class MapActivity extends AppCompatActivity implements OnMapReadyCallback {

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

        MapFragment mapFragment = (MapFragment) getFragmentManager()
                .findFragmentById(R.id.mapFragment);

        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        GoogleMap mMap= googleMap;
    }
}
```

もしくは

```java
// MapActivity.java
public class MapActivity extends FragmentActivity implements OnMapReadyCallback{

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

    @Override
    public void onMapReady(GoogleMap googleMap) {
        GoogleMap mMap= googleMap;
    }
}
```


# MapViewを使う場合

```xml
// activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <!--ソース上でフラグメントを生成して地図を表示する-->
    <com.google.android.gms.maps.MapView
        android:layout_gravity="center"
        android:id="@+id/mapView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        tools:layout_editor_absoluteX="42dp"
        tools:layout_editor_absoluteY="105dp"/>
</LinearLayout>
```

```java
// MainActivity.java
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // MapFragmentの生成
        MapFragment mapFragment = MapFragment.newInstance();

        // MapViewをMapFragmentに変更する
        FragmentTransaction fragmentTransaction =
                getFragmentManager().beginTransaction();
        fragmentTransaction.add(R.id.mapView, mapFragment);
        fragmentTransaction.commit();

        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
    }
}
```

![Screenshot_20171107-161759.jpg](https://qiita-image-store.s3.amazonaws.com/0/112253/a69cedc4-ed0b-1b3a-8e2f-586e81db25f9.jpeg)

こんな感じでActivity内でMapViewを使う方法を書いてみたけど、MapViewを使う意味はない気がする(指摘があったらぜひ教えてください)