はじめに
GoogleMapの使い方を簡単に記載します。
前準備
GoogleMapを使うための事前準備として以下の手順を行う
- GoogleMap(Google Maps Android v2 API)のAPIキーを用意する
- AndroidManifest.xmlにAPIキーの設定を行う
- build.gradle(Module:app)にGoogleMapのアドレスをimplementationする
<!-- 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>
// 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を使う場合
// 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>
// 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;
}
}
もしくは
// 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を使う場合
// 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>
// 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;
}
}
こんな感じでActivity内でMapViewを使う方法を書いてみたけど、MapViewを使う意味はない気がする(指摘があったらぜひ教えてください)