티스토리 뷰

안드로이드 기반의 스마트폰 위치는 LocationManager라는 시스템 서비스가 관리한다. 실제로 android.location 패키지에는 이 클래스를 포함아여 위치 정보를 확인하거나 확인된 위치 정보를 사용하는 데 필요한 클래스들이 정의되어 있다.

 

현재 단말의 위치를 확인하는 가장 기본적인 방법은 LocationManager에게 위치 정보를 요청하는 것으로 다음 단계를 거친다.

 

  1.  LocationManager 객체 참조: getSystemService() 메서드를 이용하여 호출
  2. 위치 리스너 구현: LocationManager는 현재 위치를 LocationListener를 통해 받게 되므로 새로운 리스너를 구현하여 전달 받은 위치 정보를 처리한다.
  3. 위치 정보 업데이트 요청: LocationManager에게 위치 정보가 변경될 때마다 알려달라고 요청하기 위해 requestLocationUpdates() 메서드를 호출한다.이 메서드의 호출 인자는 LocationListener이다.

바로 한번 확인해보자.


◎MainActivity.java

package com.example.samplegps;

import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.core.app.ActivityCompat;
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 {

    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);

        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) {

                    }
                })
                .onDenied(new Action<List<String>>() {
                    @Override
                    public void onAction(List<String> permissions) {

                    }
                })
                .start();
    }

    public void startLocationService() {
        LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        try {
            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;
            }

            // 이전에 확인했던 위치 정보 가져오기
            // 위치 제공자를 인자로 전달하며, 안드로이드의 위치 제공자는 크게 GPS_PROVIDER 와 NETWORK_PROVIDER 가 있다.
            Location location = manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if(location != null) {
                double latitude = location.getLatitude();
                double longitude = location.getLongitude();
                String message = "최근 위치 => Latitude + " + latitude + "\nLongitude: " + longitude;

                textView.setText(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 (Exception e) {
            e.getStackTrace();
        }
    }

    class GPSListener implements LocationListener {

        @Override
        // 위치가 확인되었을 때 콜백되는 메서드
        public void onLocationChanged(@NonNull Location location) {
            Double latitude = location.getLatitude();
            Double longitude = location.getLongitude();

            String message = "내 위치 -> Latitude : "+ latitude + "\nLongitude:"+ longitude;
            textView.setText(message);
        }

        @Override
        public void onProviderEnabled(@NonNull String provider) {
            LocationListener.super.onProviderEnabled(provider);
        }

        @Override
        public void onProviderDisabled(@NonNull String provider) {
            LocationListener.super.onProviderDisabled(provider);
        }
    }
}

Comments