티스토리 뷰

안드로이드 프레임워크에서 제공하는 Location 관련 API에 대해 알아보자. LocationManager와 FusedLocationProviderClient는 모두 안드로이드에서 위치 서비스에 사용되지만, 몇 가지 차이점과 구체적인 사용 사례가 있다. LocationManager는 더 많은 제어 기능을 제공하지만 더 많은 관리가 필요한 반면, FusedLocationProviderClient는 사용하기 쉽고 배터리 및 성능에 더 최적화되어 있다. 대부분의 최신 앱의 경우 단순성과 기본 제공 최적화 기능으로 인해 FusedLocationProviderClient가 권장된다.

 

  1. LocationManager
    1. Native API
      : 기기의 위치 서비스에 액세스하는 데 사용되는 Android의 오래된 기본 제공 API다.
    2. Providers
      : GPS, Network, Passive 등의 프로바이더와 함께 작동해 위치를 파악한다.
    3. Manual Handling
      : 최적의 프로바이더를 수동으로 선택해 업데이트를 처리해야 하므로 여러 위치 소스를 결합하기 위한 코드가 더 복잡해질 수 있다.
    4. Energy Efficient
      : LocationManager는 전력 소비를 자동으로 최적화하지 않는다.
    5. 예제
      : 이 예제에서는 requestLocationUpdates() 를 사용해 주기적인 위치 업데이트를 요청한다. 권한 및 위치 변경을 수동으로 처리해야 한다.
      import android.Manifest;
      import android.content.Context;
      import android.content.pm.PackageManager;
      import android.location.Location;
      import android.location.LocationListener;
      import android.location.LocationManager;
      import android.os.Bundle;
      import android.widget.Toast;
      import androidx.annotation.NonNull;
      import androidx.core.app.ActivityCompat;
      import androidx.appcompat.app.AppCompatActivity;
      
      public class LocationManagerExample extends AppCompatActivity {
      
          private LocationManager locationManager;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
      
              if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
                  return;
              }
      
              locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, locationListener);
          }
      
          private final LocationListener locationListener = new LocationListener() {
              @Override
              public void onLocationChanged(@NonNull Location location) {
                  double latitude = location.getLatitude();
                  double longitude = location.getLongitude();
                  Toast.makeText(LocationManagerExample.this, "Lat: " + latitude + ", Lon: " + longitude, Toast.LENGTH_SHORT).show();
              }
      
              @Override
              public void onStatusChanged(String provider, int status, Bundle extras) {}
              @Override
              public void onProviderEnabled(@NonNull String provider) {}
              @Override
              public void onProviderDisabled(@NonNull String provider) {}
          };
      }
  2. FusedLocationProviderClient
    1. Google Play 서비스의 일부
      : Google Play 서비스의 일부인 최신 API로, 위치 서비스를 위한 더 높은 수준의 인터페이스를 제공한다.
    2. Simpler API
      : 프로바이더 선택의 복잡성을 추상화하고 최적의 결과를 최적의 프로바이더(GPS, Wi-Fi, 셀룰러)를 자동으로 선택한다.
    3. Power Efficiency
      : 앱의 필요에 따라 전력 소비와 정확도의 균형을 자동으로 조정해 전력 효율을 높이도록 설계되었다.
    4. Advanced Features
      : geofencing (지오펜싱), activity recognition (활동 인식) 등과 같은 고급 위치 기능을 지원한다.
    5. 예제
      : getLastLocation()을 사용해 마지막으로 알려진 위치를 가져온다. 더 간단하며 공급자 선택을 자동으로 처리한다. 추가로 requestLocationUpdates() 를 사용해 FusedLocationProviderClient로 실시간 추적을 할 수 있다.
      import android.Manifest;
      import android.content.pm.PackageManager;
      import android.location.Location;
      import android.os.Bundle;
      import android.widget.Toast;
      import androidx.annotation.NonNull;
      import androidx.core.app.ActivityCompat;
      import androidx.appcompat.app.AppCompatActivity;
      import com.google.android.gms.location.FusedLocationProviderClient;
      import com.google.android.gms.location.LocationServices;
      import com.google.android.gms.tasks.OnSuccessListener;
      
      public class FusedLocationProviderClientExample extends AppCompatActivity {
      
          private FusedLocationProviderClient fusedLocationClient;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
      
              if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                  ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
                  return;
              }
      
              fusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
                  @Override
                  public void onSuccess(Location location) {
                      if (location != null) {
                          double latitude = location.getLatitude();
                          double longitude = location.getLongitude();
                          Toast.makeText(FusedLocationProviderClientExample.this, "Lat: " + latitude + ", Lon: " + longitude, Toast.LENGTH_SHORT).show();
                      }
                  }
              });
          }
      
          @Override
          public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
              if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                  recreate(); // Retry permission-dependent code after being granted
              }
          }
      }


두 예제 모두 ACCESS_FINE_LOCATION 권한이 필요하며, 최신 안드로이드에서는 런타임에 위치 권한을 처리해야 할 수 도 있다. AndroidManifest.xml에 다음이 포함되어 있는지 확인해야 한다.

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

 

  • Compatibility (호환성)
    • Can Be Used Together
      : 기술적으로 애플리케이션에서 두 가지를 모두 사용할 수 있고, 일반적으로 중복되는 경우가 많다. FusedLocationProviderClient는 올인원 접근 방식을 제공해 단순성과 효율성으로 인해 최신 안드로이드 개발에 선호된다.
    • Fallback Option
      : 경우에 따라 개발자는 기기에서 Google Play 서비스를 사용할 수 없는 경우 위치 관리자를 대체 옵션으로 사용한다.
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형