Android

[Android] 디바이스 위치: LocationManager

eyoo 2022. 7. 29. 10:12

위치 기반 서비스를 개발하기 위해선 LocationManager를 사용해야 한다.

 

LocationManager 매뉴얼:

https://developer.android.com/reference/android/location/LocationManager

 

LocationManager  |  Android Developers

android.net.wifi.hotspot2.omadm

developer.android.com

 

 

위치 권한을 주기위해 Manifest에서 위치권한을 준다.

 

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

 

 

이제 메인에서 locationManager와 locationListener를 사용해서 사용자의 위치를 위도 경도로 나타내게 한다.

 

public class MainActivity extends AppCompatActivity {

    LocationManager locationManager;
    LocationListener locationListener;

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

        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(@NonNull Location location) {
                Log.i("MyApp", "위도 " + location.getLatitude());
                Log.i("MyApp", "경도 " + location.getLongitude());
            }
        };
        
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                3000, 3, locationListener);

# requestLocationUpdates에서 3000은 ms단위로 시간이 지날때마다 위치를 가져오는것이고, 그 다음 파라미터의 3은 3미터마다 움직이면 갱신된다.

 

 

이때 requestLocationUpdates의 코드가 붉게 변하는데 위치 권한을 사용자로 받아줄수 있도록 Add Permission check를 누른다.

 

 

 

그럼 그 위에 if문이 추가되는데 거기에서 퍼미션, 리퀘스트 코드를 작성한다.

 

public class MainActivity extends AppCompatActivity {

    LocationManager locationManager;
    LocationListener locationListener;

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

        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(@NonNull Location location) {
                Log.i("MyApp", "위도 " + location.getLatitude());
                Log.i("MyApp", "경도 " + location.getLongitude());
            }
        };


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            
            // 퍼미션, 리퀘스트코드
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
            return;
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                3000, 3, locationListener);
    }
}

#  100은 리퀘스트 코드로 설정한것이다.

 

 

이제 onCreate함수 바깥에 onRequestPermissionsResult를 오버라이드 한 후 리퀘스트 코드가 100일때 실행되는 코드를 위에서 가져와 작성한다.

 

public class MainActivity extends AppCompatActivity {

    LocationManager locationManager;
    LocationListener locationListener;

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

        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(@NonNull Location location) {
                Log.i("MyApp", "위도 " + location.getLatitude());
                Log.i("MyApp", "경도 " + location.getLongitude());
            }
        };


        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{ Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
            return;
        }

        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                3000, 3, locationListener);
    }
	
    
    //여기
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if(requestCode == 100){
            if(ActivityCompat.checkSelfPermission(MainActivity.this,
                    Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED &&
                ActivityCompat.checkSelfPermission(MainActivity.this,
                        Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED){

                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                                Manifest.permission.ACCESS_COARSE_LOCATION}, 100);
                return;
            }

            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    3000, 3, locationListener);
        }

    }
}

 

 

에뮬레이터를 실행시키면 권한 설정하라고 나온다

 

 

 

위도 경도가 로그에 잘 찍히는것을 볼수있다.