2026/03/06

오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, eine unverzichtbare App für Badmintonvereine!
👉 Matchplay – Punkte aufzeichnen und Gegner finden 🎉
Perfekt für überall, alleine, mit Freunden oder im Club! 🤝
Wenn Sie Badminton mögen, probieren Sie es unbedingt aus

Zur App gehen 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

https://barros9.medium.com/how-to-keep-your-certificates-and-api-keys-secrets-on-android-ebc5fde4b106



 


How to keep your certificates and API Keys secrets on Android 🤫


It could happen that pre-lunch report of your app reports a security issue: Your app contains exposed Google Cloud Platform (GCP) API keys


barros9.medium.com




원작자의 글 : 위 링크에 있는 원작자의 말은 공개된 소스 창고(git 등)에 소스를 게시하는 경우 극히 개인적이어야 하는 API Key등을 숨기는 방법에 대해서 이야기를 하고 있다.  나야 뭐 git 등에 게시할 만큼의 skill 이 없으니 다행(?)이라고 생각이 들기는 한다. 


 


아무튼 local.properties 의 활용에 대해서 공부를 해 보는 기회가 되기를 바래 본다.  


 


1. API key 등은 local.properties 에 저장하자.


dev.googleApiKey="????????????????????????????????????????"
prod.googleApiKey="????????????????????????????????????????"

2. 다음은 build.gradle 파일에 저 값을 가져 오도록 설정해 두어야 한다.


def localPropertiesFile = rootProject.file('local.properties')
def localProperties = new Properties()
localProperties.load(new FileInputStream(localPropertiesFile))

3. 다음은 gradle 파일에서 그 값을 활용할 수 있도록 선언해 주는 것이다. 


buildTypes {
debug {
resValue "string", "GOOGLE_API_KEY", "${localProperties.getProperty("dev.googleApiKey")}"
}
release {
resValue "string", "GOOGLE_API_KEY", "${localProperties.getProperty("prod.googleApiKey")}"
}
}

4. 그리고 이제 소스에서 읽어 올때는 다음과 같이 하면 된다.


getString(R.string.GOOGLE_API_KEY)

 


끝.


 


그런데 firebase 을 활용하는 동안에는 google-service.json 이라고 저런 API key가 들어있는 파일을 내려받아, apps 폴더에 넣고 개발을 하는데, 이 때는 어떻게 하라는 말인가 ?


 


흠... 이것도 찾아 보아야 겠다.


 


 


locale.properties



 





오늘의 이야기

https://yunaaaas.tistory.com/19



 


[Android/Kotlin] 언어설정 (Eng / Kor) 변경하기


2020 스마트 관광 앱 개발 공모전에 K-Pop 명소 추천 플랫폼인 'Kravel'을 개발하였는데요. 외국인을 타겟으로 한 앱이다 보니 영어/중국어,등 설정언어를 변경할 수 있도록 해주는 기능 이 필요했습


yunaaaas.tistory.com




먼저 이글은 위 게시물에 기반해서 작성된 것임을 밝힘.


 


앱을 만들면서 여러나라 사람이 사용할 수 있는 앱을 만들고 싶다. 그래서 번역 API 을 활용하는 앱을 만들기 시작했다. 그러다 보니, 나의 앱은 우리나라에서만 사용하는 사람들을 위한 앱이 되어 가고 있는데, 이 나라에 온 사람들이 다 자기 나라말을 하고 싶을 것이다. 


 


 


그래서 앱의 언어 설정을 변경하는 기능을 구현해 보기록 했다.  코드 구현은 다음과 같이 했다.


 


private fun setLocale(Lang: String) {
Log.e("로그", "setLocale=$Lang" )
val locale = Locale(Lang) // Local 객체 생성. 인자로는 해당 언어의 축약어가 들어가게 됩니다. (ex. ko, en)
Locale.setDefault(locale) // 생성한 Locale로 설정을 해줍니다.

val config = Configuration() //이 클래스는 응용 프로그램이 검색하는 리소스에 영향을 줄 수 있는
// 모든 장치 구성 정보를 설명합니다.

config.setLocale(locale) // 현재 유저가 선호하는 언어를 환경 설정으로 맞춰 줍니다.
baseContext.resources.updateConfiguration(config, baseContext.resources.displayMetrics)

val intent = baseContext.packageManager.getLaunchIntentForPackage(baseContext.packageName)
intent!!.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent!!.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
finish()
startActivity(intent)
}

다만, 한국어 설정시 ko 로 해야 하는 동작을 한다는 것, kr 이라고 생각을 할 수 도 있지만...  이제 다른 나라 언어도 설정을 해 보아야겠다.   다국어 버전을 만들기 위해서는  잘 하지 못하는 영어이기는 하지만, default 을 영어로 설정하는 것이 도움이 된다.   위 예시와 같이 locale 설정을 변경한 다음 화면을 다시 그려야 하기 때문에 강제로 앱을 종료하고 새로 실행하는 방식으로 해결을 한 원작자의 의도(?)을 이해 할 수 있었다.


 


언어변환예시



 


그 다음은 아래 포스팅을 참고 해서 이런 저런 나라의 언어로 번역된 파일을 만들어 보는 것이다. 그리고 나서


그것을 내 프로젝트의 res 폴더 아래  values-ko-rKr (한국어) 부터 폴더별로 string.xml 파일을 만들어 담아 보자.


 


https://billcorea.tistory.com/37



 


안드로이드 다국적(?) 앱 만들어 보기 (feat 카카오 번역 API, python 활용)


앱을 만들어 등록하는 동안 하고 싶은 것 중에서 한가지는 여러나라의 언어로 배포를 해 보는 것이였다. 예전에는 그걸 하나 하나 번역을 해 가면서 등록을 했던 것을 카카오 번역 API 호출하여


billcorea.tistory.com




 


마무리가 다 되면 다시 이글을 업데이트 하도록 해야겠다.


 


 





 





오늘의 이야기


#스하리1000명프로젝트,
Bị lạc ở Hàn Quốc? Ngay cả khi bạn không nói được tiếng Hàn, ứng dụng này vẫn giúp bạn đi lại dễ dàng.
Chỉ cần nói ngôn ngữ của bạn—nó sẽ dịch, tìm kiếm và hiển thị kết quả bằng ngôn ngữ của bạn.
Tuyệt vời cho du khách! Hỗ trợ hơn 10 ngôn ngữ bao gồm tiếng Anh, tiếng Nhật, tiếng Trung, tiếng Việt, v.v.
Hãy thử nó ngay bây giờ!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/03/05

오늘의 이야기

네잎 크로바



 


오늘은 컴터를 켰더니 떠~억 네잎 크로바가 나왔다. 행운이 가득 하길 바라며... 오늘도 잘 살았으니, 감사합니다.


 





오늘의 이야기


오랜만에 남문 광장엘 갔는데
대전에도 영희가 있네요.





오늘의 이야기



#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase

🎯 야 너 토요일마다 로또 확인하냐?
나도 맨날 "혹시나~" 하면서 봤거든 ㅋㅋ

근데 이제는 그냥 안 해
AI한테 맡겼어 🤖✨

그것도 구글 Gemini로다가!

그래서 앱 하나 만들었지
👉 "로또 예상번호 by Gemini" 🎱

AI가 분석해서 번호 딱! 뽑아줌
그냥 보고 참고만 하면 됨

재미로 해도 좋고…
혹시 모르는 거잖아? 😏


https://play.google.com/store/apps/details?id=com.billcorea.gptlotto1127




오늘의 이야기

앱을 만들어 사용하다 보면 간혹 이미지를 받아와서 사용하게 되는 경우가 있게 된다. 그런데, 온라인으로 firebase 을 활용해 저장을 해 보려 하니, 저장 하고 받아오는 속도가 문제가 되는 것 같다.  여기서 사용되는 이미지는 그냥 참고를 위한 간략한 정보로만 사용되기 때문에 그 크기를 줄여 성능 이슈를 보완하는 것으로 방향을 선택 했다.


 


먼저 이미지는 어떻게 수집할 것 인가 ?  이 부분은 이전 게시한 글을 참고하길 바라며


https://billcorea.tistory.com/196



 


안드로이드 앱 만들기 : Jetpack Compose 에서 프로필 이미지 저장해 보기


앱을 만들다 보면 프로필 가져오기 기능을 구현해 보는 경우가 간혹 생긴 게 된다. 오늘은 compose을 이용한 구현을 하는 과정에서 갤러리에서 이미지를 불러와서 프로필 사진으로 저장하는 과정


billcorea.tistory.com




 


오늘은 불러온 이미지를 줄이는 방법에 대한 이야기를 해 볼까 한다.


 


bitmap.value?.let {  bitmap ->
var btm = bitmap
val baos = ByteArrayOutputStream()
btm?.compress(
Bitmap.CompressFormat.PNG,
100,
baos
)
val b: ByteArray = baos.toByteArray()
jobRefImage.value = Base64.encodeToString(b, Base64.DEFAULT)
}

먼저 그냥 compress 을 해 보는 방법이다.  구글 검색을 통해서 얻은 내용으로는 compress 을 하는 건 이미지를 압축하기는 하지만, 크기가 변하지는 않는다. 요새 폰의 카메라른 워낙 성능이 좋아서 사진 크기가 5Mbyte을 넘어가는 경우도 있는데, 그 크기가 줄어 들지 않는 것이다. 그래서 이걸 그대로  byte type 으로 변환 해서 저장을 하고자 했더니,  모래시계만 뱅글 뱅글... 끝나지가 않았다.


 


private fun resizeBitmap(bitmap: Bitmap): Bitmap? {
val resizeWidth = 512
val aspectRatio = bitmap.height.toDouble() / bitmap.width.toDouble()
val targetHeight = (resizeWidth * aspectRatio).toInt()
val result: Bitmap = Bitmap.createScaledBitmap(bitmap, resizeWidth, targetHeight, false)
if (result != bitmap) {
bitmap.recycle()
}
return result
}


// 실제 함수 호출은 이렇게 해서 위에서 작성한 코드를 대체 하였다.
bitmap.value?.let { bitmap ->
var btm = resizeBitmap(bitmap)
val baos = ByteArrayOutputStream()
btm?.compress(
Bitmap.CompressFormat.PNG,
100,
baos
)
val b: ByteArray = baos.toByteArray()
jobRefImage.value = Base64.encodeToString(b, Base64.DEFAULT)
}

그래서 찾은 방법이 createScaledBitmap 함수 이다. 그 사용 방법은 위 내용과 같다. 이렇게 하면 이미지의 크기를 내가 원하는 크기로 조절하기 때문에 사이즈도 줄어 들고 firebase realtime database 에 byte type 을 저장을 하더라도 성능이 떨어지지 않는 것을 알게 되었다.


 


이미지가 적용된 앱 예시



 





오늘의 이야기


#스하리1000명프로젝트

스치니들!
내가 만든 이 앱은, 내 폰에 오는 알림 중에서 중요한 키워드가 있는 경우
등록해둔 친구에게 자동으로 전달해주는 앱이야 📲

예를 들어, 카드 결제 알림을 와이프나 자녀에게 보내주거나
이번 달 지출을 달력처럼 확인할 수도 있어!

앱을 함께 쓰려면 친구도 설치 & 로그인해줘야 해.
그래야 친구 목록에서 서로 선택할 수 있으니까~
서로 써보고 불편한 점 있으면 알려줘 🙏

👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


오늘도 메일이 왔다... 검증을 요청한 앱이 정책 위반으로 검증을 통과하지 못했다는... ㅠㅠ;;


검증오류 메시지


검증오류 확면


검증 오류 화면



연속 3일째 도전 중이기는 하나... playstore의 검증팀은 깐깐한가 보다...

1. 검증을 통과하지 못하는 이유?  메일의 내용은 그것이다.  사용자가 메시지나 정보를 등록하는 앱의 경우 (UGC라고 하던데)에는 불건전한 게시물이나, 채팅 내용 등이 발생할 것이 예상되는 경우,  그런 사용자나, 게시물에 대한 신고 기능을 구현하고

2. 관리자로 하여금 선량한 관리자의 의무를 다하라고 하는 내용으로

경고 안내문이 오고, 게시를 요청한 앱의 검증은 실패가 된다.

3. 이런 경우라고 해도, 이전 버전이 playstore에 등록되어 있다면, 그것이 삭제되거나 하지는 않는다.

다만, 지속적으로 이에 대한 보완을 행하지 않는 다면, 최종적으로는 앱이 퇴출될 수도 있으니 신속하게 보완해서 재 반영을 요청하여야 한다.


 


2022.06.23 수정


이제 통과되었다. UGC 가 있는 화면 마다 스팸이나, 블랙유저 신고를 할 수 있는 버튼을 달아야 하고, 알림 다이얼로그의 문구 하나도 각 상황에 맞게 표시를 해야만 검증을 통과하게 된다.


 


https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416 



 


다국어 일자리 구하기 (multi language) - Google Play 앱


한국에서 일자리를 구하는 사람들에게 한국어가 익숙하지 않아도 찾을 수 있도록 지원할 예정 입니다.여러 나라 사람들과 채팅을 할 수 있습니다.


play.google.com




 





오늘의 이야기

https://blog.protein.tech/document-your-kotlin-android-project-using-dokka-a4129a461203



 


Document Your Kotlin-Android Project Using Dokka


Keeping track of source code is challenging for any software project. It's even more challenging when you're working on an open-source…


blog.protein.tech




개발자로 살면서 제일 징그럽게 싫었던 것 중 하나, 문서화 


제일 필요하다고 생각했던 것도 문서화...


 


다양한 방법의 문서화 방법이 있을 것이라고 생각이 되기는 한다. 나의 경우는 코드 작업을 하면서 최대한 기억을 남겨 두기 위한 노력을 했었다.  그래도 잘 되지 않았던 것이 문서화를 하는 것이다.


 


구글링을 하다 발견한 문서 하나의 링크를 걸어 두었다. 두고두고 배워서 정리를 하리라 다짐하며...


 





오늘의 이야기

다음은 제공된 데이터를 기반으로 분석된 로또 번호 패턴 및 다음 라운드(1214회차)를 위한 추천 번호 조합입니다. --- **분석 결과:** | 회차 | 당첨 번호 (정렬) | 간격 패턴 | 짝수/홀수 (E/O) | 총합 | 평균 | 이전 동일 총합...