Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

전남대_Android 신혜서 3주차 step2 #87

Open
wants to merge 66 commits into
base: tlsgptj
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
04c907f
Initial commit
MyStoryG Jun 15, 2024
92d3cc3
git commit
tlsgptj Jul 1, 2024
8797ffe
git commit
tlsgptj Jul 1, 2024
c5eb58f
git commit
tlsgptj Jul 1, 2024
f3385a7
DB 구성
tlsgptj Jul 2, 2024
cc3475d
DB 구성
tlsgptj Jul 2, 2024
e994837
DB 구성
tlsgptj Jul 2, 2024
631168c
X 버튼을 클릭하면 적고 있던 글자가 다 지워짐
tlsgptj Jul 2, 2024
fae4200
입력한 값을 SQLite DB에 저장
tlsgptj Jul 2, 2024
ff4956c
입력한 값을 SQLite DB에 저장
tlsgptj Jul 2, 2024
f416100
README 수정
tlsgptj Jul 2, 2024
492a793
README 수정
tlsgptj Jul 2, 2024
af695bf
README 수정
tlsgptj Jul 2, 2024
159e22f
README 수정
tlsgptj Jul 2, 2024
2852682
README 수정
tlsgptj Jul 2, 2024
7ad7e74
Listview 만들고 itemview.xml 만들기
tlsgptj Jul 2, 2024
afc9132
ListView -> RecyclerView로 교체
tlsgptj Jul 4, 2024
8aa94ce
searchactivity.kt의 EditText를
tlsgptj Jul 4, 2024
eaeab96
ClassCastException 에러해결
tlsgptj Jul 4, 2024
81bcb6f
ClassCastException 에러해결
tlsgptj Jul 4, 2024
f8cf7af
close 삭제
tlsgptj Jul 4, 2024
3d275d4
SetonclickListener 삭제
tlsgptj Jul 4, 2024
ea7532a
kotlin.UninitializedPropertyAccessException 에러 발생
tlsgptj Jul 4, 2024
7c105b9
itemview 생성
tlsgptj Jul 4, 2024
bf4834c
더미 데이터 추가
tlsgptj Jul 4, 2024
8a3cd85
검색어를 입력했을 때 database.kt에 있는 데이터들이 로드되지 않음
tlsgptj Jul 4, 2024
8f056d0
코드가 너무 길어져서 MyDatabaseHelper를 생성해서 DB를 옮겨놓음
tlsgptj Jul 4, 2024
86d0fe7
오류 수정
tlsgptj Jul 4, 2024
397a325
README 수정
tlsgptj Jul 4, 2024
bc6e8f6
README 수정
tlsgptj Jul 4, 2024
3d5c1bf
README 수정
tlsgptj Jul 4, 2024
b333693
오류수정
tlsgptj Jul 4, 2024
0b89861
Button 수정
tlsgptj Jul 4, 2024
de64da5
글씨 크기 수정
tlsgptj Jul 4, 2024
e605b8d
Adapter 파일 분리
tlsgptj Jul 5, 2024
8ed6647
위치 표시 수정
tlsgptj Jul 5, 2024
28e6e47
TextView 메세지 처리 수정
tlsgptj Jul 5, 2024
18fd5ef
TextView 메세지 처리 수정
tlsgptj Jul 5, 2024
84bd13e
글자 크기 수정
tlsgptj Jul 5, 2024
ae596c0
글자 크기 수정
tlsgptj Jul 5, 2024
8a877ac
Copy
tlsgptj Jul 8, 2024
2c97110
Merge remote-tracking branch 'new-origin/main' into step2
tlsgptj Jul 9, 2024
ba7f13c
필요없는 파일 삭제
tlsgptj Jul 9, 2024
0e4330e
Read.me 수정
tlsgptj Jul 9, 2024
a3a59f1
Read.me 수정
tlsgptj Jul 9, 2024
8d860c2
Read.me 수정
tlsgptj Jul 9, 2024
00177be
더미 데이터를 api로 어떻게 바꿔야할까용
tlsgptj Jul 9, 2024
ffdbb14
build.gradle.kts 수정
tlsgptj Jul 9, 2024
3032032
build.gradle.kts 수정
tlsgptj Jul 9, 2024
6e507f9
401 오류 해결 중
tlsgptj Jul 9, 2024
3309d91
401 오류 해결 완료
tlsgptj Jul 9, 2024
1739a53
401 오류 해결 완료
tlsgptj Jul 9, 2024
f5af045
README.md step2 수정
tlsgptj Jul 9, 2024
b88e58d
STEP1 제출
tlsgptj Jul 10, 2024
9d3e42f
java.lang.UnsatisfiedLinkError: dlopen failed: library "libK3fAndroid…
tlsgptj Jul 11, 2024
adf2e10
오류 수정
tlsgptj Jul 11, 2024
05d911f
오류 수정
tlsgptj Jul 11, 2024
15186ad
MapView로 변경
tlsgptj Jul 11, 2024
0a33dd8
MapView로 변경
tlsgptj Jul 11, 2024
553faa8
binding 함수 추가 필요
tlsgptj Jul 11, 2024
a705c7c
binding 함수 추가 필요
tlsgptj Jul 12, 2024
9d51fe7
STEP2 수정
tlsgptj Jul 15, 2024
ba7905d
여전히 지도 안뜸
tlsgptj Jul 15, 2024
03f324e
여전히 지도 안뜸
tlsgptj Jul 15, 2024
597a3e5
여전히 지도 안뜸
tlsgptj Jul 15, 2024
22a9333
여전히 지도 안뜸
tlsgptj Jul 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,8 @@
# android-map-search
# 기능 요구 사항
1. 앱을 처음 실행하면 지도 화면을 표시한다.
2. 검색창을 선택하면 검색 화면으로 이동한다.
3. 검색 화면에서 뒤로 가기를 하면 지도 화면으로 돌아온다.
# 프로그래밍 요구 사항
1. 카카오지도 SDK를 사용한다.
2. 가능한 MVVM 아키텍처 패턴을 적용하도록 한다.
3. 코드 컨벤션을 준수하며 프로그래밍한다.
42 changes: 35 additions & 7 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,24 @@ plugins {
}

android {
namespace = "campus.tech.kakao.map"
compileSdk = 34
namespace = "campus.tech.kakao.map"

defaultConfig {
applicationId = "campus.tech.kakao.map"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
ndk {
abiFilters.add("arm64-v8a")
abiFilters.add("armeabi-v7a")
abiFilters.add("x86")
abiFilters.add("x86_64")
}
dataBinding {
enable = true
}

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
Expand All @@ -22,14 +31,16 @@ android {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro",
"proguard-rules.pro"
)
}
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}

kotlinOptions {
jvmTarget = "17"
}
Expand All @@ -40,18 +51,35 @@ android {
}

dependencies {

implementation ("androidx.multidex:multidex:2.0.1")
// Kakao Map SDK - 최신 버전 사용
implementation("com.kakao.maps.open:android:2.9.5")
// Kakao SDK
implementation("com.kakao.sdk:v2-all:2.20.3")
// 네트워크 라이브러리
implementation("com.squareup.okhttp3:okhttp:4.9.1")
implementation("com.squareup.okhttp3:logging-interceptor:4.9.1")
// AndroidX 및 기타 라이브러리
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.recyclerview:recyclerview:1.3.2")
implementation("androidx.datastore:datastore-preferences:1.0.0")
implementation("com.squareup.retrofit2:retrofit:2.11.0")
implementation("com.squareup.retrofit2:converter-gson:2.11.0")
implementation("com.kakao.maps.open:android:2.9.5")
implementation("androidx.activity:activity:1.8.0")
implementation("androidx.activity:activity:1.9.0")
// Retrofit 라이브러리
implementation("com.squareup.retrofit2:retrofit:2.7.1")
implementation("com.squareup.retrofit2:converter-gson:2.7.1")
// AR 라이브러리
implementation("com.google.ar.sceneform:core:1.17.1") // ARCore 관련 라이브러리 수정
// Google Maps 서비스 라이브러리
implementation("com.google.android.gms:play-services-maps:19.0.0")

// 테스트 라이브러리
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}



17 changes: 13 additions & 4 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

<!-- 권한 -->
<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" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<application
android:allowBackup="true"
Expand All @@ -15,14 +18,20 @@
android:theme="@style/Theme.Map"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:name=".Map_Activity"
android:exported="true" />
<activity
android:name=".Search_Activity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<meta-data
android:name="com.kakao.sdk.AppKey"
android:value="e6a7c826ae7a55df129b8be2c636e213" />
</application>

</manifest>
</manifest>
81 changes: 81 additions & 0 deletions app/src/main/java/campus/tech/kakao/map/Database.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package campus.tech.kakao.map

import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch

class Database(context: Context) : SQLiteOpenHelper(context, "place.db", null, 1) {

override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(
"CREATE TABLE IF NOT EXISTS ${MapContract.TABLE_CAFE} (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"${MapContract.COLUMN_NAME} TEXT," +
"${MapContract.COLUMN_ADDRESS} TEXT," +
"${MapContract.COLUMN_CATEGORY} TEXT" +
")"
)
db?.execSQL(
"CREATE TABLE IF NOT EXISTS ${MapContract.TABLE_PHARMACY} (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT," +
"${MapContract.COLUMN_NAME} TEXT," +
"${MapContract.COLUMN_ADDRESS} TEXT," +
"${MapContract.COLUMN_CATEGORY} TEXT" +
")"
)
}

override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.execSQL("DROP TABLE IF EXISTS ${MapContract.TABLE_CAFE}")
db?.execSQL("DROP TABLE IF EXISTS ${MapContract.TABLE_PHARMACY}")
onCreate(db)
}


fun searchPlaces(searchText: String): List<Map<String, String>> {
val db = readableDatabase
val cafes = queryPlaces(db, MapContract.TABLE_CAFE, searchText)
val pharmacies = queryPlaces(db, MapContract.TABLE_PHARMACY, searchText)
db.close()

val dataList = mutableListOf<Map<String, String>>()
dataList.addAll(cafes)
dataList.addAll(pharmacies)
return dataList
}

private fun queryPlaces(
db: SQLiteDatabase,
tableName: String,
searchText: String
): List<Map<String, String>> {
val cursor: Cursor = db.query(
tableName,
null,
"${MapContract.COLUMN_NAME} LIKE ? OR ${MapContract.COLUMN_ADDRESS} LIKE ?",
arrayOf("%$searchText%", "%$searchText%"),
null,
null,
null
)

val results = mutableListOf<Map<String, String>>()
while (cursor.moveToNext()) {
val row = mutableMapOf<String, String>()
row[MapContract.COLUMN_NAME] =
cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_NAME))
row[MapContract.COLUMN_ADDRESS] =
cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_ADDRESS))
row[MapContract.COLUMN_CATEGORY] =
cursor.getString(cursor.getColumnIndexOrThrow(MapContract.COLUMN_CATEGORY))
results.add(row)
}
cursor.close()
return results
}
}

10 changes: 10 additions & 0 deletions app/src/main/java/campus/tech/kakao/map/Document.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package campus.tech.kakao.map

import com.google.gson.annotations.SerializedName

data class Document(
@SerializedName("category_group_name") val categoryName: String,
@SerializedName("id") val id: String,
@SerializedName("address_name") val addressName: String,
@SerializedName("place_name") val placeName: String?
)
12 changes: 12 additions & 0 deletions app/src/main/java/campus/tech/kakao/map/KakaoResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package campus.tech.kakao.map

import com.google.gson.annotations.SerializedName

data class KakaoSearchResponse(
@SerializedName("documents") val documents: List<Document>
)


data class RoadAddress(
@SerializedName("building_name") val buildingName: String?
)
11 changes: 0 additions & 11 deletions app/src/main/java/campus/tech/kakao/map/MainActivity.kt

This file was deleted.

9 changes: 9 additions & 0 deletions app/src/main/java/campus/tech/kakao/map/MapContract.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package campus.tech.kakao.map

object MapContract {
const val TABLE_CAFE = "cafe"
const val TABLE_PHARMACY = "pharmacy"
const val COLUMN_NAME = "name"
const val COLUMN_ADDRESS = "address"
const val COLUMN_CATEGORY = "category"
}
69 changes: 69 additions & 0 deletions app/src/main/java/campus/tech/kakao/map/Map_Activity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package campus.tech.kakao.map

import android.content.Intent
import android.os.Bundle
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.SearchView
import com.google.android.gms.maps.CameraUpdateFactory
import com.kakao.vectormap.KakaoMap
import com.kakao.vectormap.KakaoMapReadyCallback
import com.kakao.vectormap.LatLng
import com.kakao.vectormap.MapLifeCycleCallback
import com.kakao.vectormap.MapView
import java.lang.Exception

class Map_Activity : AppCompatActivity() {

private lateinit var mapView: MapView
private lateinit var searchView: SearchView
private val LOCATION_PERMISSION_REQUEST_CODE = 1000

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_map)

mapView = findViewById(R.id.map_view)
searchView = findViewById(R.id.search_text)

mapView = MapView(this)
mapView.start(
object : MapLifeCycleCallback() {
override fun onMapDestroy() {
Log.d("map", "Map Destroy")
}

override fun onMapError(error: Exception) {
Log.d("map", "지도가 정상적으로 호출되지 않음")
}
},
object : KakaoMapReadyCallback() {
override fun onMapReady(kakaoMap: KakaoMap) {
val mapCenter = com.google.android.gms.maps.model.LatLng(
37.5665,
126.9780
) // 예시: 서울의 위도, 경도
}
}
)

searchView.setOnQueryTextFocusChangeListener { _, hasFocus ->
if (hasFocus) {
val intent = Intent(this, Search_Activity::class.java)
startActivity(intent)
}
}
}

override fun onResume() {
super.onResume()
mapView.resume()
}

override fun onPause() {
super.onPause()
mapView.pause()
}
}


Loading