티스토리 뷰
안드로이드 프레임워크에서 제공하는 Location 관련 API에 대해 알아보자. LocationManager와 FusedLocationProviderClient는 모두 안드로이드에서 위치 서비스에 사용되지만, 몇 가지 차이점과 구체적인 사용 사례가 있다. LocationManager는 더 많은 제어 기능을 제공하지만 더 많은 관리가 필요한 반면, FusedLocationProviderClient는 사용하기 쉽고 배터리 및 성능에 더 최적화되어 있다. 대부분의 최신 앱의 경우 단순성과 기본 제공 최적화 기능으로 인해 FusedLocationProviderClient가 권장된다.
- LocationManager
- Native API
: 기기의 위치 서비스에 액세스하는 데 사용되는 Android의 오래된 기본 제공 API다. - Providers
: GPS, Network, Passive 등의 프로바이더와 함께 작동해 위치를 파악한다. - Manual Handling
: 최적의 프로바이더를 수동으로 선택해 업데이트를 처리해야 하므로 여러 위치 소스를 결합하기 위한 코드가 더 복잡해질 수 있다. - Energy Efficient
: LocationManager는 전력 소비를 자동으로 최적화하지 않는다. - 예제
: 이 예제에서는 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) {} }; }
- Native API
- FusedLocationProviderClient
- Google Play 서비스의 일부
: Google Play 서비스의 일부인 최신 API로, 위치 서비스를 위한 더 높은 수준의 인터페이스를 제공한다. - Simpler API
: 프로바이더 선택의 복잡성을 추상화하고 최적의 결과를 최적의 프로바이더(GPS, Wi-Fi, 셀룰러)를 자동으로 선택한다. - Power Efficiency
: 앱의 필요에 따라 전력 소비와 정확도의 균형을 자동으로 조정해 전력 효율을 높이도록 설계되었다. - Advanced Features
: geofencing (지오펜싱), activity recognition (활동 인식) 등과 같은 고급 위치 기능을 지원한다. - 예제
: 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 } } }
- Google Play 서비스의 일부
두 예제 모두 ACCESS_FINE_LOCATION 권한이 필요하며, 최신 안드로이드에서는 런타임에 위치 권한을 처리해야 할 수 도 있다. AndroidManifest.xml에 다음이 포함되어 있는지 확인해야 한다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
- Compatibility (호환성)
- Can Be Used Together
: 기술적으로 애플리케이션에서 두 가지를 모두 사용할 수 있고, 일반적으로 중복되는 경우가 많다. FusedLocationProviderClient는 올인원 접근 방식을 제공해 단순성과 효율성으로 인해 최신 안드로이드 개발에 선호된다. - Fallback Option
: 경우에 따라 개발자는 기기에서 Google Play 서비스를 사용할 수 없는 경우 위치 관리자를 대체 옵션으로 사용한다.
- Can Be Used Together
반응형
'기술(Tech, IT) > 안드로이드(Android)' 카테고리의 다른 글
[Android] Listener (리스너) (0) | 2024.11.06 |
---|---|
[Android] ViewCompat.setOnApplyWindowInsetsListener (2) | 2024.11.05 |
[Android] RecyclerView (리싸이클러 뷰) - 2 (0) | 2024.09.28 |
[Android] RecyclerView (리싸이클러 뷰) - 1 (0) | 2024.09.27 |
[Android] Snackbar Vs. Toast (1) | 2024.09.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- defaultdict
- tf-idf
- The Economist Espresso
- DICTIONARY
- Android
- ml
- 이코노미스트
- leetcode
- java
- Hash Map
- machine learning
- 리트코드
- 딕셔너리
- 티스토리챌린지
- C++
- Computer Graphics
- min heap
- socket programming
- 오블완
- vertex shader
- I2C
- 소켓 프로그래밍
- 이코노미스트 에스프레소
- 투 포인터
- join
- 머신 러닝
- 안드로이드
- 파이썬
- Python
- The Economist
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형