diff --git a/app/build.gradle b/app/build.gradle index 441c2e8..60e93d6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,14 +12,6 @@ android { namespace 'com.pcandriod.kusitms_hackathon_c' compileSdk 33 - viewBinding{ - enabled = true - } - - buildFeatures { - buildConfig = true - } - defaultConfig { applicationId "com.pcandriod.kusitms_hackathon_c" minSdk 26 @@ -30,6 +22,7 @@ android { buildConfigField "String", "MAP_API_KEY", properties['map.client.id'] buildConfigField "String", "NAVER_CLIENT_ID", properties['NAVER_CLIENT_ID'] buildConfigField "String", "NAVER_CLIENT_SECRET", properties['NAVER_CLIENT_SECRET'] + buildConfigField "String", "KAKAO_SEARCH_KEY", properties['kakao.search.key'] testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } @@ -101,6 +94,9 @@ dependencies { // 네이버 로그인 implementation 'com.navercorp.nid:oauth:5.6.0' + // 카카오 장소 검색 + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 네이버 지도 SDK implementation 'com.naver.maps:map-sdk:3.17.0' diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/data/ResultSearchKeyword.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/data/ResultSearchKeyword.kt new file mode 100644 index 0000000..b852dfd --- /dev/null +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/data/ResultSearchKeyword.kt @@ -0,0 +1,15 @@ +package com.pcandriod.kusitms_hackathon_c.data.data + +// 장소명, 주소, 좌표만 받는 클래스 +data class ResultSearchKeyword( + var documents: List // 검색 결과 +) + +data class Place( + var place_name: String, // 장소명, 업체명 + var category_group_name: String, // 중요 카테고리만 그룹핑한 카테고리 그룹명 + var address_name: String, // 전체 지번 주소 + var road_address_name: String, // 전체 도로명 주소 + var x: String, // X 좌표값 혹은 longitude + var y: String, // Y 좌표값 혹은 latitude +) diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/remote/service/KakaoAPI.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/remote/service/KakaoAPI.kt new file mode 100644 index 0000000..43f05a8 --- /dev/null +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/data/remote/service/KakaoAPI.kt @@ -0,0 +1,18 @@ +package com.pcandriod.kusitms_hackathon_c.data.remote.service + +import com.pcandriod.kusitms_hackathon_c.data.data.ResultSearchKeyword +import retrofit2.Call +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface KakaoAPI { + @GET("v2/local/search/keyword.json") // Keyword.json의 정보를 받아옴 + fun getSearchKeyword( + @Header("Authorization") key: String, // 카카오 API 인증키 [필수] + @Query("query") query: String // 검색을 원하는 질의어 [필수] +// 매개변수 추가 가능 +// @Query("category_group_code") category: String + + ): Call // 받아온 정보가 ResultSearchKeyword 클래스의 구조로 담김 +} \ No newline at end of file diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/MainActivity.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/MainActivity.kt index 5dfd4f3..979fa9f 100644 --- a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/MainActivity.kt +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/MainActivity.kt @@ -1,13 +1,30 @@ package com.pcandriod.kusitms_hackathon_c.presentation.ui.main +import android.content.Context +import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log +import android.view.inputmethod.InputMethodManager +import com.pcandriod.kusitms_hackathon_c.BuildConfig import com.pcandriod.kusitms_hackathon_c.R +import com.pcandriod.kusitms_hackathon_c.data.data.ResultSearchKeyword +import com.pcandriod.kusitms_hackathon_c.data.remote.service.KakaoAPI import com.pcandriod.kusitms_hackathon_c.databinding.ActivityMainBinding +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding + companion object { + const val BASE_URL = "https://dapi.kakao.com/" + const val API_KEY = "KakaoAK ${BuildConfig.KAKAO_SEARCH_KEY}" // REST API 키 + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // setContentView(R.layout.activity_main) @@ -16,5 +33,11 @@ class MainActivity : AppCompatActivity() { val view = binding.root setContentView(view) } + + // 키보드 내리는 메서드 + fun hideKeyboard() { + val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(currentFocus?.windowToken, 0) + } } diff --git a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/map/MapFragment.kt b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/map/MapFragment.kt index 104acb9..7254390 100644 --- a/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/map/MapFragment.kt +++ b/app/src/main/java/com/pcandriod/kusitms_hackathon_c/presentation/ui/main/map/MapFragment.kt @@ -2,10 +2,12 @@ package com.pcandriod.kusitms_hackathon_c.presentation.ui.main.map import android.os.Bundle import android.os.SystemClock +import android.util.Log import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.SearchView import com.naver.maps.geometry.LatLng import com.naver.maps.map.CameraAnimation import com.naver.maps.map.CameraUpdate @@ -15,8 +17,15 @@ import com.naver.maps.map.NaverMapSdk import com.naver.maps.map.OnMapReadyCallback import com.naver.maps.map.util.FusedLocationSource import com.pcandriod.kusitms_hackathon_c.BuildConfig +import com.pcandriod.kusitms_hackathon_c.data.data.ResultSearchKeyword +import com.pcandriod.kusitms_hackathon_c.data.remote.service.KakaoAPI import com.pcandriod.kusitms_hackathon_c.databinding.FragmentMapBinding import com.pcandriod.kusitms_hackathon_c.presentation.ui.main.MainActivity +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory class MapFragment : Fragment(), OnMapReadyCallback { @@ -48,6 +57,23 @@ class MapFragment : Fragment(), OnMapReadyCallback { fragmentMapBinding.run { + svPlace.setOnQueryTextListener(object : SearchView.OnQueryTextListener { + override fun onQueryTextSubmit(query: String?): Boolean { + + // 검색 버튼 누를 때 호출 + searchKeyword(query.toString()) + + mainActivity.hideKeyboard() + return true + } + + override fun onQueryTextChange(newText: String?): Boolean { + + // 검색창에서 글자가 변경이 일어날 때마다 호출 + + return true + } + }) } return fragmentMapBinding.root @@ -102,7 +128,7 @@ class MapFragment : Fragment(), OnMapReadyCallback { naverMap.isIndoorEnabled = true // 초기 위치 설정 - val cameraUpdate = CameraUpdate.scrollTo((LatLng(37.631651, 127.077487))).animate( + val cameraUpdate = CameraUpdate.scrollTo((LatLng(37.565669, 127.019452))).animate( CameraAnimation.Easing ) naverMap.moveCamera(cameraUpdate) @@ -121,4 +147,32 @@ class MapFragment : Fragment(), OnMapReadyCallback { // naverMap.locationSource = locationSource } + + // 키워드 검색 함수 + private fun searchKeyword(keyword: String) { + val retrofit = Retrofit.Builder() // Retrofit 구성 + .baseUrl(MainActivity.BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build() + val api = retrofit.create(KakaoAPI::class.java) // 통신 인터페이스를 객체로 생성 + val call = api.getSearchKeyword(MainActivity.API_KEY, keyword) // 검색 조건 입력 + + // API 서버에 요청 + call.enqueue(object: Callback { + override fun onResponse( + call: Call, + response: Response + ) { + // 통신 성공 (검색 결과는 response.body()에 담겨있음) + Log.d("큐커톤", "Raw: ${response.raw()}") + Log.d("큐커톤", "Body: ${response.body()}") + Log.d("큐커톤", "first Body: ${ response.body()!!.documents[0].place_name}") + } + + override fun onFailure(call: Call, t: Throwable) { + // 통신 실패 + Log.w("큐커톤", "통신 실패: ${t.message}") + } + }) + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 17bee33..d790da4 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -6,6 +6,14 @@ android:orientation="vertical" tools:context=".presentation.ui.main.map.MapFragment"> + +