====== 여행기 앱 만들기 ======
위키에 작성한 여행기를 기본의 브라우저(크롬, 파이어폭스)보다 좀 더 쾌적하고 편리하게 사용하기 위해 개발한 앱에 대한 모든 것을 담고 있다.
앱은 안드로이드 전용이며, 웹뷰(webview) 형태가 될 것이다.
====== 프로그램의 기능 ======
생각이 날 때마다 추가되며, 구현완료 시에 별도로 표기할 것이다.
^ 요구 기능 ^ 구현 여부(날짜) ^
| 언어설정에 따라 해당 도움말 페이지 | 완 |
| 컨텍스트 메뉴 가운데 정렬 | 완 |
| 구글맵의 전체화면 기능 | 완(2024/1/7) |
| 화면을 아래로 당기면, reload 되는 기능 | 완 |
| 앱 시작시, 명언 대신 출발날짜 출력 | 완 |
| 1초에 5번 터치 시 히든메뉴 | 완 |
| mailto,tel,sms 링크 처리 | 완 |
| 접속오류에 따른 처리 | 완 |
| 이전 버튼을 두번 눌러야 종료 | 완 |
| 페이지 로딩 시 프로그래스 바 출력 | 완 |
| 설치 후 첫 실행 시 도움말 페이지 이동 | 완 |
| 언어에 따른 메뉴 언어 변경 | 완 |
| 페이지 네비게이션 토글 | 미 |
| 구글 번역기 추가 | 완(8/14) |
| 알림 기능 | 완(9/30) |
| 시작 메세지 랜덤 | 완(8/14) |
| 파일 다운로드 기능 | 완(8/6) |
| 앱 시작화면 설정 | 완(7/31) |
| 상단 화면표시줄 보이기 | 완 |
| 개발환경을 변경(인벤터) | 완 |
| 화면 가로세로시 새로고침되는 문제 | 완(7/23) |
| 첫페이지, 현재위치 컨텍스트 메뉴 추가 | 완(7/23) |
====== 개발환경 ======
| H/W | Lenovo X1 Carbon 1st gen |
| S/W | 윈도우 7 |
| S/W | Android Studio Chipmunk 2021.2.1 Patch 1(2022.5.19) |
참고로 Android Studio 는 수시로 업데이트가 이뤄진다. 이에 반해 소스코드는 개발했던 당시 개발환경에 맞춰져 있다. 컴파일 시, 에러가 발생하지 않는 한 가급적 업데이트는 안하는게 좋다.
====== 소스코드 히스토리 ======
| 버전 | 파일 | 특징 |
| 17.0 | {{ :computer:programming:download2_2024_9_14.zip |}} | 인트로(Intro) 화면 교체(이미지 -> 사진), 인트로 화면 출력 크기 수정(200 -> 400) |
| 16.0 | {{ :computer:programming:download2_2024_3_1.zip |}} | 인트로(Intro) 화면 수정, 스페인어 앱이름 수정(comoViento) |
| 15.0 | {{ :computer:programming:download2_2024_2_19.zip |}} | 요구 기능 리스트의 대부분 구현 |
| 9.0 | {{ :computer:programming:download2_2023_7_29.zip |}} | 도메인 주소 likewind.cloud 로 변경 |
| 8.0 | {{ :computer:programming:download2_2022_11_26.zip |}} | 서브메뉴에 한글과 영어를 병기, 방명록 메뉴 추가 |
| 7.0 | {{ :computer:programming:download2_2022_11_12.zip |}} | 도움말(Help) 메뉴 추가 |
| 6.0 | {{ :computer:programming:download2_2022_8_6.zip |}} | 푸쉬서비스 기능 추가 |
====== 빌드 방법 ======
소스코드 받고 압축을 풀어 C:\Users\wjkim\AndroidStudioProjects 아래로 이동한다. 이때 key store 파일인 'likewind.jks' 은 C 드라이브(C:\) 아래로 옮긴다.
Android Studio 를 실행하고, 프로젝트(Download)를 연다. 컴파일에 필요한 것들은 자동으로 다운로드 한다.
준비가 되면, 'Build - Rebuild Project' 를 실행한다. 에러가 없다면, 'Build Bundle(s) / APK(s) - Build APK(s)' 를 선택해서 apk 파일(app-debug.apk)을 생성한다.
이 파일을 휴대폰으로 옮겨 설치하여 테스트해볼 수 있다.
===== 앱 업데이트를 위한 빌드 =====
[[computer:embedded:android_post|안드로이드 개발자 및 앱 등록하기]] 문서를 참고한다.
앱 스토어에 등록된 마지막 버전을 확인하고, 이보다 버전을 올려야 업로드가 가능하다.
마지막 버전이 6.0 이라면, 아래와 같이 7.0 으로 올려야 한다.
==== build.gradle(Module: Download.app) 수정 ====
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.gms.google-services'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.likewind.myapplication"
minSdk 21
targetSdk 32
versionCode 7 // 수정 할 것
versionName "7.0" // 수정 할 것
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.firebase:firebase-messaging-ktx:23.0.7'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation platform('com.google.firebase:firebase-bom:30.3.2')
implementation 'com.google.firebase:firebase-analytics-ktx'
}
수정했다면, 'Build - Generate Signed Bundle / APK' 메뉴를 선택한다. 'Android App Bundle' 를 선택하고 'Next', 아래와 같이 입력한다.
| Key store path | C:\likewind.jks |
| Key store password | rladnwhd81! |
| Key alias | likewind |
| Key password | rladnwhd81! |
| Remember passwords | 체크 |
| Year | 81 |
| First and Last name | Woojong Kim |
'Build Variants' 는 'release' 로 선택한다. 이후 빌드가 완료되면, app-release.aab 파일이 생성된다.
====== 구글 플레이 스토어에 업로드 ======
[[https://play.google.com/console/u/0/developers/8876511459487652610/app-list|여기]]에서 업데이트할 앱을 선택한다(화살표를 클릭).
화면 왼쪽 메뉴의 '프로덕션'을 클릭하고, 오른쪽 상단의 '새 버전 만들기'를 누른다.
앞서 빌드한 aab 파일을 업로드한다. 문제가 없다면, '버전검토 - 출시' 를 클릭한다.
'출시 - 출시 세부정보 보기 - 출시 노트' 의 '버전 세부정보 수정' 을 클릭한다. 추가된 사항들을 입력한다.
이전 버전에 비해 많은 개선이 이뤄졌습니다.
- 버그 수정(구글맵 전체화면)
- 에러 처리(페이지로딩실패, 잘못된 주소링크)
- Splash 이미지 및 메시지 변경
- 언어설정(한국어/영어/스페인어)에 따른 메뉴 대응
- 푸시 기능 개선
불편하거나 궁금한 점은 피드백 남겨주세요.
Many improvements over previous versions.
- Bug fixes (Google Maps fullscreen)
- Error handling (page fails to load, bad address links)
- Splash image and message changes
- Menu based on language settings (Korean/English/Spanish)
- Improved push functionality
Please let us know if you have any questions or concerns.
Muchas mejoras respecto a versiones anteriores.
- Corrección de errores (Google Maps a pantalla completa)
- Gestión de errores (página que no se carga, enlaces con direcciones erróneas)
- Cambios en la imagen de bienvenida y los mensajes
- Menú basado en la configuración de idioma (coreano/inglés/español)
- Funcionalidad push mejorada
Si tienes alguna duda o pregunta, no dudes en ponerte en contacto con nosotros.
'검토' 상태가 되고, 10 ~ 20 분 정도 기다리면, 서버에 반영이 된다.
====== 푸쉬(push) 보내기(버전 17.0 이상) ======
아래 '푸쉬(push) 보내기(버전 10.0 이상)' 방법으로 시도했을 때, postman 사이트에서 아래와 같은 에러메세지가 발생했다.
{"error":"Deprecated endpoint, see https:\/\/firebase.google.com\/docs\/cloud-messaging\/migrate-v1"}
원인은 Firebase Cloud Messaging(FCM)의 구버전 엔드포인트를 사용하고 있어서 발생한 것으로 Firebase에서는 FCM API를 v1 버전으로 마이그레이션 해야 한다. 앱 자체의 코드를 수정할 필요는 없고, postman 사이트에서의 설정과 보내는 데이터의 구조 변경의 수정이 필요하다.
먼저 post 데이터를 보낼 주소가 변경되었다.
https://fcm.googleapis.com/v1/projects/myapplication-e5f8d/messages:send
'myapplication-e5f8d' 은 프로젝트ID 로 firebase 사이트에 접속해서 해당 프로레젝트를 선택한 후, 왼쪽 상단에 '프로젝트 개요' 옆에 톱니바퀴 아이콘을 누르고, '프로젝트 설정'을 누른다. 이후 출력되는 페이지에서 프로젝트ID 를 확인할 수 있다.
Auth(인증) 항목의 유형을 'Firebase Cloud Messaging API OAuth 2.0' 로 선택한다.
오른쪽 창에 '인증' 버튼을 누르고 firebase 에 등록된 구글계정을 선택한다.
Body 를 누르고 아래와 같이 입력한다.
{
"message": {
"topic": "likewind_wjkim",
"data": {
"title": "제목",
"body": "본문",
"url" : "https://likewind.cloud/doku.php?id=journey:bicycle_route",
"lang_ko" : "새로운 버전이 릴리즈되었습니다! 업데이트 해주세요 :-) 푸시 메시지 창을 눌러서 현재 여정을 확인해보세요!",
"lang_en" : "A new version has been released! Please update :-) Click on the push message window to check your current journey!",
"lang_es" : "¡Se ha lanzado una nueva versión! ¡Actualízala! Haz clic en la ventana de mensajes push para comprobar tu viaje actual."
}
}
}
그리고 'Send' 버튼을 누른다.
'200 OK' 와 함께 아래의 로그가 출력된다.
{
"name": "projects/myapplication-e5f8d/messages/3593693609519852839"
}
잠시 후, 휴대폰에 푸시 메세지가 뜰 것이다.
====== 푸쉬(push) 보내기(버전 10.0 이상) ======
기존의 firebase 를 이용한 방법의 경우, 푸쉬 메세지에 원하는 주소를 보낼 수 없었다. 그래서 Postman(https://web.postman.co/)을 이용한 방법을 사용한다.
구글 계정(likethebluewind@gmail.com)이 있다면, 무료로 사용할 수 있다. 웹 브라우저 또는 PC 에 설치해서 사용할 수 있는데, 여기서는 브라우저를 기준으로 설명한다.
순서는 다음과 같다.
- 로그인을 하면, 화면 왼쪽 상단에 'New' 를 클릭, 'HTTP' 를 선택한다.
- 오른쪽 창에 'Untitled Request' 가 뜨고, 'GET -> POST' 로 변경한다.
- 주소는 'https://fcm.googleapis.com/fcm/send' 를 입력한다.
- Authorization 탭을 누르고, 아래 Type 를 'No Auth' 로 선택한다.
- Headers 탭을 누르고, Key 와 Value 아래 칸에 각각 Content-Type 과 application/json 을 입력한다. 그 아래 칸에 Authorization 과 key=AAAxxx 를 입력한다. 키 값을 얻는 방법은 firebase 에 접속하여 해당 app 프로젝트를 선택한다. 왼쪽 상단에 '프로젝트 개요' 옆에 톱니바퀴 아이콘을 누르고, '프로젝트 설정'을 누른다. 오른쪽 화면에 '클라우드 메시지' 탭을 클릭, 'Cloud Messaging API(기존)' 사용안함으로 되어 있는데, 이걸 사용함으로 변경해야 한다. 활성화 시키고나면, 서버키가 뜬다. 이걸 복사해서 넣으면 된다.
- Body 탭을 누르고 'raw' 를 선택 후 'JSON' 을 클릭한다. 보내는 방법에 따라 두 가지로 나뉜다. 토큰(token)을 사용하는 방법과 토픽(topic)을 사용하는 방법이 있다.
===== 토큰(token)을 이용한 푸쉬 보내기 =====
토큰의 경우, 앱을 설치하면 부여받게 되는 값이다. 앱을 삭제하고 다시 설치하면 값은 달라진다. 이 방법을 사용하면, 명확하게 푸쉬데이터를 보낼 디바이스를 지정할 수 있다. 테스트 목적으로 푸쉬메세지를 보내야 할 때, 기존 코드의 패키지 이름을 바꾸지 않아도 된다는 장점이 있다. 하지만 토큰 값을 출력문을 통해 확인해야 한다는 단점이 있다.
{
"data":{
"title": "제목",
"body": "본문",
"url" : "https://likewind.cloud",
"lang_ko" : "테스트",
"lang_en" : "hello",
"lang_es" : "hola"
},
"to": "ftm8G5mIRvKaz8pUpoQg87:APA91bEp66cNJfJParm7zNtRscvN_bLDy-JNp_c39RRcU-h6g6Ht9hS4Ss1pj0jlvgpUkAvqgHZ8vcxdP87jLaY7z5MGmRVKo6dZCSjNr8pG4dsiXLVPiprWCsT4fjNDBr2DqDVpfzk1",
"priority": "high"
}
| Key | Value |
| to | 토큰 값 입력 |
===== 토픽(topic)을 이용한 푸쉬 보내기 =====
토픽의 경우, 아래처럼 소스코드 내에 지정할 수 있고 값이 바뀌지 않기 때문에 좀 더 편리하다. 이 방법으로 설치된 기기들에 대량으로 푸쉬를 보낼 수 있다.
// Initialize Firebase
FirebaseMessaging.getInstance().subscribeToTopic("likewind_wjkim") // likewind_wjkim
아래 내용으로 복사한다.
{
"data":{
"title": "제목",
"body": "본문",
"url" : "https://likewind.cloud",
"lang_ko" : "테스트",
"lang_en" : "hello",
"lang_es" : "hola"
},
"to": "/topics/likewind_wjkim",
"priority": "high"
}
| Key | Value |
| title | 제목(알림 메세지창에 출력되지 않음) |
| body | 내용(알림 메세지창에 출력되지 않음) |
| url | https://likewind.cloud(알림 메세지를 누르면 이동하게 되는 주소) |
| lang_ko | 한국어 내용(언어가 한국로 된 기기에 출력) |
| lang_en | 영어 내용(언어가 영어로 된 기기에 출력) |
| lang_es | 스페인어 내용(언어가 스페인어로 된 기기에 출력) |
| to | /topics/likewind_wjkim (코드에서 지정한 토픽이름) |
| priority | high |
이제 'Send' 버튼을 누른다. '200 OK' 로그가 떳다면 성공적으로 보낸 것이다. 얼마 뒤 알림메세지가 뜰 것이다. 나중의 재사용을 위해서 'Save' 를 눌러 저장한다.
====== 푸쉬(push) 보내기(버전 9.0 이하) ======
버전 9.0 이하 버전에서 사용했던 방법이다.
앱이 설치된 사용자들에게 팝업창을 띄울 수 있다. https://firebase.google.com/?hl=ko 에서 '콘솔로 이동'을 선택한다.
'Myapplication' 을 선택한다. 왼쪽 메뉴의 'Messaging'또는 '참여' 아래의 'Cloud Messaging' 를 클릭한다.
기존에 보냈던 메세지 로그가 보인다. '새 캠페인'을 클릭하고, '알림'을 선택한다.
'알림 텍스트' 에는 실제 보낼 메세지를 적는다. 여기서는 아래와 같이 입력했다.
새롭게 도움말 메뉴가 추가되었습니다. 업데이트 부탁드려요!!
'다음'을 클릭한다. '타겟' 에서 Myapplication 앱을 선택한다. '다음'을 클릭한다. '예약' 에서는 '지금' 을 선택하고, '다음'을 클릭한다.
'전환 이벤트' 에서는 '다음'을 클릭한다. 추가 옵션' 에서는 '다음'을 클릭한다. 하단의 '검토'를 클릭한다.
실제 메세지가 올 때까지 10 ~ 20분 가량이 걸릴 수 있다.
====== 기능 추가하기 ======
===== 서브메뉴 추가 =====
빈번하게 추가될 수 있는 부분 중 하나가 바로 서브메뉴의 수정이다. '그대로 따라하기' 식으로 최대한 자세하게 설명한다.
==== context.xml 파일 수정 ====
'app - res - menu' 아래의 context.xml 파일을 열어 아래와 같이 코드를 추가한다.
==== MainActivity.kt 파일 수정 ====
'app - java - com - likewind - myapplication' 아래에 MainActivity.kt 파일을 아래와 같이 코드를 추가한다.
...
override fun onContextItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.action_share -> {
webView.loadUrl("https://likewind.ml/doku.php?id=journey:%EC%97%AC%ED%96%89")
//binding.webView.url?.let { url ->
// 페이지 공유
// share(url)
//}
return true
}
R.id.action_browser -> {
webView.reload()
//binding.webView.url?.let { url ->
// 기본 웹 브라우저에서 열기
// browse(url)
//}
return true
}
R.id.action_location -> {
webView.loadUrl("https://likewind.ml/doku.php?id=journey:bicycle_route")
}
R.id.action_guestbook -> { // 추가
webView.loadUrl("https://likewind.ml/doku.php?id=guestbook") // 추가
} // 추가
R.id.action_help -> {
webView.loadUrl("https://likewind.ml/doku.php?id=computer:programming:%EC%97%AC%ED%96%89%EA%B8%B0_%EC%95%B1_%EC%82%AC%EC%9A%A9%EB%B2%95")
}
}
return super.onContextItemSelected(item)
}
...
이제 빌드하고, apk 파일을 설치해 확인해보자!
====== FAQ ======
===== 푸쉬 서비스를 테스트하려고 합니다 =====
==== 패키지명 변경(likewind -> likewind_test) ====
여러번 push 메세지를 보내야 하기 때문에, 실제 사용자들에게 이를 보낼 수는 없다. 따라서 별도의 테스트용 소스코드를 만들어야 한다.
기존의 정식 릴리즈된 패키지 이름은 'com.likewind.myapplication' 이다. 'com.likewind_test.myapplication' 라는 이름으로 변경해야 한다. 방법은 다음과 같다.
- 안드로이드 스튜디오에서 왼쪽 창의 소스코드 트리에서 app/java/com 아래의 likewind 디렉토리를 선택한다
- 마우스 오른쪽 버튼 클릭 후 메뉴에서 'Refactor -> Rename' 을 선택한다
- 'In Whole Project' 를 선택하고, 'likewind_test' 를 입력하고, 'Search in comments and strings' 와 'Search for text occurrences' 를 체크 한다
- build.gradle 파일을 열고, 'applicationId' 항목을 'com.likewind_test.myapplication' 로 바꿔준다
- 왼쪽 창의 소스코드 트리에서 app 디렉토리를 선택하고 마우스 오른쪽 버튼 클릭 후 메뉴에서 'Open In -> Exploer' 를 선택한다
- 탐색기 창에서 app 디렉토리에 들어가, google-services.json 파일을 복사한다(참고로 미리 firebase 에서 프로젝트를 생성하고 'com.likewind_test.myapplication' 앱에 대한 등록을 마쳐야 한다)
이후 Clean -> Rebuild Project 를 한다.
==== Firebase 프로젝트 추가 ====
https://console.firebase.google.com/u/0/?hl=ko 에 접속해서, '프로젝트 추가' 를 누른다.
- 프로젝트 이름 : pushtest
- Firebase 프로젝트를 위한 Google 애널리틱스 : 계속
- Google 애널리틱스 구성 : Default Account for Firebase 선택 후 프로젝트 만들기
새로운 프로젝트 페이지가 뜨면, '앱에 Firebase를 추가하여 시작하기' 문구 아래에 안드로이드 아이콘을 클릭한다. Android 앱에 Firebase 추가 페이지가 뜨면, 아래의 순서대로 입력한다.
- 앱 등록 : Android 패키지 이름(com.likewind_test.myapplication), 앱 닉네임(test)
- 구성 파일 다운로드 후 추가 : google-services.json 파일을 다운로드하고, 프로젝트 디렉토리(Download2\app) 아래에 넣는다
- build.gradle(Project) 파일에 아래와 같이 추가한다
buildscript {
dependencies {
classpath 'com.google.gms:google-services:4.3.13'
}
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.1' apply false
id 'com.android.library' version '7.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
- build.gradle(Module) 파일에 아래와 같이 추가한다
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.gms.google-services'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.likewind_test.myapplication"
minSdk 21
targetSdk 32
versionCode 9
versionName "9.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
implementation 'com.google.android.material:material:1.6.1'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation 'com.google.firebase:firebase-messaging-ktx:23.0.7'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation platform('com.google.firebase:firebase-bom:30.3.2')
implementation 'com.google.firebase:firebase-analytics-ktx'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
}
- 동기화 후에 컴파일을 한다
- 설정을 끝내고, 돌아온 firebase 프로젝트 페이지에서 왼쪽 메뉴의 '참여 -> Messaging' 를 선택한다
- '첫번째 캠페인 만들기' 를 클릭하고, 이후 [[https://likewind.cloud/doku.php?id=computer:programming:%EC%97%AC%ED%96%89%EA%B8%B0_%EC%95%B1_%EB%A7%8C%EB%93%A4%EA%B8%B0#%ED%91%B8%EC%89%AC_push_%EB%B3%B4%EB%82%B4%EA%B8%B0|푸쉬 보내기]] 과정을 참고한다
===== 포토스케이프(PhotoScape)에 폰트 추가하기 =====
일체화된 디자인을 위해서 그림 편집 후에 텍스트를 추가해야 한다면, 기본 폰트인 리디바탕 글꼴을 사용하는 것이 좋다. 이 폰트는 윈도우 OS 에 기본 탑재되어 있지 않기 때문에 [[https://ridicorp.com/ridibatang/ |공식 사이트]]에서 다운받아 설치해야 한다. 이때 유의할 점이 있다. 폰트 파일 포맷이 otf 다. 이 파일을 설치하더라도 다른 프로그램들(포토스케이프)에서는 이 폰트를 찾을 수 없기 때문에 사용할 수 없다.
해결방법은 ttf 포맷을 설치하는 것이다. 구글링을 통해 ridibatang.ttf 파일을 찾을 수 있었다. {{ :computer:programming:ridi_fonts.zip |}} 이걸 설치해야 프로그램의 폰트 리스트에서 보인다.
===== 앱에 사용할 이미지구하기 =====
셀 수 없이 여러가지 방법이 있지만, 이중에 AI 가 그려주는 이미지를 사용해보자. https://ideogram.ai/ 에 접속해서 프롬프트를 입력하면 근사한 사진을 만들어 준다.
Create image beautiful scenery natural windy day in the blue sky, illustration, poster, painting
하루에 25번 만들 수 있고, 한번에 4장의 그림을 그려준다. 마음에 드는 사진을 다운받고, 포토스케이프에서 '사진편집 -> 자유롭게 자르기(원형자르기 체크)' 메뉴를 통해 편집하면 된다.
===== Splash 이미지 투명배경 만들기 =====
앱에서 사용하는 이미지는 투명배경으로 만들어져야 자연스러운 느낌이 난다. 포토샵이 있다면 아주 간단하게 작업할 수 있겠지만, 상용프로그램이고 반면에 오픈소스인 포토스케이프에는 이런 기능이 없다. 구글링으로 찾아낸 방법이 캡컷(capcut)이라는 온라인 이미지 편집 사이트다. 무료로 구글 계정을 사용해서 로그인 후 사용할 수 있다.
여기서 유의할 점이 있다. 크롬이 아닌 파이어폭스를 사용해야 한다는 점이다. 이유는 현재 사용 중인 Windows 7 에서 크롬의 업데이트가 더 이상 이뤄지지 않고 있기 때문이다.
https://www.capcut.com/ko-kr/resource/pic-remove-background
위의 링크에서 배경을 지우는 방법을 설명한다. 먼저 작업할 이미지파일을 업로드하고, 'Remove backgroumd' 메뉴에서 자동 또는 수동으로 선택영역을 지정하여 삭제한다. 보통 자동으로 하는데, 원하는 곳이 선택되지 않는다면, 수동으로 지정해야 한다. 작업이 끝나면, png 포맷으로 파일을 저장 후 다운로드 한다. 참고로 이 파일은 Download2\app\src\main\res\drawable 아래에 복사한다.
===== 앱 아이콘 수정하기 =====
앱 아이콘을 바꾸고 싶을 때가 있을 것이다.
안드로이드 스튜디오 왼쪽 상단의 프로젝트 res 디렉토리를 선택하고 오른쪽 버튼을 누른다. 'New -> Image Aesset' 을 클릭하면, 창이 뜬다.
'Icon Type' 을 'Launcher Icons (Adaptive and Legacy)' 로 설정하고, 'Name' 을 지정한다. 기존의 이름과 겹치지 않게 변경해서 입력한다.
Source Asset 의 경로에서 사용하고 싶은 그림파일을 불러온다. 'Next -> Close' 를 누르면 창이 사라진다.
'AndroidManifest.xml' 파일을 수정할 차례다.
재빌드하고 확인해보자.
===== 앱이 Android 14(API 수준 34) 이상을 타겟팅해야 함 =====
새로운 버전을 업데이트를 하려고 개발자 사이트를 들어갔는데, 위와 같은 경고메세지와 함께 '새버전 만들기' 라는 버튼이 비활성화되는 경우가 있었다.
이에 대한 해결 방법은 다음과 같다.
API 34 이상으로 빌드하기 위해 코드를 수정해야 한다. 아래 build.gradle(Module:Download.app) 파일을 보자.
...
android {
compileSdk 34 // 수정
defaultConfig {
applicationId "com.likewind.myapplication"
minSdk 21
targetSdk 34 // 수정
versionCode 17
versionName "17"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
...
주석이 달린 부분을 수정하면 된다.
----
{{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}}
----