Android GPS


안드로이드에서 GPS를 사용하여 사용자의 현재 위치를 얻는 방법을 상세히 설명하겠습니다. 이 과정은 LocationManager나 Google Play 서비스의 FusedLocationProviderClient를 사용하여 수행할 수 있습니다. 여기서는 FusedLocationProviderClient를 사용한 예제를 다루겠습니다.

1. GPS 사용 소개

GPS를 사용하기 위해서는 위치 권한을 요청하고, 위치 업데이트를 수신할 수 있는 방법을 설정해야 합니다. 주요 단계는 다음과 같습니다:

  1. 퍼미션 추가: 위치 접근 권한을 요청합니다.
  2. Google Play 서비스 라이브러리 추가: 프로젝트에 Google Play 서비스 라이브러리를 추가합니다.
  3. 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. 주기적인 위치 업데이트 받기

현재 위치를 한 번 가져오는 대신 주기적으로 위치 업데이트를 받고 싶다면 LocationRequestLocationCallback을 사용해야 합니다.

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


Leave a Reply

Your email address will not be published. Required fields are marked *