Google 위치 서비스 API에 대한 Android 개발자 가이드

게시 됨: 2022-03-11

사용자의 위치를 ​​아는 것은 오늘날 우리가 개발하고 사용하는 많은 애플리케이션에서 유용한 정보입니다. 우리의 삶을 더 쉽게 만들고 이러한 서비스를 사용하는 방식을 변화시키는 인기 있는 위치 기반 애플리케이션이 많이 있습니다. 예를 들어 시설에 자주 방문하여 "체크인"하는 사용자가 할인을 받는 경우가 많은 인기 있는 애플리케이션 Foursquare가 있습니다. Uber는 일반 택시보다 저렴한 요금으로 휴대 전화에서 승차하도록 도와줍니다. 목록은 방대하고 여전히 증가하고 있습니다.

위치 서비스 API

이 기사에서는 Android의 Google Location Services API를 사용하여 사용자의 위도와 경도를 결정하는 간단한 Android 애플리케이션을 구축할 것입니다. Android 애플리케이션을 개발할 때 사용자의 위치를 ​​파악하는 몇 가지 방법이 있습니다.

패키지 "android.location"

"android.location" 패키지는 Android가 처음 소개되었을 때부터 사용 가능했으며 위치 서비스에 대한 액세스를 제공합니다. 이러한 서비스를 통해 애플리케이션은 장치의 지리적 위치를 주기적으로 업데이트할 수 있습니다.

이 패키지는 위치 데이터를 수집하는 두 가지 방법을 제공합니다.

  • LocationManager.GPS_PROVIDER: 위성을 사용하여 위치를 결정합니다. 조건에 따라 이 공급자는 위치 수정 사항을 반환하는 데 시간이 걸릴 수 있습니다.

  • LocationManager.NETWORK_PROVIDER: 근처 기지국 및 WiFi 액세스 포인트의 가용성에 따라 위치를 결정합니다. 이것은 GPS_PROVIDER보다 빠릅니다.

사용자 위치를 찾을 때 이러한 공급자 및 가용성과 함께 플레이해야 합니다. 이상적으로는 NETWORK_PROVIDER를 사용하여 첫 번째 위치를 얻습니다. 이 방법은 정확하지 않을 수 있지만 훨씬 빠릅니다. 그런 다음 GPS_PROVIDER를 사용하여 더 나은 위치 수정을 수신하여 정확도를 높이려고 시도할 수 있습니다.

이 패키지에서 제공하는 API는 상당히 낮은 수준이며 애플리케이션 개발자는 최적화된 방식으로 위치 데이터를 요청하고 API에 대한 호출을 예약할 시점을 결정하는 세부 사항을 처리해야 합니다. 위치 기반 시스템 서비스에 대한 개발자 경험을 개선하고 위치 인식 애플리케이션 개발 프로세스를 용이하게 하기 위해 Google은 Google Play 서비스를 사용하여 사용자의 위치를 ​​요청하는 새로운 방법을 도입했습니다. 더 높은 정확도, 저전력 지오펜싱 등의 더 간단한 API를 제공합니다.

Google 위치 서비스 API

FusedLocationProviderApi라고도 하는 Google 위치 서비스 API는 Google에서 권장하는 사용자 위치 정보 방법입니다. 우리의 필요에 따라 최고의 정확도를 제공합니다. 이전 API에 비해 이 API를 사용하면 다음과 같은 이점이 있습니다.

  • 단순성: 이전 API와 달리 더 이상 여러 공급자를 처리할 필요가 없습니다. 대신 "높은 정확도" 또는 "저전력"과 같은 높은 수준의 요구 사항을 지정하면 적절한 접근 방식을 취합니다.

  • 가용성: 가장 최근에 알려진 가장 좋은 위치에 앱이 즉시 액세스할 수 있도록 합니다. 일반적으로 이 정보는 쉽게 구할 수 있으므로 요청하기만 하면 됩니다.

  • 전력 효율성: 애플리케이션의 전력 사용을 최소화합니다.

  • 다용성: 매우 정확한 위치 데이터가 필요한 전경 사용에서 배경 사용에 이르기까지 전력 영향을 무시할 수 있는 주기적인 위치 업데이트만 요구하는 광범위한 요구 사항을 충족합니다.

이 API를 사용하여 위치 기반 Android 애플리케이션을 빌드해 보겠습니다. 이를 위해 Google에서 제안한 Android 애플리케이션 개발용 IDE인 Android Studio를 사용합니다. Android Studio를 시작하는 것은 매우 간단합니다. 그들의 웹 사이트는 개발을 위해 첫 번째 Android 애플리케이션을 부트스트랩하는 방법을 포함하여 Android Studio의 설치 및 구성과 관련된 절차를 매우 자세히 설명합니다.

Android Studio를 사용하면 작업이 매우 쉬워집니다. 그러나 먼저 빌드 스크립트를 구성하고 이 애플리케이션에 대한 종속 항목으로 Google Play 서비스를 추가해야 합니다. 이것은 다음과 같이 "build.gradle" 파일을 수정하여 수행할 수 있습니다.

 dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }

이 기사를 작성하는 시점에서 사용 가능한 Google Play 서비스의 최신 버전은 6.5.87입니다. 시작하기 전에 항상 사용 가능한 최신 버전을 확인하십시오. 나중에 새로운 버전이 출시되고 자신의 프로젝트를 위해 업데이트하기로 결정한 경우 지원하는 모든 Android 버전에 대해 모든 위치 관련 기능을 테스트하세요.

이 시점에서 애플리케이션에 대한 실제 작업을 시작할 수 있어야 합니다.

권한 요청, AndroidManifest.xml 구성

Android에는 임의의 애플리케이션이 정확한 사용자 위치를 요청하는 것을 방지하는 특정 보안 기능이 있습니다. 이 문제를 해결하려면 "AndroidManifest.xml"을 편집하고 이 애플리케이션에 필요한 권한을 추가해야 합니다.

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

이 작업을 수행하는 동안 이 애플리케이션에 사용 중인 Google Play 서비스 버전도 정의해야 합니다.

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

Google Play 서비스 가용성 확인

Google Play 서비스에서 제공하는 기능에 액세스하기 전에 장치에 Google Play 서비스가 설치되어 있고 사용하려는 버전(6.5.87)인지 확인해야 합니다.

 private boolean checkGooglePlayServices(){ int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(mContext); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * Google Play Services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mContext, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; }

이 방법은 Google Play 서비스를 확인하고 장치에 설치되어 있지 않은 경우(드물지만 그런 경우를 본 적이 있음) 해당 오류가 있는 대화 상자를 열고 사용자를 설치/업데이트하도록 초대합니다. Google Play 스토어의 Google Play 서비스.

구글 플레이 서비스

사용자가 "GooglePlayServicesUtil.getErrorDialog()"에서 제공한 해결을 완료한 후 "onActivityResult()" 콜백 메서드가 실행되므로 해당 호출을 처리하기 위한 몇 가지 로직을 구현해야 합니다.

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(mContext, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } }

Google API에 액세스

Google API에 액세스하려면 GoogleApiClient의 인스턴스를 만드는 한 단계만 더 수행하면 됩니다. Google API 클라이언트는 모든 Google Play 서비스에 대한 공통 진입점을 제공하고 사용자의 기기와 각 Google 서비스 간의 네트워크 연결을 관리합니다. 여기서 첫 번째 단계는 연결을 시작하는 것입니다. 나는 일반적으로 활동의 "onCreate" 메소드에서 이 코드를 호출합니다.

 protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }

일련의 메서드 호출을 연결하여 콜백 인터페이스 구현과 사용하려는 위치 서비스 API를 지정합니다. 인터페이스 구현(이 경우 "this")은 Google Play 서비스에 대한 연결이 성공, 실패 또는 일시 중단될 때 비동기 "connect()" 메서드에 대한 응답을 수신합니다. 이 코드를 추가한 후 "MainActivity"는 다음과 같아야 합니다.

 package com.bitwoo.userlocation; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationServices; public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkGooglePlayServices()) { buildGoogleApiClient(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private boolean checkGooglePlayServices() { int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(this); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * google play services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, this, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }

그런 다음 "onStart" 메서드에서 "connect" 메서드를 호출하고 "onConnected" 콜백 메서드가 호출될 때까지 기다립니다.

 @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }

"onConnected" 메서드는 다음과 같습니다.

 @Override public void onConnected(Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }

이 콜백은 Google Play 서비스가 연결되면 시작됩니다. 즉, 마지막으로 알려진 위치가 있어야 합니다. 그러나 이 위치는 null일 수 있습니다(드물지만 불가능하지는 않음). 이 경우 다음에 다룰 위치 업데이트를 수신하는 것이 좋습니다.

위치 업데이트 수신 대기

"getLastLocation"을 호출한 후 융합 위치 제공자에게 주기적 업데이트를 요청할 수 있습니다. 신청에 따라 이 기간은 짧을 수도 길 수도 있습니다. 예를 들어, 사용자가 운전하는 동안 사용자의 위치를 ​​추적하는 애플리케이션을 구축하는 경우 짧은 간격으로 업데이트를 수신 대기해야 합니다. 반면에 응용 프로그램이 친구와 사용자 위치를 공유하는 것이라면 가끔 위치를 요청해야 할 수도 있습니다.

요청 생성은 매우 쉽습니다. "onCreate" 메소드 내에서 이 메소드를 호출할 수 있습니다.

 protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }

새로운 LocationRequest 객체를 인스턴스화합니다. 간격을 20초(20000밀리초)로 설정합니다. 또한 제한된 업데이트 속도를 5초로 설정했습니다. 이것은 API가 20초마다(바람직하게) 업데이트를 제공하도록 지시하지만, 5초 기간 내에 사용 가능한 변경 사항이 있으면 그것도 제공해야 합니다. 마지막으로 사용 가능한 다른 우선 순위 옵션인 PRIORITY_BALANCED_POWER_ACCURACY, PRIORITY_LOW_POWER, PRIORITY_NO_POWER 중에서 우선 순위를 "PRIORITY_HIGH_ACCURACY"로 설정합니다.

요청을 작성하고 나면 "onConnected()" 메소드가 실행된 후 위치 업데이트 수신을 시작할 준비가 된 것입니다.

 protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }

이제 LocationListener 인터페이스를 만족시키는 콜백 메서드를 구현하는 것만 남았습니다.

 public class MainActivity extends ActionBarActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // ... @Override public void onLocationChanged(Location location) { mLastLocation = location; Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } } 

업데이트 수신 중지

업데이트 수신 중지

업데이트가 더 이상 필요하지 않거나 사용자가 애플리케이션을 떠날 경우 업데이트 수신을 명시적으로 중지하는 것이 중요합니다. "onPause" 콜백 내에서 다음 메서드를 호출해야 합니다.

 protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }

... Google API 연결 해제:

 @Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }

마무리

보시다시피 Android에서 위치 인식 애플리케이션을 구현하는 기본 아이디어는 매우 간단합니다. 또한 사용하기 쉽고 이해하기 쉬운 사용 가능한 API를 사용하여 Android용 기본 위치 기반 애플리케이션을 구축하는 것은 쉬운 일이 아닙니다. 여기에서 구축한 작은 샘플 애플리케이션은 정확히 그것을 보여주기 위한 것입니다. GitHub에서 이에 대한 전체 소스 코드를 찾을 수 있습니다. 간단하게 하기 위해 응용 프로그램은 "onConnectionFailed" 콜백 메서드를 처리하지 않습니다.

이 튜토리얼이 Google Location Services API 사용을 시작하는 데 도움이 되기를 바랍니다.