티스토리 뷰
안드로이드에서는 앱 화면 안에 지도를 넣을 수 있도록 MapFragment가 제공된다. MapFragment는 새로운 방식의 구글맵 서비스 v2 기능을 사용할 수 있도록 추가된 기능으로 Google Play Service 모듈을 사용한다.
다음은 XML 레이아웃에서 MapFragment를 추가해서 지도를 보여줄 때 필요한 과정이다.
- Google Play Services 라이브러리 사용 설정
- XML 레이아웃에 MapFragment 추가하기
- 소스코드에서 내 위치로 지도 이동시키기
- Manifest에 설정 추가하기
- 지도 API 추가하기
1. Google Play Services 라이브러리 사용 설정
SDK Manager를 열고
SDK Tools 탭에서 Google Play Service 를 설치한 뒤 체크하여 라이브러리를 사용할 수 있게 만들어준다.
2. XML 레이아웃에 MapFragment 추가하기
프로젝트에 사용할 Google Play Service를 추가하기 위해 Lib를 추가한다.
이제 본격적으로 Google Play Service를 사용할 준비가 되었다.
◎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" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="내 위치 요청하기" />
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment" />
</LinearLayout>
지도를 보여주기 위해 XML 레이아웃에 추가한 프래그먼트에는 class 속성으로 SupportMapFragment라는 이름의 클래스가 할당되어 있다.
이를 소스코드에서 참조하여 사용하려면 getMapAsync() 메서드를 호출하여 GoogleMap 객체를 참조하면 된다.
◎ActivityMain.java
package com.example.samplemap;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
import com.google.android.gms.maps.*;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;
import java.util.List;
public class MainActivity extends AppCompatActivity {
SupportMapFragment mapFragment;
GoogleMap map;
MarkerOptions myLocationMarker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
Log.d("Map", "지도 준비됨");
map = googleMap;
}
});
try {
MapsInitializer.initialize(this);
} catch (Exception e) {
e.getStackTrace();
}
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startLocationService();
}
});
AndPermission.with(this)
.runtime()
.permission(
Permission.ACCESS_FINE_LOCATION,
Permission.ACCESS_COARSE_LOCATION)
.onGranted(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
}
})
.start();
}
@Override
protected void onPause() {
super.onPause();
// 액티비티가 중지될 때 내 위치 표시 비활성화
if (map != null) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
map.setMyLocationEnabled(false);
}
}
@Override
protected void onResume() {
super.onResume();
// 액티비티가 화면에 보일 때 내 위치 표시 활성화
if (map != null) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
map.setMyLocationEnabled(true);
}
}
public void showToast(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
public void startLocationService() {
LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
try {
Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
double latitude = location.getLatitude();
double longitude = location.getLongitude();
String message = "최근 위치 -> Latitude : " + latitude + "\nLongitude:" + longitude;
Log.d("Map", message);
}
GPSListener gpsListener = new GPSListener();
long minTime = 10000;
float minDistance = 0;
manager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
minTime, minDistance, gpsListener);
Toast.makeText(getApplicationContext(), "내 위치확인 요청함",
Toast.LENGTH_SHORT).show();
} catch(SecurityException e) {
e.printStackTrace();
}
}
class GPSListener implements LocationListener {
public void onLocationChanged(Location location) {
Double latitude = location.getLatitude();
Double longitude = location.getLongitude();
String message = "내 위치 -> Latitude : "+ latitude + "\nLongitude:"+ longitude;
Log.d("Map", message);
showCurrentLocation(latitude, longitude);
}
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) { }
}
private void showCurrentLocation(Double latitude, Double longitude) {
// 현재 위치 좌표로 LatLng 객체 생성
LatLng curPoint = new LatLng(latitude, longitude);
// 지정한 위치의 지도 영역 보여주기기
// animateCamera() 메서드로 지도의 축척을 지정할 수 있다 .
map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));
showMyLocationMarker(curPoint);
}
private void showMyLocationMarker(LatLng curPoint) {
if (myLocationMarker == null) {
myLocationMarker = new MarkerOptions();
myLocationMarker.position(curPoint);
myLocationMarker.title("● 내 위치\n");
myLocationMarker.snippet("● GPS로 확인한 위치");
myLocationMarker.icon(BitmapDescriptorFactory.fromResource(R.drawable.mylocation));
map.addMarker(myLocationMarker);
} else {
myLocationMarker.position(curPoint);
}
}
}
◎AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.samplemap">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:usesCleartextTraffic="true"
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/Theme.SampleMap">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyAbotYs-TSgKE8Q-DVW7sDe7MseM6tQ6xY"/>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
또한 API Key는 여기에서 직접 Maps SDK for Android API를 등록하여 발급받을 수 있다.
반응형
'Mobile > Android' 카테고리의 다른 글
[Android] 알림 2: 상단 알림 (0) | 2022.04.26 |
---|---|
[Android] 알림 1: 소리와 진동 (0) | 2022.04.26 |
[Android] 위치 1: GPS로 단말 위치 확인하기 (0) | 2022.04.22 |
[Android] Multi Media 7: Camera2 API 를 사용한 동영상 저장 (0) | 2022.04.22 |
[Android] Multi Media 6: 오디오 녹음하기 (0) | 2022.04.21 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- 인천 구월동 이탈리안 맛집
- redux-thunk
- 파니노구스토
- Promise
- 인천 구월동 맛집
- 정보보안기사 #실기 #정리
- 맛집
- AsyncStorage
- 이탈리안 레스토랑
- redux
- react
- Async
- javascript
- await
- react-native
- Total
- Today
- Yesterday