목차: 위치 기반 서비스 및 지도

위치 기반 서비스


Location Service 개요

[출처: https://developer.android.com/training/location/index.html]

1. Google Play Services 설정

[출처: https://developers.google.com/android/guides/setup]

연습1 - 예제 프로젝트 시작하기

2. 위치 접근에 필요한 권한 얻기

3. 마지막으로 알려진 위치 얻기

3.1 통합 위치 정보 제공자 (Fused Location Provider) 클라이언트 객체 얻기

3.2 버튼 클릭시 마지막으로 알려진 위치 가져오기

public class MainActivity extends AppCompatActivity {

    private FusedLocationProviderClient mFusedLocationClient;


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

        mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        Button get_last_location_button = (Button) findViewById(R.id.get_last_location_button);
        get_last_location_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getLastLocation();

            }
        });
    }

    private void getLastLocation() { 
        // to be defined
    }
}

3.3 마지막으로 알려진 위치 가져오기 구현하기 - getLastLocation()

4. 주기적인 위치 업데이트

4.1. 업데이트 시작 버튼/중지 버튼 동작 설정

4.2 주기적인 위치 업데이트 시작

  1. 위치 요청 설정
  2. 위치 업데이트 콜백 정의
  3. 위치 업데이트 요청
    private LocationCallback mLocationCallback;
    final private int REQUEST_PERMISSIONS_FOR_LOCATION_UPDATES = 101;

    private void startLocationUpdates() {
        // 1. 위치 요청 (Location Request) 설정
        LocationRequest locRequest = LocationRequest.create();
        locRequest.setInterval(10000);
        locRequest.setFastestInterval(5000);
        locRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

        // 2. 위치 업데이트 콜백 정의
        mLocationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);

                mLastLocation = locationResult.getLastLocation();
                updateUI();
            }
        };

        // 3. 위치 접근에 필요한 권한 검사
        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,            // MainActivity 액티비티의 객체 인스턴스를 나타냄
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},        // 요청할 권한 목록을 설정한 String 배열
                    REQUEST_PERMISSIONS_FOR_LOCATION_UPDATES    // 사용자 정의 int 상수. 권한 요청 결과를 받을 때
            );
            return;
        }

        // 4. 위치 업데이트 요청
        mFusedLocationClient.requestLocationUpdates(locRequest,
                mLocationCallback,
                null /* Looper */);
    }

https://github.com/kwanulee/AndroidProgramming/blob/master/examples/LocationService/app/src/main/java/com/kwanwoo/android/locationservice/MainActivity.java#L172-L204


4.2.1 위치 요청 설정


4.2.2 위치 업데이트 콜백 정의


4.2.3 위치 업데이트 요청


4.3 주기적인 위치 업데이트 중단하기

5. 주소 찾기

5.1 Geocoding


5.2 위치로부터 주소 얻기 예제 (코드 발췌)

    protected void onCreate(Bundle savedInstanceState) {
        // ...
        
        Button getAddressButton = (Button) findViewById(R.id.address_button);
        getAddressButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getAddress();
            }
        });

    }
    
          
    private void getAddress() {
        TextView addressTextView = (TextView) findViewById(R.id.address_text);
        try {
            Geocoder geocoder = new Geocoder(this, Locale.KOREA);
            List<Address> addresses = geocoder.getFromLocation(mLastLocation.getLatitude(),mLastLocation.getLongitude(),1);
            if (addresses.size() >0) {
                Address address = addresses.get(0);
                addressTextView.setText(String.format("\n[%s]\n[%s]\n[%s]\n[%s]",
                        address.getFeatureName(),
                        address.getThoroughfare(),
                        address.getLocality(),
                        address.getCountryName()
                ));
            }
        } catch (IOException e) {
            Log.e(TAG, "Failed in using Geocoder",e);
        }

    }

https://github.com/kwanulee/AndroidProgramming/blob/master/examples/LocationService/app/src/main/java/com/kwanwoo/android/locationservice/MainActivity.java#L89-L95 https://github.com/kwanulee/AndroidProgramming/blob/master/examples/LocationService/app/src/main/java/com/kwanwoo/android/locationservice/MainActivity.java#L211-L229


5.3 주소 이름으로부터 위치 얻기 예제

try {
    Geocoder geocoder = new Geocoder(this, Locale.KOREA);
*   List<Address> addresses = geocoder.getFromLocationName(input,1);
    if (addresses.size() >0) {
        Address bestResult = (Address) addresses.get(0);

        mResultText.setText(String.format("[ %s , %s ]",
            bestResult.getLatitude(),
            bestResult.getLongitude()));
     }
} catch (IOException e) {
    Log.e(getClass().toString(),"Failed in using Geocoder.", e);
    return;
}

다음 학습: Google 지도