본문 바로가기
안드로이드 자바

[Java][Android] GPS Permission

by teamnova 2021. 5. 21.
728x90

이번 포스팅에서는 사용자의 위치 권한을 받아 위도와 경도를 TextView에 표시하는 예제를 진행하도록 하겠습니다. 

 

우선 예제를 진행할 레이아웃을 그리도록 하겠습니다.

 

activity_g_p_s_permission.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".GPSPermissionActivity">


    <TextView
        android:id="@+id/location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="25sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.406" />

    <Button
        android:id="@+id/btn_get_location"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="64dp"
        android:text="위치 가져오기"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/location" />
</androidx.constraintlayout.widget.ConstraintLayout>

위처럼 레이아웃을 만들고, 위치 가져오기 버튼을 누르면 gps권한이 허용되어 있는지 체크하고 허용되어 있다면 위도, 경도 정보를 TextView에 보여주는 방식으로 구현할 예정입니다. 

 

사용자의 현재 정보 위치를 사용하기 위해 Google Play 서비스 Location API를 사용하도록 하겠습니다.

 

의존성 추가

우선 Location API 사용을 위해서 app.gradle(app)에 의존성을 추가해줍니다.

 

 

매니페스트 권한 추가

그 다음 매니페스트에 아래의 권한을 추가해줍니다.

 

코드 작성

다음으로 권한 요청 후 위도, 경도 값을 가져오는 코드를 작성합니다.

저는 스틱코드를 이용하여 권한요청 코드를 빠르게 불러왔습니다. 

 

stickode.com/code.html?fileno=10030 - request_permission

stickode.com/code.html?fileno=10031 - check_permission

GPSPermissionActivity.java

public class GPSPermissionActivity extends AppCompatActivity {
    private FusedLocationProviderClient fusedLocationClient;    // 현재 위치를 가져오기 위한 변수
    int REQUEST_CODE = 1;
    TextView location_view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_g_p_s_permission);

        //FusedLocationProviderClient의 인스턴스를 생성.
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        // 위도 경도를 보여줄 뷰를 inflate.
        location_view = findViewById(R.id.location);

        // 위치를 가져오기 위한 버튼.
        Button btn_get_location = findViewById(R.id.btn_get_location);
        btn_get_location.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // GPS 권한 요청.
                ActivityCompat.requestPermissions(GPSPermissionActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE);
            }
        });
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {   // 권한요청이 허용된 경우

                if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    Toast.makeText(this, "권한이 없어 해당 기능을 실행할 수 없습니다.", Toast.LENGTH_SHORT).show();    // 권한요청이 거절된 경우
                    return;
                }

                // 위도와 경도를 가져온다.
                fusedLocationClient.getLastLocation()
                        .addOnSuccessListener(this, new OnSuccessListener<Location>() {
                            @Override
                            public void onSuccess(Location location) {
                                // Got last known location. In some rare situations this can be null.
                                if (location != null) {
                                    // 파라미터로 받은 location을 통해 위도, 경도 정보를 텍스트뷰에 set.
                                    location_view.setText("위도: " + location.getLatitude() + " / 경도: " + location.getLongitude());
                                }
                            }
                        });
            }
            else{
                Toast.makeText(this, "권한이 없어 해당 기능을 실행할 수 없습니다.", Toast.LENGTH_SHORT).show();    // 권한요청이 거절된 경우
            }
        }
    }
}

 


결과