반응형
안드로이드에서는 앱 화면 안에 지도를 넣을 수 있도록 맵프래그먼트가 제공된다
맵프래그먼트는 새로운 방식의 구글맵 서비스 v2 기능을 사용할 수 있도록 추가된 기능으로
Google Play service 모듈을 사용한다
Google Play services 라이브러리 사용 설정
xml 레이아웃에 맵프래그먼트 추가
소스 코드에서 내 위치로 지도 이동시키기
매니페스트에 설정 추가하기
지도 api 키
구글에 라이브러리를 검색하여 추가하는 방법이 제일 흔히 쓰이지만, 안드로이드 스튜디오에서 직접 추가할 수도 있다
17.0.1 사용
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a78_locationmap">
<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.A78_LocationMap">
<!-- 구글 지도 사용을 위한 API 키 -->
<meta-data android:name="com.google.android.geo.API_KEY" android:value="AIzaSyCNDA6yHdOheyF540ivwP1GF1JG4tDTaik"/>
<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>
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="내 위치 요청하기" />
<!-- 지도를 보여주기 위한 프래그먼트 추가 -->
<!-- 프래그먼트에서 할당받은 화면 영역에 보이는 것은 클래스 속성으로 지정된 SupportMapFragment -->
<!-- 예전 버전을 지원할 필요가 없다면 MapFragment를 사용할 수도 있다 -->
<fragment
android:id="@+id/map"
class="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity
package com.example.a78_locationmap;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapsInitializer;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// xml 레이아웃에 추가했던 프래그먼트 객체 참조하고 getMapAsync 메소드 호출
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
// 내부적으로 지도를 다루는 GoogleMap 객체를 초기화하는데 비동기 방식으로 처리
mapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(GoogleMap googleMap) {
Log.d("Map", "지도 준비됨.");
map = googleMap;
}
});
try {
MapsInitializer.initialize(this);
} catch (Exception e) {
e.printStackTrace();
}
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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) {
showToast("허용된 권한 갯수 : " + permissions.size());
}
})
.onDenied(new Action<List<String>>() {
@Override
public void onAction(List<String> permissions) {
showToast("거부된 권한 갯수 : " + permissions.size());
}
})
.start();
}
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 메소드는 지도의 Scale을 지정할 수 있으며, 1로 설정되면 가장 멀리서 보는 모습으로 보이며,
// 17이나 18 정도의 값은 도시 지역의 경우 건물 몇개를 한 눈에 볼 수 있을 정도로 확대하여 보여줌
//
// getMaxZoomLevel 메소드를 사용하면 최대로 설정할 수 있는 축적 값을 확인할 수 있음
// 지역에 따라 다르지만 보통 19 또는 21이 최대 축적 값으로 확인됨
map.animateCamera(CameraUpdateFactory.newLatLngZoom(curPoint, 15));
}
}
반응형
'안드로이드' 카테고리의 다른 글
진동과 소리로 알려주기 (0) | 2021.11.10 |
---|---|
지도에 아이콘 추가, 오버레이 (0) | 2021.11.09 |
GPS로 위치 확인 (0) | 2021.11.08 |
유튜브 영상 재생 (0) | 2021.11.06 |
동영상 녹화 (0) | 2021.11.06 |