본문 바로가기
Android Studio

[Android Studio] 나의 앱에서 카카오맵 열기 _ 현재 사용자 위치기반으로 설정된 위치에서 길 찾기

by 처카푸 2024. 7. 12.

나의 앱에서 카카오맵 열기 

_ 현재 사용자의 위치에서 내가 설정해 둔 위치까지 길 찾는 앱 페이지로 만들기

 

1. 카카오맵에서 준비한 api 사용 설명서 읽기

( https://apis.map.kakao.com/android_v2/docs/api-guide/urlscheme/#%EA%B8%B8%EC%B0%BE%EA%B8%B0 )

- 길 찾기 URL Scheme을 사용해서 앱에서 카카오맵을 열기로 했다.

 

2. 안드로이드 스튜디오

-  app/manifests/AndroidManifest.xml 파일에 위치 정보 가져오는 코드 추가

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

 

- main 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

- MainActivity.java 코드 작성

public class MainActivity extends AppCompatActivity {

    Button button;
	
    // 로케이션 매니저, 리스너 사용
    LocationManager locationManager;
    LocationListener locationListener;
    // 사용자 위치 멤버변수로 받기
    Double currentLat;
    Double currentLng;

    @SuppressLint("MissingInflatedId")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = findViewById(R.id.button);

        // 위치 관리자 객체 가져오기
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        // 위치 권한 확인 및 요청
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED
                && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    100);
        } else {
            // 위치 정보 요청
            requestLocationUpdates();
        }

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 위치 정보가 없으면 메시지 출력
                if (currentLat == null || currentLng == null) {
                    Toast.makeText(MainActivity.this, "현재 위치를 가져오는 중입니다. 잠시 후 다시 시도해주세요.", Toast.LENGTH_SHORT).show();
                    return;
                }

                try {
                    // 내가 설정한 도착지 좌표, 매장 위치 위도는 37.54130563627117, 경도는 126.67636881196708
                    Double endLat = 37.54130563627117;
                    Double endLng = 126.67636881196708;

                    // URL Scheme
                    String url = "kakaomap://route?sp=" + currentLat + "," + currentLng + "&ep=" + endLat + "," + endLng + "&by=PUBLICTRANSIT";

                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                } catch (ActivityNotFoundException e) {
                    // 카카오 맵이 설치되어 있지 않은 경우 처리
                    Toast.makeText(MainActivity.this, "카카오 맵이 설치되어 있지 않습니다.", Toast.LENGTH_LONG).show();
                }
            }
        });

    }

    // 위치 정보 요청 메서드
    private void requestLocationUpdates() {
        locationListener = new LocationListener() {
            @Override
            public void onLocationChanged(@NonNull Location location) {
                // 위치가 변경될 때 호출됨
                currentLat = location.getLatitude();
                currentLng = location.getLongitude();
                Log.i("GPS MAIN", "위도 : " + currentLat + ", 경도 : " + currentLng);
            }

        };

        // 위치 업데이트 요청 (최소 시간 간격: 5초, 최소 거리: 0미터)
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            // 허용하시겠습니까? 물어보는 것
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    100);
            return;
        }
        locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 5000, 0, locationListener);
    }

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

        if (requestCode == 100) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 권한이 승인됨
                // 위치 정보 요청 다시 시작
                requestLocationUpdates();
            } else {
                // 사용자가 권한을 거부함
                Toast.makeText(this, "위치 권한이 필요합니다.", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 액티비티가 종료될 때 위치 업데이트 중지
        if (locationManager != null && locationListener != null) {
            locationManager.removeUpdates(locationListener);
        }
    }


}

 

3. 앱 실행

- 버튼을 누르면 카카오 맵 앱이 실행되고, 내가 지정한 위치로 잘 가져오는 것을 확인할 수 있다.