준비물 링크 복사
  • 안드로이드 스튜디오(Android Studio) Ladybug 2024.2.2 버전 이상
  • 카카오디벨로퍼스에서 앱 등록 및 네이티브 앱 키 발급

여기서는 Android Studio Iguana | 2023.2.1 기준으로 작성하였습니다. 사용하는 버전에 따라 화면 및 세부 내용은 문서 내 설명과 다를 수 있습니다.

개발 환경 설정하기 링크 복사

1. 안드로이드 스튜디오 기본 설정하기 링크 복사

  1. 안드로이드 스튜디오를 설치한 다음, 상단 메뉴바에서 ToolsSDK Manager를 클릭합니다.

  2. Languages & FrameworksAndroid SDKSDK Platform를 클릭합니다.
    (버전별로 Android SDK 메뉴에 진입하는 경로는 다를 수 있습니다.)

  3. 아래 화면과 같이 API Level을 선택한 다음 Apply를 눌러 설치합니다.

    표 1 설치할 API Level 리스트
    Name API Level
    Android 14.0 ("UpsideDownCake") 34
    Android 13.0 ("Tiramisu") 33
    Android 12L ("Sv2") 32
    Android 12.0 ("S") 31
    Android 11.0 ("R") 30
    Android 10.0 ("Q") 29
    Android 9.0 ("Pie") 28
    Android 8.1 ("Oreo") 27
    Android 8.0 ("Oreo") 26
    Android 7.1.1 ("Nouget") 25
    Android 7.0 ("Nouget") 24
    Android 6.0 ("Marshmallow") 23
    Android 5.1 ("Lollipop") 22
    Android 5.0 ("Lollipop") 21
  4. SDK Tools를 클릭하고 아래의 리스트를 선택한 다음 Apply를 눌러 설치합니다.

    표 2 설치할 SDK Tools 리스트
    Name
    Android SDK Build-Tools
    Android SDK Command-line Tools
    Android SDK Platform-Tools
    Google Play APK Expansion library

2. 환경 변수 설정하기 링크 복사

터미널 어디에서나 위에서 설치한 항목들에 접근할 수 있도록 환경 변수를 설정합니다.

1. 터미널을 실행합니다. 터미널이 zsh 쉘을 사용하고 있다면 nano .zshrc를 입력하고, 그렇지 않다면 nano .bash_profile을 입력합니다.

2. 환경 변수 파일이 열리면 아래 명령어를 입력합니다.

export ANDROID_HOME=$HOME/Library/Android/sdk/
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export ANDROID_HOME=$HOME/Library/Android/sdk/
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
코드가 숨겨졌습니다.

3. control을 누른 상태에서 x 키와 y 키를 차례대로 누른 다음 엔터를 눌러 종료합니다. 터미널에서 adb --version을 입력하여 설정이 잘 되었는지 확인합니다.

내 프로젝트 생성하기 링크 복사

  1. 안드로이드 스튜디오를 실행한 후 ProjectsNew Project를 클릭합니다.

  2. Templates에서 Phone and TabletEmpty Activity를 선택한 후 Next를 클릭합니다.

  3. 프로젝트의 이름, 저장 장소 등을 설정합니다. Language는 Kotlin으로, Minimum SDK는 23 이상으로 설정합니다. 설정이 완료되면 Finish를 클릭합니다.



성공적으로 프로젝트가 생성되면 아래와 같이 나타납니다.

카카오디벨로퍼스에서 내 애플리케이션 등록하기 링크 복사

길찾기 SDK를 사용하려면 반드시 앱 등록과 SDK 초기화를 위한 네이티브 앱 키를 발급 받아야 합니다.

1. 앱 등록하기 링크 복사

[카카오디벨로퍼스에서 진행]

  1. 카카오디벨로퍼스에 로그인하세요. 계정이 없을 경우, 회원 가입을 한 후 다음 단계를 진행하세요.

  2. 로그인 후, 화면 오른쪽 상단에서 앱 생성을 클릭하세요.

  3. 아래 각 항목에 추가할 내용을 확인하여 앱을 추가하세요.


    • 앱 아이콘: 앱 아이콘으로 사용할 이미지를 추가합니다. 권장하는 이미지의 사이즈는 128 px * 128 px이며 최대 250 KB 크기의 파일을 등록할 수 있습니다. 지원하는 파일 포맷은 JPG, GIF, PNG입니다.

    • 앱 이름: 내 앱(서비스)의 이름을 설정합니다. * 필수 입력 사항

    • 회사명: 사업자명을 입력합니다. 사업자 정보와 동일한 이름을 사용해야 합니다. * 필수 입력 사항

      주의: 앱(서비스) 이름은 공백 포함 30자까지 입력할 수 있습니다.

    • 카테고리: 서비스의 카테고리를 선택합니다. * 필수 입력 사항

    • 앱 대표 도메인: 서비스의 대표 도메인을 입력합니다.

  4. 각 항목을 입력하고, 운영 정책에서 제한하는 사항에 해당하지 않은지 확인 후, 저장을 눌러 앱을 생성하세요.

    생성된 앱은 에서 확인할 수 있습니다.

2. 키 해시 생성하기 링크 복사

SDK를 사용하려면 앱 인증을 위해 키 해시가 필요합니다. 키 해시는 안드로이드 스튜디오의 터미널에서 keytool을 사용하여 생성합니다.

  1. 안드로이드 스튜디오 열고 상단 메뉴에서 ViewTerminal을 클릭합니다.
  2. 아래 명령어를 입력하여 키 해시를 생성합니다. 키 저장소의 비밀번호는 android입니다.
    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
    
    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
    
    keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
    
    keytool -exportcert -alias androiddebugkey -keystore %USERPROFILE%\.android\debug.keystore -storepass android -keypass android | openssl sha1 -binary | openssl base64
    
    코드가 숨겨졌습니다.
    3. 생성된 키 해시 값은 다음 단계에서 서비스 정보 등록 시 입력합니다.

    3. 서비스 정보 등록하기 링크 복사

    [카카오디벨로퍼스에서 진행]

    SDK 초기화에는 네이티브 앱 키가 필요하며, 사용 전 서비스 정보를 카카오디벨로퍼스에 등록해야 합니다.

    1. → 앱 키를 발급할 앱 선택 → 플랫폼 키을 클릭하세요.

    2. 네이티브 앱 키 추가 또는 생성된 기본 키를 선택하세요.

    3. 필요한 서비스 정보 항목을 등록하세요.

    • 네이티브 앱 키: 발급된 키 값과 상태를 확인하고 복사할 수 있습니다.
    • 키 이름: 키를 식별하기 위한 이름을 지정합니다. * 필수 입력 사항
    • 패키지명: Android 앱의 고유 식별자로, AndroidManifest.xml의 package 속성에서 확인할 수 있습니다.
    • (Android) 스토어 URL: 앱 미설치 시 이동할 Play Store URL을 등록합니다. 패키지명을 입력하면 기본 URL이 자동 설정됩니다.
    • (Android) 키 해시: Android 앱 서명 키의 식별자로, SDK 사용을 위해 필수로 등록해야 합니다. 키 해시 생성하기 단계에서 생성한 해시 값을 입력합니다.
    • 스킴: 해당 키에 발급된 앱 스킴 정보를 확인할 수 있습니다.
    • 추가 정보: 키의 활성화 상태와 생성일, 수정일 정보를 확인할 수 있습니다.

    4. 네이티브 앱 키 확인하기 링크 복사

    [카카오디벨로퍼스에서 진행]

    1. → 앱 키를 발급할 앱 선택 → 플랫폼 키을 클릭하세요.
    2. 네이티브 앱 키 값을 복사하여 사용하세요.

    자세한 내용은 카카오디벨로퍼스앱 설정을 참고하세요.

    길찾기 SDK 라이브러리 추가하기 링크 복사

    1. 라이브러리 위치 지정하기 링크 복사

    안드로이드 스튜디오 버전에 따라 라이브러리 위치 지정 방법이 다릅니다. 사용 중인 버전을 확인한 후 아래 코드를 입력합니다.

      // 위치: Project → build.gradle 
      allprojects {
        repositories {
            google()
            jcenter()
            maven { url "https://devrepo.kakaomobility.com/repository/kakao-mobility-android-knsdk-public/" }
            maven { url "https://www.jitpack.io" } 
        }
      }
      
      // 위치: Project → build.gradle 
      allprojects {
        repositories {
            google()
            jcenter()
            maven { url "https://devrepo.kakaomobility.com/repository/kakao-mobility-android-knsdk-public/" }
            maven { url "https://www.jitpack.io" } 
        }
      }
      
      // 위치: Project → settings.gradle
      dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            google()
            mavenCentral()
            maven { url "https://devrepo.kakaomobility.com/repository/kakao-mobility-android-knsdk-public/"}
            maven { url "https://www.jitpack.io" }
        }
      }    
      
      // 위치: Project → settings.gradle
      dependencyResolutionManagement {
        repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
        repositories {
            google()
            mavenCentral()
            maven { url "https://devrepo.kakaomobility.com/repository/kakao-mobility-android-knsdk-public/"}
            maven { url "https://www.jitpack.io" }
        }
      }    
      
      코드가 숨겨졌습니다.

      2. 라이브러리 버전 지정하기 링크 복사

      Projectappbuild.gradle 파일의 dependencies 섹션에 아래 코드를 추가하여 프로젝트에서 사용할 길찾기 SDK의 라이브러리 버전을 지정합니다.

      implementation 'com.kakaomobility.knsdk:knsdk_ui:1.9.4'
      
      implementation 'com.kakaomobility.knsdk:knsdk_ui:1.9.4'
      
      코드가 숨겨졌습니다.

      3. viewBinding 설정하기 링크 복사

      길찾기 SDK는 viewBinding을 사용합니다. 생성한 프로젝트에서도 viewBinding을 사용할 수 있도록 설정하세요. Projectappbuild.gradle 파일의 android 섹션에 아래 코드를 추가합니다.

      buildFeatures{
        viewBinding = true
      }
      
      buildFeatures{
        viewBinding = true
      }
      
      코드가 숨겨졌습니다.

      앱 생성 및 SDK 초기화하기 링크 복사

      KNApplication 클래스를 생성하여 길찾기 SDK를 초기화합니다.

      1. Projectappsrcmainjava → '프로젝트명'을 클릭한 다음 마우스 오른쪽을 누르고 NewKotlin Class/File을 클릭합니다.

      2. 파일명 입력칸에 KNApplication을 입력하고 엔터를 누릅니다.

      3. ProjectappsrcmainAndroidManifest.xml 파일을 클릭합니다.

      4. application 하위의 android:name.KNApplication을 아래와 같이 입력합니다.

      5. Projectappsrcmainjava → '프로젝트명' → KNApplication을 클릭한 다음 아래 코드를 입력합니다.

      class KNApplication : Application() {
          companion object {
              lateinit var knsdk: KNSDK
          }
          override fun onCreate() {
              super.onCreate()
              initialize()
          }
          /**
           * 길찾기 SDK의 초기화 및 파일이 저장될 경로를 설정합니다
           */
          fun initialize() {
              knsdk = KNSDK.apply {
                  //  파일 경로: data/data/com.kakaomobility.knsample/files/KNSample
                  install(this@KNApplication, "$filesDir/KNSample")
              }
          }
      }
      
      class KNApplication : Application() {
          companion object {
              lateinit var knsdk: KNSDK
          }
          override fun onCreate() {
              super.onCreate()
              initialize()
          }
          /**
           * 길찾기 SDK의 초기화 및 파일이 저장될 경로를 설정합니다
           */
          fun initialize() {
              knsdk = KNSDK.apply {
                  //  파일 경로: data/data/com.kakaomobility.knsample/files/KNSample
                  install(this@KNApplication, "$filesDir/KNSample")
              }
          }
      }
      
      코드가 숨겨졌습니다.

      인증 버튼 생성 및 연결하기 링크 복사

      인증 버튼을 생성하고 이를 통해 권한 체크, 인증, 주행 기능을 연결합니다.

      1. 인증 버튼 레이아웃 구성하기 링크 복사

      Projectappsrcmainreslayoutactivity_main.xml 파일을 클릭하고 아래 코드를 입력합니다.

      <!-- 인증 버튼 생성 -->
      <Button
          android:id="@+id/btn_guide"
          android:layout_width="120dp"
          android:layout_height="60dp"
          android:textColor="@color/black"
          android:textSize="14sp"
          android:text="인증하기"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
      
      <!-- 인증 버튼 생성 -->
      <Button
          android:id="@+id/btn_guide"
          android:layout_width="120dp"
          android:layout_height="60dp"
          android:textColor="@color/black"
          android:textSize="14sp"
          android:text="인증하기"
          app:layout_constraintBottom_toBottomOf="parent"
          app:layout_constraintEnd_toEndOf="parent"
          app:layout_constraintStart_toStartOf="parent"
          app:layout_constraintTop_toTopOf="parent" />
      
      코드가 숨겨졌습니다.

      2. 생성한 인증 버튼 연결하기 링크 복사

      생성한 인증 버튼을 MainActivity로 연결합니다.
      ProjectappsrcmainjavaMainActivity을 클릭하고 아래 코드를 입력합니다.

      class MainActivity : AppCompatActivity(), View.OnClickListener {
      
          lateinit var btnGuide: Button
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
      
              btnGuide = findViewById(R.id.btn_guide)
              btnGuide.setOnClickListener(this)
          }
      
          // 버튼 클릭 이벤트
          override fun onClick(v: View?) {
      
          }
      }
      
      class MainActivity : AppCompatActivity(), View.OnClickListener {
      
          lateinit var btnGuide: Button
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
      
              btnGuide = findViewById(R.id.btn_guide)
              btnGuide.setOnClickListener(this)
          }
      
          // 버튼 클릭 이벤트
          override fun onClick(v: View?) {
      
          }
      }
      
      코드가 숨겨졌습니다.

      3. GPS 위치 권한 확인하기 링크 복사

      인증 버튼을 눌렀을 때 GPS 위치 권한을 확인하는 이벤트를 추가합니다.
      ProjectappsrcmainjavaMainActivity을 클릭하고 아래 코드를 입력합니다.

      /**
       * 버튼 클릭 이벤트
       */
      override fun onClick(v: View?) {
          checkPermission()
      }
      
      
      /**
       * GPS 위치 권한을 확인합니다.
       */
      fun checkPermission() {
          when {
              checkSelfPermission(
                  Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED -> {
                  // GPS 퍼미션 체크
              }
      
              else -> {
                  // 길찾기 SDK 인증
              }
          }
      }
      
      /**
       * 버튼 클릭 이벤트
       */
      override fun onClick(v: View?) {
          checkPermission()
      }
      
      
      /**
       * GPS 위치 권한을 확인합니다.
       */
      fun checkPermission() {
          when {
              checkSelfPermission(
                  Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED -> {
                  // GPS 퍼미션 체크
              }
      
              else -> {
                  // 길찾기 SDK 인증
              }
          }
      }
      
      코드가 숨겨졌습니다.

      4. GPS 위치 권한 요청하기 링크 복사

      GPS의 위치 정보를 받아오기 위해 위치 권한을 요청합니다.
      ProjectappsrcmainjavaMainActivity을 클릭하고 아래 코드를 입력하고, gpsPermissionCheck() 함수를 checkPermission() 함수에 넣어 줍니다.

      /**
       * GPS 위치 권한을 요청합니다.
       */
      fun gpsPermissionCheck() {
          ActivityCompat.requestPermissions(
              this,
              arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
              1234)
      }
      
      /**
       * GPS 위치 권한 요청의 실패 여부를 확인합니다.
       */
      override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults)
          when (requestCode) {
              1234 -> {
                  if (grantResults.isNotEmpty() &&
                      grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      
                      // 다시 권한 요청하는 곳으로 돌아갑니다.
                      checkPermission()
                  }
              }
          }
      }
      
      /**
       * GPS 위치 권한을 요청합니다.
       */
      fun gpsPermissionCheck() {
          ActivityCompat.requestPermissions(
              this,
              arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
              1234)
      }
      
      /**
       * GPS 위치 권한 요청의 실패 여부를 확인합니다.
       */
      override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults)
          when (requestCode) {
              1234 -> {
                  if (grantResults.isNotEmpty() &&
                      grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      
                      // 다시 권한 요청하는 곳으로 돌아갑니다.
                      checkPermission()
                  }
              }
          }
      }
      
      코드가 숨겨졌습니다.

      5. 길찾기 SDK 인증하기 링크 복사

      ProjectappsrcmainjavaMainActivity을 클릭하고 아래 코드를 입력하고, knsdkAuth() 함수를 checkPermission() 함수에 넣어 줍니다.

      /**
       * 길찾기 SDK 인증을 진행합니다.
       */
      fun knsdkAuth() {
          KNApplication.knsdk.apply {
              initializeWithAppKey(
                  aAppKey = "0ba1d1fc31e0a7c50107a819ac9f858c",       // 카카오디벨로퍼스에서 부여 받은 앱 키
                  aClientVersion = "1.0.0",                                               // 현재 앱의 클라이언트 버전
                  aUserKey = "testUser",                                                  // 사용자 id
                  aLangType = KNLanguageType.KNLanguageType_KOREAN,   // 언어 타입
                  aCompletion = {
      
                      // Toast는 UI를 갱신하는 작업이기 때문에 UIThread에서 동작되도록 해야 합니다.
                      runOnUiThread {
                          if (it != null) {
                              Toast.makeText(applicationContext, "인증에 실패하였습니다", Toast.LENGTH_LONG).show()
      
                          } else {
                              Toast.makeText(applicationContext, "인증 성공하였습니다", Toast.LENGTH_LONG).show()
      
                              var intent = Intent(this@MainActivity, NaviActivity::class.java)
                              this@MainActivity.startActivity(intent)
                          }
                      }
                  })
          }
      }
      
      /**
       * 길찾기 SDK 인증을 진행합니다.
       */
      fun knsdkAuth() {
          KNApplication.knsdk.apply {
              initializeWithAppKey(
                  aAppKey = "0ba1d1fc31e0a7c50107a819ac9f858c",       // 카카오디벨로퍼스에서 부여 받은 앱 키
                  aClientVersion = "1.0.0",                                               // 현재 앱의 클라이언트 버전
                  aUserKey = "testUser",                                                  // 사용자 id
                  aLangType = KNLanguageType.KNLanguageType_KOREAN,   // 언어 타입
                  aCompletion = {
      
                      // Toast는 UI를 갱신하는 작업이기 때문에 UIThread에서 동작되도록 해야 합니다.
                      runOnUiThread {
                          if (it != null) {
                              Toast.makeText(applicationContext, "인증에 실패하였습니다", Toast.LENGTH_LONG).show()
      
                          } else {
                              Toast.makeText(applicationContext, "인증 성공하였습니다", Toast.LENGTH_LONG).show()
      
                              var intent = Intent(this@MainActivity, NaviActivity::class.java)
                              this@MainActivity.startActivity(intent)
                          }
                      }
                  })
          }
      }
      
      코드가 숨겨졌습니다.

      주행 화면 생성하기 링크 복사

      내비게이션 주행 화면을 구성합니다.

      1. NaviActivity Class 파일 생성하기 링크 복사

      1. Projectappsrcmainjava → '프로젝트명'을 클릭한 다음 마우스 오른쪽을 누르고 NewKotlin Class/File을 클릭합니다.
      2. 파일명 입력칸에 NaviActivity를 입력하고 엔터를 누릅니다.

      2. 레이아웃 생성하기 링크 복사

      NaviActivity 파일에 연결될 레이아웃을 생성합니다.

      1. Projectappsrcmainreslayout을 클릭한 다음 마우스 오른쪽을 누르고 NewLayout Resource File을 클릭합니다.
      2. File nameactivity_navi를 입력하고 OK를 누릅니다.
      3. 내비게이션 주행 화면을 구성하는 KNNaviView를 activity_navi.xml 파일에 추가해야 합니다.
        Projectappsrcmainreslayoutactivity_navi.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"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >
      
          <!-- 주행화면 생성 -->
          <com.kakaomobility.knsdk.ui.view.KNNaviView
              android:id="@+id/navi_view"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              app:layout_constraintBottom_toBottomOf="parent"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent" />
      
      </androidx.constraintlayout.widget.ConstraintLayout>
      
      <?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"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >
      
          <!-- 주행화면 생성 -->
          <com.kakaomobility.knsdk.ui.view.KNNaviView
              android:id="@+id/navi_view"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              app:layout_constraintBottom_toBottomOf="parent"
              app:layout_constraintEnd_toEndOf="parent"
              app:layout_constraintStart_toStartOf="parent"
              app:layout_constraintTop_toTopOf="parent" />
      
      </androidx.constraintlayout.widget.ConstraintLayout>
      
      코드가 숨겨졌습니다.

      3. 주행 화면 테마 추가하기 링크 복사

      내비게이션 주행 화면의 테마를 설정합니다.
      Projectappsrcmainresvalues → themes.xml 파일을 클릭하고 아래 코드를 입력합니다.

      <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="windowActionBar">false</item>
          <item name="windowNoTitle">true</item>
      </style>
      
      <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="windowActionBar">false</item>
          <item name="windowNoTitle">true</item>
      </style>
      
      코드가 숨겨졌습니다.

      4. AndroidManifest 등록하기 링크 복사

      Projectappsrcmain → AndroidManifest.xml 파일을 클릭하고 아래 코드를 입력합니다.

      <activity
          android:name=".NaviActivity"
          android:configChanges="orientation"
          android:theme="@style/AppTheme"/>
      
      <activity
          android:name=".NaviActivity"
          android:configChanges="orientation"
          android:theme="@style/AppTheme"/>
      
      코드가 숨겨졌습니다.

      주행 화면 구성하기 링크 복사

      위에서 생성한 NaviActivity에서 경로 요청부터 주행까지 구성합니다.

      1. 레이아웃 파일 연결하기 링크 복사

      1. Projectappsrcmainjava → '프로젝트명' → NaviActivity를 클릭한 다음 아래 코드와 같이 설정되어 있는지 확인합니다. 그렇지 않다면 아래의 코드로 변경합니다.
      class NaviActivity : AppCompatActivity() {
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_navi) 
          }
      }
      
      class NaviActivity : AppCompatActivity() {
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_navi) 
          }
      }
      
      코드가 숨겨졌습니다.

      2. 클래스 내에서 KNNaviView를 선언하고, onCreate() 함수 내에 layout에 생성한 KNNaviView를 아래와 같이 연결합니다.

      naviView = findViewById(R.id.navi_view)
      
      naviView = findViewById(R.id.navi_view)
      
      코드가 숨겨졌습니다.

      3. 주행 화면에서 상태바 영역까지 사용하기 위해 아래 코드를 추가합니다.

      // status bar 영역까지 사용하기 위한 옵션
      window?.apply {
        statusBarColor = Color.TRANSPARENT
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
      }
      
      // status bar 영역까지 사용하기 위한 옵션
      window?.apply {
        statusBarColor = Color.TRANSPARENT
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
      }
      
      코드가 숨겨졌습니다.

      2. 경로 요청 구성하기 링크 복사

      서버에 목적지까지의 경로를 요청합니다. requestRoute 함수를 생성하고, onCreate에서 requestRoute 함수를 호출할 수 있도록 아래 코드를 추가합니다.

      /**
       * 주행 경로를 요청합니다.
       */
      fun requestRoute() {
          Thread {
              // 출발지와 목적지를 설정합니다.
              val startPoi = KNPOI("현위치",309840,552483,"현위치")
              val goalPoi = KNPOI("목적지",321497,532896,"목적지")
      
              KNApplication.knsdk.makeTripWithStart(
                  aStart = startPoi,
                  aGoal = goalPoi,
                  aVias = null
              ) { aError, aTrip ->
      
                  // 경로 요청이 성공하면 aError는 Null이 됩니다.
                  if (aError == null) {
                      
                  }
              }
          }.start()
      }
      
      /**
       * 주행 경로를 요청합니다.
       */
      fun requestRoute() {
          Thread {
              // 출발지와 목적지를 설정합니다.
              val startPoi = KNPOI("현위치",309840,552483,"현위치")
              val goalPoi = KNPOI("목적지",321497,532896,"목적지")
      
              KNApplication.knsdk.makeTripWithStart(
                  aStart = startPoi,
                  aGoal = goalPoi,
                  aVias = null
              ) { aError, aTrip ->
      
                  // 경로 요청이 성공하면 aError는 Null이 됩니다.
                  if (aError == null) {
                      
                  }
              }
          }.start()
      }
      
      코드가 숨겨졌습니다.

      3. 주행 구성하기 링크 복사

      요청한 경로를 바탕으로 주행을 시작할 준비를 합니다. startGuide 함수를 생성하고, 경로 요청이 성공했을 때 startGuide 함수를 호출할 수 있도록 아래 코드를 추가합니다.

      fun startGuide(trip: KNTrip?) {
          KNApplication.knsdk.sharedGuidance()?.apply {
              // guidance delegate 등록
              guideStateDelegate = this@NaviActivity
              locationGuideDelegate = this@NaviActivity
              routeGuideDelegate = this@NaviActivity
              safetyGuideDelegate = this@NaviActivity
              voiceGuideDelegate = this@NaviActivity
              citsGuideDelegate = this@NaviActivity
      
              naviView.initWithGuidance(
                  this,
                  trip,
                  KNRoutePriority.KNRoutePriority_Recommand,
                  0
              )
          }
      }
      
      fun startGuide(trip: KNTrip?) {
          KNApplication.knsdk.sharedGuidance()?.apply {
              // guidance delegate 등록
              guideStateDelegate = this@NaviActivity
              locationGuideDelegate = this@NaviActivity
              routeGuideDelegate = this@NaviActivity
              safetyGuideDelegate = this@NaviActivity
              voiceGuideDelegate = this@NaviActivity
              citsGuideDelegate = this@NaviActivity
      
              naviView.initWithGuidance(
                  this,
                  trip,
                  KNRoutePriority.KNRoutePriority_Recommand,
                  0
              )
          }
      }
      
      코드가 숨겨졌습니다.

      4. Delegate 연결하기 링크 복사

      주행 정보 및 상태를 KNNaviView로 넘겨 주기 위한 Delegate를 연결합니다.

      GuideStateDelegate 링크 복사

      1. NaviActivityKNGuidance_GuideStateDelegate를 아래와 같이 선언합니다.

      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate 
      
      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate 
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun guidanceCheckingRouteChange(aGuidance: KNGuidance) {
        naviView.guidanceCheckingRouteChange(aGuidance)
      }
      
      override fun guidanceDidUpdateRoutes(aGuidance: KNGuidance, aRoutes: List<KNRoute>, aMultiRouteInfo: KNMultiRouteInfo?) {
        naviView.guidanceDidUpdateRoutes(aGuidance, aRoutes, aMultiRouteInfo)
      }
      
      override fun guidanceGuideEnded(aGuidance: KNGuidance) {
        naviView.guidanceGuideEnded(aGuidance)
      }
      
      override fun guidanceGuideStarted(aGuidance: KNGuidance) {
        naviView.guidanceGuideStarted(aGuidance)
      }
      
      override fun guidanceOutOfRoute(aGuidance: KNGuidance) {
        naviView.guidanceOutOfRoute(aGuidance)
      }
      
      override fun guidanceRouteChanged(aGuidance: KNGuidance) {
        naviView.guidanceRouteChanged(aGuidance)
      }
      
      override fun guidanceRouteUnchanged(aGuidance: KNGuidance) {
        naviView.guidanceRouteUnchanged(aGuidance)
      }
      
      override fun guidanceRouteUnchangedWithError(aGuidnace: KNGuidance, aError: KNError) {
        naviView.guidanceRouteUnchangedWithError(aGuidnace, aError)
      }
      
      override fun guidanceCheckingRouteChange(aGuidance: KNGuidance) {
        naviView.guidanceCheckingRouteChange(aGuidance)
      }
      
      override fun guidanceDidUpdateRoutes(aGuidance: KNGuidance, aRoutes: List<KNRoute>, aMultiRouteInfo: KNMultiRouteInfo?) {
        naviView.guidanceDidUpdateRoutes(aGuidance, aRoutes, aMultiRouteInfo)
      }
      
      override fun guidanceGuideEnded(aGuidance: KNGuidance) {
        naviView.guidanceGuideEnded(aGuidance)
      }
      
      override fun guidanceGuideStarted(aGuidance: KNGuidance) {
        naviView.guidanceGuideStarted(aGuidance)
      }
      
      override fun guidanceOutOfRoute(aGuidance: KNGuidance) {
        naviView.guidanceOutOfRoute(aGuidance)
      }
      
      override fun guidanceRouteChanged(aGuidance: KNGuidance) {
        naviView.guidanceRouteChanged(aGuidance)
      }
      
      override fun guidanceRouteUnchanged(aGuidance: KNGuidance) {
        naviView.guidanceRouteUnchanged(aGuidance)
      }
      
      override fun guidanceRouteUnchangedWithError(aGuidnace: KNGuidance, aError: KNError) {
        naviView.guidanceRouteUnchangedWithError(aGuidnace, aError)
      }
      
      코드가 숨겨졌습니다.
      LocationGuideDelegate 링크 복사

      1. NaviActivityKNGuidance_LocationGuideDelegate를 아래와 같이 선언합니다.

      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate 
      
      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate 
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun guidanceDidUpdateLocation(aGuidance: KNGuidance, aLocationGuide: KNGuide_Location) {
        naviView.guidanceDidUpdateLocation(aGuidance, aLocationGuide)
      }
      
      override fun guidanceDidUpdateLocation(aGuidance: KNGuidance, aLocationGuide: KNGuide_Location) {
        naviView.guidanceDidUpdateLocation(aGuidance, aLocationGuide)
      }
      
      코드가 숨겨졌습니다.
      RouteGuideDelegate 링크 복사

      1. NaviActivityKNGuidance_RouteGuideDelegate를 아래와 같이 선언합니다.

       class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate
      
       class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun guidanceDidUpdateRouteGuide(aGuidance: KNGuidance, aRouteGuide: KNGuide_Route) {
        naviView.guidanceDidUpdateRouteGuide(aGuidance, aRouteGuide)
      }
      
      override fun guidanceDidUpdateRouteGuide(aGuidance: KNGuidance, aRouteGuide: KNGuide_Route) {
        naviView.guidanceDidUpdateRouteGuide(aGuidance, aRouteGuide)
      }
      
      코드가 숨겨졌습니다.
      SafetyGuideDelegate 링크 복사

      1. NaviActivityKNGuidance_SafetyGuideDelegate를 아래와 같이 선언합니다.

      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate
      
      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun guidanceDidUpdateAroundSafeties(aGuidance: KNGuidance, aSafeties: List<KNSafety>?) {
        naviView.guidanceDidUpdateAroundSafeties(aGuidance, aSafeties)
      }
      
      override fun guidanceDidUpdateSafetyGuide(aGuidance: KNGuidance, aSafetyGuide: KNGuide_Safety?) {
        naviView.guidanceDidUpdateSafetyGuide(aGuidance, aSafetyGuide)
      }
      
      override fun guidanceDidUpdateAroundSafeties(aGuidance: KNGuidance, aSafeties: List<KNSafety>?) {
        naviView.guidanceDidUpdateAroundSafeties(aGuidance, aSafeties)
      }
      
      override fun guidanceDidUpdateSafetyGuide(aGuidance: KNGuidance, aSafetyGuide: KNGuide_Safety?) {
        naviView.guidanceDidUpdateSafetyGuide(aGuidance, aSafetyGuide)
      }
      
      코드가 숨겨졌습니다.
      VoiceGuideDelegate 링크 복사

      1. NaviActivityKNGuidance_VoiceGuideDelegate를 아래와 같이 선언합니다.

      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_VoiceGuideDelegate
      
      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_VoiceGuideDelegate
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun didFinishPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice) {
        naviView.didFinishPlayVoiceGuide(aGuidance, aVoiceGuide)
      }
      
      override fun shouldPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice, aNewData: MutableList<ByteArray>): Boolean {
        return naviView.shouldPlayVoiceGuide(aGuidance, aVoiceGuide, aNewData)
      }
      
      override fun willPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice) {
        naviView.willPlayVoiceGuide(aGuidance, aVoiceGuide)
      }
      
      override fun didFinishPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice) {
        naviView.didFinishPlayVoiceGuide(aGuidance, aVoiceGuide)
      }
      
      override fun shouldPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice, aNewData: MutableList<ByteArray>): Boolean {
        return naviView.shouldPlayVoiceGuide(aGuidance, aVoiceGuide, aNewData)
      }
      
      override fun willPlayVoiceGuide(aGuidance: KNGuidance, aVoiceGuide: KNGuide_Voice) {
        naviView.willPlayVoiceGuide(aGuidance, aVoiceGuide)
      }
      
      코드가 숨겨졌습니다.
      CitsGuideDelegate 링크 복사

      1. NaviActivityKNGuidance_CitsGuideDelegate를 아래와 같이 선언합니다.

      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_VoiceGuideDelegate, KNGuidance_CitsGuideDelegate
      
      class NaviActivity : AppCompatActivity(), KNGuidance_GuideStateDelegate, KNGuidance_LocationGuideDelegate, KNGuidance_RouteGuideDelegate, KNGuidance_SafetyGuideDelegate, KNGuidance_VoiceGuideDelegate, KNGuidance_CitsGuideDelegate
      
      코드가 숨겨졌습니다.

      2. 코드 내 함수 외의 영역에서 마우스 오른쪽을 누르고 Generate...Override Methods를 클릭하고 Override Members 리스트에서 추가될 항목을 아래와 같이 선택하고 OK를 클릭합니다.

      3. 아래 코드를 입력합니다.

      override fun didUpdateCitsGuide(aGuidance: KNGuidance, aCitsGuide: KNGuide_Cits) {
        naviView.didUpdateCitsGuide(aGuidance, aCitsGuide)
      }
      
      override fun didUpdateCitsGuide(aGuidance: KNGuidance, aCitsGuide: KNGuide_Cits) {
        naviView.didUpdateCitsGuide(aGuidance, aCitsGuide)
      }
      
      코드가 숨겨졌습니다.

      주행 화면 연결하기 링크 복사

      MainActivity에서 인증을 성공한 다음 NaviActivity를 이용하여 주행 화면을 실행할 수 있도록 아래 코드를 추가합니다.

      var intent = Intent(this@MainActivity, NaviActivity::class.java)
      this@MainActivity.startActivity(intent)
      
      var intent = Intent(this@MainActivity, NaviActivity::class.java)
      this@MainActivity.startActivity(intent)
      
      코드가 숨겨졌습니다.

      내비게이션 실행하기 링크 복사

      모바일 기기나 안드로이드 에뮬레이터에서 내비게이션 기본 화면이 정상적으로 표시되는지 확인합니다.

      1. 모바일 기기를 연결하거나 안드로이드 에뮬레이터를 실행합니다.
      2. 안드로이드 스튜디오의 상단 메뉴에서 RunRun app을 클릭합니다.
      3. 앱 화면에 표시되는 '인증하기'를 클릭합니다.
      4. 인증이 성공적으로 완료되면 아래와 같은 주행 화면이 표시됩니다.