2026/03/08

오늘의 이야기

구글에서는 이제 android 13을 대상으로 앱을 게시하기 위해서는 광고 ID을 선언해야 한다고 합니다.  물론 이전부터(2022.4.1 이후) 적용되기 시작했던 부분이나, 9월이 된 이제 서야 준비를 해 봅니다. 그동안은 API 버전이 32 이하인 경우에만 적용되는 앱을 배포하여 왔기 때문에 문제가 되지 않았으나, 이제 API 33 이상 버전으로 옮겨 가기 위해서는 준비를 해야 할 때가 되었다고 볼 수 있습니다. 


 


이번에 패치를 하는 앱이 있어서 시도를 해 보았습니다. 그래서 일단 앱은 정상적으로 패치가 적용 되어 게시되었습니다. 아직 어떤 의미가 있는지는 알 수 없으나, playstore의 게시에서 퇴짜(?)를 받지 않았으니 정리를 해 두고자 합니다. 


 


먼저 manifest 파일에 다음 한 줄을 추가 했습니다. 


<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>

다음은 gradle 파일에 추가 합니다. 


implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1'
implementation 'com.google.android.gms:play-services-appset:16.0.2'

다음은 체크 루틴을 추가해 두었습니다. 


MainActivity 에 다음과 같이 function을 추가하고, onCreate에서 해당 function을 호출하는 정도... 이걸로 끝?


fun getIdAndLat() {
var adInfo: AdvertisingIdClient.Info? = null;
try {
adInfo = AdvertisingIdClient.getAdvertisingIdInfo(this@MainComposeActivity)
} catch (e : java.lang.Exception) {

}
var GAID = adInfo?.id
var limitTracking = adInfo?.isLimitAdTrackingEnabled

var client = AppSet.getClient(this@MainComposeActivity)
var task = client.appSetIdInfo
task.addOnSuccessListener { info ->
var scope = info.scope
var id = info.id

Log.e("getIdAndLat=", "${GAID} ${limitTracking} ${scope} ${id}")
}

Log.e("getIdAndLat", "----------------- END")
}

코드를 보면 알 수 있듯이 코드에서는 adInfo을 구하여 id을 찾아보는 정도까지만 구현이 되어 있고 그 이외의 것은 아무것도 하지 않고 있습니다.  그래도 아직 까지는 딱히 문제가 발생되었다는 보고를 하고 있지 않습니다. 


 


실행되는 앱의 샘플 이미지는 다음과 같습니다.


광고 테스트 화면



 


다른 내용이 발견되거나, 오류 보고가 발생하게 되면 이 게시글은 수정될 수 있습니다.


 


앱을 게시하게 되면 정책 에서 앱 콘텐츠 을 선택하고 광고ID을 클릭해서 광고ID 사용에 대한 내용을 저장해야 합니다. 


그래야 앱을 게시할 때 정상적으로 게시를 진행할 수 있습니다.


 




 





오늘의 이야기

오늘은 어제에 이어 애드센스에 결제정보를 등록해 보아야겠다.  어제 알아본 것과 같이 해외에서 입금받을 때 수수료가 제일 저렴한 경우는 카카오 뱅크와 하나은행 정도였으니  두 곳의 swift code을 고객센터를 통해서 확인해 보았다.







요새는 모바일에서 운영하는 고객센터를 통해서 유선 질의를 하지 않아도 쉽게 해당 정보를 확인할 수 있었다.

이제 등록을 해 보자. 먼저 애드센스 로그인 후에 결제 화면에 들어가 보자.







이 그림들의 순서대로 해서 결제정보에 결제 수단을 추가하고, 새 은행 정보를 추가해서 등록하면 된다.

은행 정보를 입력할 때는 해당 은행에 등록하면서 입력했던 영문 이름이 필요하므로 해당 정보를 먼저 찾아야 하고, 나머지 정보는 swift code을 확인하면서 찾은 정보만 있으면 된다.  은행 이름도 영문 이름으로 입력을 해야 하기 때문에 위에서 확인한 swift code 관련 내용에서 찾아서 입력하면 되고, 계좌번호는 실제 내가 사용하고 있는 계좌번호를 입력해 주었다.

중개은행, FFC 또는 FBO 입력은 선택사항으로 되어 있으니, 일단 무시하고 넘어가 보겠다.  이제 다른 연락이 없다면, 내 계좌로 수입이 들어오는 날을 손꼽아 기다려 보아야겠다.

그날이 언제 오려는 지...





오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기

티스토리 운영을 한 지 1년 하고도 8개월이 넘었다.
그동안의 수고를 덜어주는 메일을 하나 받았다. 잘하시는 분들은 이미 경험을 하셨겠지만...

난 이제서야... ㅋ~ 아무튼 메일의 내용은 지급 방식 없음. 내용을 살펴보고 adsense 계정의 정보를 찾아본다.

adsense에 들어가서 결제 메뉴에 들어가니 지급받을 정보를 입력하라는 데... 아직 계좌 정보를 입력하지 않았다. 이런 일이 생길지 몰랐기 때문에...


Google Payments 에서 온 메일




그래서 이제 찾아보아야겠다고 생각을 하고 구글링을 해 보았다. 어떤 게시물에는 우리은행 크리에이터 통장을 개설하면 외국에서 송금받는 수수료가 공짜라는 내용이 있어서 찾아보았더니, 홈페이지에 게시된 설명에는 실적이 충족한 경우라는 단서 조항이 있었다.






그래서 이제는 다른 은행을 알아 보아야 헸다. 난 저 실적을 충족시켜 다음 해를 기다릴 역량이 되지 않을 듯 하니 말이다.






은행연합회 (은행들이 회원으로 가입 되어 모든 거래가 연결되는 곳...)의 포털에서 이런 게시글을 찾아볼 수 있었다.

은행별로 수수료가 조회가 되는 게시물이었는데, 해외에서 비대면은 송금을 받는 경우 제일 저렴한 수수료는 건당 5000원을 하고 있는 카카오 뱅크와 하나은행 정도인 것 같다.

이미 카뱅 계좌는 있으니, 이제 등록을 해 보아야 겠다.





오늘의 이야기


#스하리1000명프로젝트

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

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

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

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





오늘의 이야기

https://emmanueldav.medium.com/tips-and-tricks-that-would-improve-your-skills-as-an-android-developer-7e2e81351877



 


Tips and Tricks that would improve your skills as an Android Developer


Here are the best Tips and tricks that would Improve your skills and speed as an Android developer


emmanueldav.medium.com




링크 사이트 입니다.


 


간혹은 필요해 보입니다. 





오늘의 이야기

요사이 한동안 즐겨 보았던 드라마 생각이 나는 바탕화면이 떠~억 올라온다. 


얼음돌



찬바람이 불어 치는 바다... 이 사진은 어디 북극해에서라도 촬영을 한 것일지?  자연 훼손이 심각해지고 있어서 이제는 더 늦을 수 없을 만큼 중요해져 가고 있을 것 같은데, 


 


난 이 사진을 보면서 얼음돌 생각이 난다... 한 두어 달은 재미있었는 데, 그 끝이 새드엔딩이라... 시즌2를 기다려야 하는 건지 잘 모르겠다.


 


아무튼 시즌2가 돌아올 때 까지 쭈~욱 기다려 볼게... 무덕이.


환혼 이미지



 





오늘의 이야기


#스하리1000명프로젝트,
Parfois, il est difficile de parler avec des travailleurs étrangers, n'est-ce pas ?
J'ai créé une application simple qui aide ! Vous écrivez dans votre langue et les autres le voient dans la leur.
Il se traduit automatiquement en fonction des paramètres.
Super pratique pour des discussions faciles. Jetez-y un oeil quand vous en aurez l'occasion !
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

요소수가 품귀현상을 보이던 시점에 앱을 하나 만들었던 기억이 납니다. 그러던 어느 날 data.go.kr에서 메일을 하나 받았습니다. 이제는 더 이상 정보 제공을 하지 않는다는...


공공데이터 포털 공지사항



그리고 오피넷 API을 사용하라는 안내와 함께 말입니다.  그래서 오피넷에 무료 API 사용을 허가받을 수 있는지 메일을 보냈습니다. 무료 이용이 가능하다는 안내와 함께, API 사용을 위한 Key 도 보내 주더군요.


 


API 가이드를 읽어보다 보니 지도에 위치 정보를 표기하기 위해서는 위, 경도 좌표가 필요한데 (구글맵 기준) 오피넷에서는 우리나라에서만 사용하는 것 같은 고정위치 연동 좌표를 전달하는 것으로 확인이 되었습니다. 위,경도 좌표가 아니기 때문에 표기를 할 수 없다는 문제가 발생했습니다.  그래서 알지 못하는 짧은 지식을 동원하여 이것저것 찾아보던 중...


https://github.com/locationtech/proj4j



 


GitHub - locationtech/proj4j: Java port of the Proj.4 library for coordinate reprojection


Java port of the Proj.4 library for coordinate reprojection - GitHub - locationtech/proj4j: Java port of the Proj.4 library for coordinate reprojection


github.com




이런 변환 방법이 있다는 것을 알게 되었죠. 해서 적용을 해 보기로 했습니다. 다만, 이런저런 방법으로 찾아보니 적용하는 방법에 약간의 차이가 있다는 것을 알게 되어 일부 수정을 해 보았습니다.


 


implementation 'org.locationtech.proj4j:proj4j:1.1.5'

gradle 파일에는 위와 같이 참조하는 implementation을 추가합니다. 


 


이제 코드를 구현해 보겠습니다.


val crsFactory = CRSFactory()
val WGS84 = crsFactory.createFromParameters(
"WGS84",
"+title=WGS84 +proj=latlong +ellps=WGS84 +datum=WGS84 +units=degrees"
)
val TM128 = crsFactory.createFromParameters(
"TM128",
"+proj=tmerc +lat_0=38 +lon_0=128 +k=0.9999 +x_0=400000 +y_0=600000 +ellps=bessel +towgs84=-146.43,507.89,681.46 +units=m +no_defs"
)
val ctFactory = CoordinateTransformFactory()
val wgsToUtm = ctFactory.createTransform(TM128, WGS84)
val result = ProjCoordinate()

val retrofit = RetrofitApi.opNetCreate()
retrofit.getUreaPrice(code = "당신의 API KEY", out = "json", area = "17")
.enqueue(object : retrofit2.Callback<UreaPriceBean> {
override fun onResponse(call: Call<UreaPriceBean>, response: Response<UreaPriceBean>) {
if (response.code() == 200) {
for(oilBean in response.body()?.oilBean!!.oilData) {
Log.e("onResponse=", "${oilBean.osNm} ${oilBean.gisXCoor} ${oilBean.gisYCoor}")
wgsToUtm.transform(ProjCoordinate(oilBean.gisXCoor.toDouble(), oilBean.gisYCoor.toDouble()), result)
Log.e("result=", "${result.y} ${result.x} ")
}
}
Log.e("onResponse=","${response.message()}")
}

override fun onFailure(call: Call<UreaPriceBean>, t: Throwable) {
Log.e("onFailure=", "${t.message}")
}

})

 


이제 실행해 보겠습니다.  아직은 화면에 표시 구현을 하지 않아서, 일단 로그를 찍어 보았습니다. 


 


로그



 


위치 정보로 지도에서 검색



지도에서 주유소 위치에 마크가 표시되는 것을 확인하였으니, 이제 앱으로 구현해 보고 정리가 완료되면 앱을 게시해 보겠습니다.


 


실제 구현된 이미지를 보도록 하겠습니다.


 


오피넷 API 활용 앱 예시



실제 적용한 앱은 playstore 에서 받아볼 수 있습니다.  


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



 


주변검색, 주변찾기, 가는길에, 요소수 주유소 - Google Play 앱


내주변의 장소를 선택하고, 선택한 위치에 도착하면 사전에 등록한 알림을 보내 줍니다.


play.google.com




 





오늘의 이야기

https://github.com/afollestad/material-dialogs



 


GitHub - afollestad/material-dialogs: 😍 A beautiful, fluid, and extensible dialogs API for Kotlin & Android.


😍 A beautiful, fluid, and extensible dialogs API for Kotlin & Android. - GitHub - afollestad/material-dialogs: 😍 A beautiful, fluid, and extensible dialogs API for Kotlin & Android.


github.com




 


오늘은 미디움 에서 받은 메일의 내용중에서 기억해 두면 좋을 것 같은 정보 하나를 읽어 보도록 하겠습니다. 


 


앱을 만들다 보면 알림 다이얼로그를 구현해야 하는 경우가 종종 발생합니다. 이런 경우 일반적이라면 AlertDiaglog 을 활용하게 됩니다.  통상적인 다이얼로그는 theme 을 기준으로 해서 화면에 구현이 되고, 사각형 박스 형태로만 운영이 됩니다. 또한 컴스터하게 다이얼로그를 만들려고 할려면 layout  파일을 구성하거나 하는 방법으로 구현을 하기도 했습니다.


 


jetpack compose 으로 넘어가면서 그 마저도 화면을 일일이 구현하는 방식으로 전환 되어야 했습니다. 이제는 조금은 수월하게 알림을 구현해 볼 수 있을까 ? 도전해 보도록 하겠습니다.


 


먼저 일반적으로 작성한 코드를 살펴 볼께요.  다음과 같이 builder 을 만들고, 설정을 하고,  선언을 한 다음,


버튼의 색도 필요에 따라서 색을 입혀볼 수 있었습니다.


 


변경전 화면



val builder = AlertDialog.Builder(this@MainComposeActivity, R.style.Theme_MaterialComponents_Dialog_Alert)
.setTitle("[" + documents.placeName + "]" + getString(R.string.add_geofences))
.setMessage(getString(R.string.msgAddGeoFences))
.setPositiveButton(getString(R.string.OK), DialogInterface.OnClickListener{ dialogInterface, i ->
doAddGeoFence(documents)
})
.setNegativeButton(getString(R.string.CANCEL), DialogInterface.OnClickListener { dialogInterface, i ->

})
var alertDialog = builder.create()
alertDialog.show()
alertDialog.window?.setBackgroundDrawable(ColorDrawable(android.graphics.Color.TRANSPARENT))
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(getColor(R.color.white))
alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(getColor(R.color.softRed))

 


 


 


 


 


 


변경후에는 위에서 소개된 라이브러리를 이용해서 이겠지만, 코드가 무척 단순해 졌음을 알 수 있습니다.


변경후 예시



MaterialDialog(this).show {
icon (R.drawable.ic_location_softgreen)
title(text = "[" + documents.placeName + "]" + getString(R.string.add_geofences))
message(R.string.msgAddGeoFences)
positiveButton (R.string.OK) {
doAddGeoFence(documents)
}
negativeButton (R.string.CANCEL){

}
}

 


다만 font 나 버튼색을 입히기 위헤서 style 파일에 다이얼로그을 위한 style 을 지정했습니다.


<style name="AppTheme.Custom" parent="Theme.Ontheway801">

<item name="md_corner_radius">16dp</item>
<item name="md_color_title">@color/softBlue</item>
<item name="md_color_content">@color/softBlue</item>
<item name="md_color_button_text">@color/softBlue</item>
<item name="md_background_color">@color/transParent</item>
<item name="md_font_title">@font/poorstory_regular</item>
<item name="md_font_body">@font/poorstory_regular</item>
<item name="md_font_button">@font/poorstory_regular</item>

</style>

 


또한 onCreate 에서 setTheme 을 이용해서 설정을 해 주었습니다.


 


setTheme( R.style.AppTheme_Custom )

 


위애서 소개했던 material-dialogs 중에서 이제 겨우 1개에 대한 내용을 읽어보고 따라하기를 해 보았습니다. ㅋ~


언제 다 경험을 해 볼 수 있을까요?





오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, une application incontournable des clubs de badminton !
👉 Match Play – Enregistrez des scores et trouvez des adversaires 🎉
Parfait partout, seul, entre amis ou en club ! 🤝
Si vous aimez le badminton, essayez-le

Accédez à l'application 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

구글에서는 이제 android 13을 대상으로 앱을 게시하기 위해서는 광고 ID을 선언해야 한다고 합니다.  물론 이전부터(2022.4.1 이후) 적용되기 시작했던 부분이나, 9월이 된 이제 서야 준비를 해 봅니다. 그동안은 API 버전이 32 이하인...