위치 기반 서비스(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 |
---|