안드로이드에서 GPS를 사용하여 사용자의 현재 위치를 얻는 방법을 상세히 설명하겠습니다. 이 과정은 LocationManager
나 Google Play 서비스의 FusedLocationProviderClient
를 사용하여 수행할 수 있습니다. 여기서는 FusedLocationProviderClient
를 사용한 예제를 다루겠습니다.
1. GPS 사용 소개
GPS를 사용하기 위해서는 위치 권한을 요청하고, 위치 업데이트를 수신할 수 있는 방법을 설정해야 합니다. 주요 단계는 다음과 같습니다:
- 퍼미션 추가: 위치 접근 권한을 요청합니다.
- Google Play 서비스 라이브러리 추가: 프로젝트에 Google Play 서비스 라이브러리를 추가합니다.
- FusedLocationProviderClient 사용: 위치를 얻기 위해 FusedLocationProviderClient를 사용합니다.
2. 위치 권한 추가
먼저 AndroidManifest.xml
파일에 위치 권한을 추가합니다.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
3. Google Play 서비스 라이브러리 추가
build.gradle
파일에 Google Play 서비스 위치 라이브러리를 추가합니다.
dependencies { implementation 'com.google.android.gms:play-services-location:21.0.1' }
4. FusedLocationProviderClient 사용 예제
이제 사용자의 현재 위치를 얻기 위한 코드를 작성해보겠습니다.
Java 코드 (MainActivity.java
):
import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import com.google.android.gms.tasks.OnSuccessListener; public class MainActivity extends AppCompatActivity { private static final int REQUEST_LOCATION_PERMISSION = 1; private FusedLocationProviderClient fusedLocationClient; private TextView locationTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationTextView = findViewById(R.id.locationTextView); fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); // 위치 권한 요청 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); } else { getLastLocation(); } } private void getLastLocation() { fusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { // 위치를 얻었을 때 if (location != null) { locationTextView.setText("Latitude: " + location.getLatitude() + "\nLongitude: " + location.getLongitude()); } } }); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getLastLocation(); } } } }
레이아웃 파일 (res/layout/activity_main.xml
):
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/locationTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Location will be displayed here" android:layout_centerInParent="true" android:textSize="18sp"/> </RelativeLayout>
5. 주기적인 위치 업데이트 받기
현재 위치를 한 번 가져오는 대신 주기적으로 위치 업데이트를 받고 싶다면 LocationRequest
와 LocationCallback
을 사용해야 합니다.
Java 코드 (MainActivity.java
):
import android.Manifest; import android.content.pm.PackageManager; import android.location.Location; import android.os.Bundle; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; import com.google.android.gms.tasks.OnSuccessListener; public class MainActivity extends AppCompatActivity { private static final int REQUEST_LOCATION_PERMISSION = 1; private FusedLocationProviderClient fusedLocationClient; private LocationCallback locationCallback; private TextView locationTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); locationTextView = findViewById(R.id.locationTextView); fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { locationTextView.setText("Latitude: " + location.getLatitude() + "\nLongitude: " + location.getLongitude()); } } }; if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_LOCATION_PERMISSION); } else { startLocationUpdates(); } } private void startLocationUpdates() { LocationRequest locationRequest = LocationRequest.create(); locationRequest.setInterval(10000); // 10초 마다 위치 업데이트 locationRequest.setFastestInterval(5000); // 최소 5초 마다 위치 업데이트 locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, null); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startLocationUpdates(); } } } @Override protected void onPause() { super.onPause(); fusedLocationClient.removeLocationUpdates(locationCallback); } @Override protected void onResume() { super.onResume(); if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { startLocationUpdates(); } } }
6. 종합
위의 예제에서는 안드로이드에서 GPS를 사용하여 사용자의 위치를 얻는 방법을 다루었습니다. FusedLocationProviderClient
를 사용하여 현재 위치를 한 번 가져오거나, 주기적으로 위치 업데이트를 받는 방법을 설명했습니다. 이를 통해 GPS 기능을 앱에 통합하여 다양한 위치 기반 서비스를 제공할 수 있습니다.