안드로이드에서 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 기능을 앱에 통합하여 다양한 위치 기반 서비스를 제공할 수 있습니다.
