본문 바로가기

안드로이드

현재 위치의 지도 보여주기

반응형

안드로이드에서는 앱 화면 안에 지도를 넣을 수 있도록 맵프래그먼트가 제공된다

맵프래그먼트는 새로운 방식의 구글맵 서비스 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