본문 바로가기
  • 개발 삽질 블로그
프로그래밍/Android

안드로이드 위치 기반 서비스(LBS)

by 갹둥 2022. 12. 10.

위치 기반 서비스(Location Based Service)

  • 위치 정보를 수신 받아 다른 정보와 결합하여 위치 특성을 반영한 정보를 제공하는 서비스
  • 스마트폰의 위치 정보 확인 방법: Location Provider를 통해 확인

 

Location Provider

 

GPS: 위성으로부터 위치 정보 수신, 실내에서 사용 어려움

네트워크: 데이터 통신이나 와이파이 정보로 위치 확인, 오차가 비교적 클 수 있음

Beacon: 블루투스와 GPS를 결합하여 초근거리 위치 확인, 오차가 적으나 따로 장치가 필요함

 

 

 


LBS 사용

1) Google Play Services 설치, build.gradle에 Dependency 추가

2) manifest 파일에 Permission 추가

  • permission 종류

ACCESS_COARSE_LOCATION: 거리 블록 정도의 정확도 수준, 이 위치 추정치의 오차 범위는 약 3제곱킬로미터 이내

ACCESS_FINE_LOCATION: 정확한 위치 정확도 수준,  이 위치 추정치의 오차 범위는 일반적으로 약 50미터 이내이며 몇 미터 이내 또는 그 이상으로 정확할 때도 있음

3) permission 실시간 요청: 마쉬멜로 버전 이후 중요한 Permission은 실시간 확인

1. checkSelfPermission()으로 해당 권환 확인

if(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == packageManager.PERMISSION_GRANTED
&& checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == packageManager.PERMISSION_GRANTED){
 //권한이 있을 경우 수행할 동작
 }else{
 	requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, 
    Manifest.permission.ACCESS_COARSE_LOCATION}, REQ_PERMISSION_CODE);
}

 

2. requestPermission()으로 해당 권한 요청

위 코드의 else 부분

 

3. 권한 획득 후 앱 실행

onRequestPermissionsResult() 

 @Override
    public void onRequestPermissionsResult(int requestCode,
                                           @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQ_PERMISSION_CODE:
                if (grantResults.length > 0 &&
                        grantResults[0] == PackageManager.PERMISSION_GRANTED &&
                        grantResults[1] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "위치권한 획득 완료", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "위치권한 미획득", Toast.LENGTH_SHORT).show();
                }
        }
    }

 

4) 기기 위치 확인

 

1. FusedLocationProviderClient 객체 생성

FusedLocationProviderClient flpClient = LocationServices.getFusedLocationProviderClient(this);

FusedLocationProviderClient: LocationManagaer 역할 대체, Google Play Services에서 제공하는 위치 확인 관련 클래스

 

2. LocationRequest 구현

위치 요청 조건 세팅

LocationRequest locationRequest = new LocationRequest();
locationRequest.setInterval(5000) //위치 정보 업데이트 간격(ms)
               .setFastesInterval(1000) //위치 정보 업데이트 최소 간격(ms)
               .setPriority(LocationRequst.PRIORITY_HIGH_ACCURACY); //우선순위 LOCATION PROVIDER 지정

PRIORITY_HIGH_ACCURACY: 정확도가 높은 것 우선으로 사용, GPS

PRIORITY_BALANCED_POWER_ACCURACY: wifi 또는 Cell 네트워크 사용

 

3. LocationCallback 구현

위치정보 수신 결과를 전달받아 처리 동작 지정

onLocationResult를 재정의해야함

LocationCallback locCallback = new LocationCallback(){
	@Override
    public void onLocationResult(@NonNull LocationResult locationResult) {
           //위치 정보를 받아 처리할 작업 지정
        }
}

요청 결과로는 LocationResult 객체가 반환됨

LocationResult: 위치정보들을 보관하는 클래스, getLocations() 함수로 List<Location> 획득 가능

for(Location loc: LocationResult.getLocations()){
	double lat = loc.getLatitude(); //위도 정보 얻기
        double lng = loc.getLongitude(); //경도 정보 얻기
}

 

4. 위치 확인 수행

*위치 관련 Permission이 있어야 함

 flpClient.requestLocationUpdates(locationRequest, locCallback, Looper.getMainLooper());

 

5. 위치 확인 종료

사용자에 의해 종료가 안될 경우를 대비해 위치 확인 종료하는 코드 추가

flpClient.removeLocationUpdates(locCallback);

*onPause() 부분에 추가

 

5) 최종 위치 확인

FusedLocationProviderClient 객체의 getLastLocation() 함수 사용

반환값으로는 Task<Location> 비동기식 객체가 넘어옴

//응답 수신이 성공했을 때 Listener 설정
flpClient.getLastLocation().addOnSuccessListener(
                new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        if (location != null) {
                            //location 정보 처리 
                        } else {
                           
                        }
                    }
                });
//응답 수신이 실패했을 때 Listener 설정
flpClient.getLastLocation().addOnFailureListener(
                new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                       //응답 수신이 실패했을 때 처리
                    }
                }
        );

 

'프로그래밍 > Android' 카테고리의 다른 글

안드로이드 GeoCoding 사용  (0) 2022.12.10