Google Play Services SDK 다운로드 및 설치
프로젝트에 라이브러리 추가
새로운 빌드 규칙 추가
dependencies {
...
implementation 'com.google.android.gms:play-services-maps:17.0.0'
}
툴바에서 Sync Project with Graddle Files(<img src=
images/sync.png>)
또는 Sync Now 클릭
.footnote[출처: https://developers.google.com/android/guides/releases]
Maps SDK for Android를 사용하려면 Google Cloud Platform Console에 앱 프로젝트를 등록하고 앱에 추가할 수 있는 Google API 키를 가져와야 합니다.
프로젝트 만들기 (또는 선택)
[새프로젝트] 클릭
프로젝트 이름 (MyMapTest) 입력 후, [만들기] 버튼 클릭
화면에서 생성된 MyMapTest 선택
Maps SDK for Android 사용 설정하기
좌측상단의 메뉴 버튼 을 클릭하고 API 및 서비스 > 사용자 인증 정보를 선택합니다.
사용자 인증 정보 페이지에서 사용자 인증 정보 만들기 > API 키를 클릭합니다.
API 키 생성 완료 대화상자에 새로 만든 API 키가 표시됩니다.
닫기를 클릭합니다. 새 API 키는 사용자 인증 정보 페이지의 API 키 아래 나열됩니다.
Google Play 서비스 버전 번호 지정
AndroidManifest.xml의 <application> 요소 내에 다음 선언을 추가합니다.
<application ...>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
</application>
Google 지도 API 키 설정
AndroidManifest.xml의 <application> 요소 내에 다음 선언을 추가하고, 앞서 얻은 API 키를 설정합니다.
<application ...>
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="생성된 API 키를 여기로 붙여넣기" />
...
</application>
Activity에 지도를 위한 프레그먼트 추가
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:orientation="vertical">
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment" />
</LinearLayout>
앱 실행시키기
실제 Android 기기나 에뮬레이터에서 실행
GoogleMap 객체를 사용할 수 있을 때 지도에 마커 및 기타 설정하기 위해서는 다음 절차를 진행
MainActivity에서 OnMapReadyCallback 인터페이스를 구현
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
//...
public void onMapReady(GoogleMap googleMap) {
}
}
MapFragment (또는 MapView) 객체에 OnMapReadyCallback 인스턴스를 설정
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback{
@Override
protected void onCreate(Bundle savedInstanceState) {
//...
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
OnMapReady(GoogleMap) 콜백 메서드를 사용하여 GoogleMap 객체의 획득
public void onMapReady(GoogleMap googleMap) {
LatLng hansung = new LatLng(37.5817891, 127.008175);
googleMap.addMarker(new MarkerOptions().position(hansung).title("한성대학교"));
// move the camera
googleMap.moveCamera(CameraUpdateFactory.newLatLng(hansung));
}
Marker 유형의 객체로, GoogleMap.addMarker() 메소드로 추가됨
public final Marker addMarker (MarkerOptions options)
마커 사용자 설정 항목
마커는 대화형으로 설계되었습니다. 기본적으로 click 이벤트를 수신하고 종종 이벤트 리스너와 함께 사용되어 정보 창을 나타냅니다.
SampleMapTest 프로젝트 다운 링크
MainActivity.java
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback{
GoogleMap mGoogleMap = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Button btn1 = (Button)findViewById(R.id.subway1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mGoogleMap != null) {
LatLng location = new LatLng(37.5882827, 127.006390);
mGoogleMap.addMarker(
new MarkerOptions().
position(location).
title("한성대입구역").
alpha(0.8f).
icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)).
snippet("4호선")
);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location,15));
}
}
});
Button btn2 = (Button)findViewById(R.id.subway2);
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mGoogleMap != null) {
LatLng location2 = new LatLng(37.5793652, 127.015292);
mGoogleMap.addMarker(
new MarkerOptions().
position(location2).
title("창신역").
alpha(0.8f).
icon(BitmapDescriptorFactory.fromResource(R.drawable.arrow)).
snippet("6호선")
);
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location2,15));
}
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
LatLng hansung = new LatLng(37.5817891, 127.009854);
googleMap.addMarker(
new MarkerOptions().
position(hansung).
title("한성대학교"));
// move the camera
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(hansung,15));
mGoogleMap.setOnMarkerClickListener(new MyMarkerClickListener());
}
class MyMarkerClickListener implements GoogleMap.OnMarkerClickListener {
@Override
public boolean onMarkerClick(Marker marker) {
if (marker.getTitle().equals("한성대입구역")) {
Toast.makeText(getApplicationContext(),"한성대입구역을 선택하셨습니다", Toast.LENGTH_SHORT).show();
}
return false;
}
}
}
확대/축소 수준 변경
카메라 위치 변경
[GoogleMap 클래스] public final void moveCamera (CameraUpdate update)
[GoogleMap 클래스] public final void animateCamera (CameraUpdate update, int duration, GoogleMap.CancelableCallback callback)
private static final LatLng SYDNEY = new LatLng(-33.88,151.21);
private static final LatLng MOUNTAIN_VIEW = new LatLng(37.4, -122.1);
private GoogleMap map;
... // Obtain the map from a MapFragment or MapView.
// Move the camera instantly to Sydney with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 15));
// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomIn());
// Zoom out to zoom level 10, animating with a duration of 2 seconds.
map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null);