2026/02/17

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기



보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.













오늘의 이야기

구글의 playstore 는 개발자 등록을 하기 위해서는 $25 정도의 초기 등록 비용이 발생한다. 대략 30,000원 이하 정도


그러나 onestore 는 그럴 필요가 없다. 우리나라 통신3사의 사용자들이 동시에 접속하기도 하기 때문에 국내에서만 판매를 목적으로 한다면, playstore 을 공략할 필요는 없을 것으로 보인다. 


 


그럼... 먼저 onestore 에 개발자로 가입을 해 보자.


https://dev.onestore.co.kr/devpoc/index.omp



 


ONE store developer center


Explore delight 매일매일 새로운 즐거움을 발견합니다.


dev.onestore.co.kr




 


이번에는 상단 메뉴 중에서 APPS 을 클릭해서 나의 상품현황을 조회해 보자


onestore 메뉴




 그 다음은 신규 상품 등록을 클릭해서 상품에 대한 정보를 추가해 보자


 


 


 


 


 


 


 




상품 제목을 입력하고 


나의 앱 package name 을 입력하고 중복 체크를 클릭해서


중복 여부를 점검해 보는 것이다.


 


 


 


 


 


 


 


 


 


그 다음은 상품 정보등을 등록해 보자.


상품 등록 메뉴



상품을 이미 playstore 에 등록을 하고 있다면 상품정보 가져오기를 이용하여 쉽게 정보를 등록해 볼 수 있다.




 




playstore 에 등록 했던 정보가 자동으로 넘어 왔다.  다만, 스크릿 샷은 8개만 적용할 수 있기 때문에 꼭 필요한 이미지만 8개를 선택해야 한다.  8개 선택이 되었다면, 확인을 클릭하여 다음으로 넘어가 보자.


 


상품 등록 이미지 1



 


상품 제목은 앱의 이름 , 이것은 keyword 을 잘 선택해서 입력해 두어야 한다. 그래야 사용자가 내 앱을 찾을 때 잘 찾을 수 있도록 도움을 줄 수 있다.  한줄 설명에는 나의 앱을 대표할 수 있는 간략한 설명을 입력해 주고, 상품 설명에는 나앱의 사용자 설명을 길게 나열해 준다. 그래도 부족하다면 개인적으로 운영하는 블로그 URL 을 입력해 주는 것도 좋은 방법이 된다고 생각이 된다.  잘 오지 않는 내 블로그의 방문자 확장을 위해서...


 


상품 등록 이미지 2



외부결제 사용 - 내앱에서 결제 기능을 사용하는 경우에 적용할 수 있는데, 인앱결제등을 playstore 등에서 이미 구현을 했다면 선택을 해야 할 것 같고. 그렇지 않다면 사용안함으로 설정하면 된다.  사용안함을 선택하면 안내문이 나오니 잘 읽어보고 결정 하시길...


 


그 다음은 그래픽 이미지을 등록해야 하는데, 이미지 규격을 맞쳐주지 않으면 등록이 되지 않으니 반드시 이미지 규격을 확인해서 맞게 해 주어야 한다.   구글에서는 사이즈 범위로 체크를 하던데 여기서는 꼭 사이즈를 1024 * 578 로 해 주어야 등록이 되니, 주의 하여야 한다.


YouTube URL 의 경우는 앱에 대한 설명을 동영상으로 해서 youtube 에 등록해 두었다면, 해당 url 을 입력해 주면 된다.


그 다음은 권한설명인데, 이 부부은 manifest 파일에 설정한 권한, 앱을 구동하면서 사용자에개 허가를 받아야 하는 권한등에 대한 설명을 입력한다.


 




 대표 아이콘은 앱을 개발할 때 사용했던 icon 이미지를 설정해 주면 되고, 동영상은 mp4 파일 만들어 두었다면 그것을 올려 주면 된다.  앱의 기능 설명이 들어 있어야 한다.  스크린 샷은 8개 까지만 올리는 수 있으므로 대표 이미지가 될 것 같은 이미지들로 올려 주면 된다. 해상도 제한은 1300 * 1300 dpi 이하이면 되므로 playstore 등록시에 사용했던 이미지 파일을 그대로 가져와서 사용하면 된다.


 


상품 등록 카테고리 설정



앱의 기능 분류를 대표할 내용으로 해서 카테고리를 구분하고, 이용자 등급을 선택해서 등록하면 된다.  15세 이용가로 등록하면 무난할 것 같다. 청소년 이용불가 등 어려운 선택은 하지 않는 것이 좋다. 


 


상품 등록 키워드 설정



키위드, 검색할 상품제목 등은 잘 설정해 두어야 앱 스토어에서 검색에 도움이 되며, 네이버에서 검색할 때도 유용하게 검색이 될 수 있도록 만들 수 있다.


 


상품등록 수집정보 등



앱에서 사용하는 위치정보가 있는 경우, 개인정보를 습득 하는 경우 이 부분에 대한 안내를 먼저 해야 한다.  나는 없으니 없다고 선택했다. 지적재산권은 타인의 개발한 기능을 이용하는 경우 표시를 해 두어야 한다.  


 


상품등록 판매자 정보



끝으로 판매자에 대한 정보를 기술하면 일단은 완료..  전부 입력을 했다면, 화면 상단으로 가서 저장을 클릭한다.


 


To be continue ... 이후 부분은 다음에...


 





오늘의 이야기


#스하리1000명프로젝트

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

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

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

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





오늘의 이야기



보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.













오늘의 이야기

오늘은 난데없이 구글에서 메일이 하나 왔다. 헉~ 뭔가 ? 열어 보았더니, playstore 에 등록해 두었던 앱 하나가 삭제 되었다는 것이다. 


 





이건 무슨 말인가 ? 앱이 삭제 되다니... 뭐 예전에도 몇개의 앱이 삭제 되었다는 메일을 받은 적이 있어서... ㅋ~ 그다지 놀랍지도 않지만, 이번에는 어떤 이유로 ? 그래서 메일을 첨부 이미지를 열어 보았더니.  두둥~




 


친절하기도 하여라... 앱을 실행했다가 종료하기 위해서 뒤로 가기 버튼을 클릭했을 때, 한번 클릭으로 앱이 종료 되는 것을 막기 위해서 두번 클릭 하라는 안내 문구를 보여 주면서 adsense 을 통해서 광고를 붙였는데, 흠... 그것이 Toast.LENGTH_LONG 을 설정해 두기는 했지만,  저렇게 앱이 종료된 이후에도 Custom Toast 메시지가 남아 있어서 구글에서는 그것을 일부러 저렇게 처리했다고 판단하는 것 같았다. 


 


에구~... 집에 오자마자, 컴터를 켜고 수정을 했다. 


 


package ......

import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;

import com.billcoreatech.boss0426.R;
import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.AdListener;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.ads.LoadAdError;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.ResponseInfo;


/**
*
*/
public class KakaoToast {

static private AdView mAdView;
static String TAG = "KakaoToast";
static SharedPreferences option ;

public static Toast makeToast(Context context, String body, int duration){
LayoutInflater inflater;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.view_toast, null);
TextView text = v.findViewById(R.id.message);
text.setText(body);
mAdView = v.findViewById(R.id.adView);
option = context.getSharedPreferences("option", context.MODE_PRIVATE);
MobileAds.initialize(context);
AdRequest adRequest = new AdRequest.Builder().build();

// 2021.09.27 구글에서 요청사항 반영.... 앱이 종료 되어도 광고가 노출 된다고...
if (duration == 9) {
mAdView.setVisibility(View.GONE);
duration = Toast.LENGTH_SHORT ;
} else {
mAdView.loadAd(adRequest);
mAdView.setVisibility(View.VISIBLE);
}

mAdView.setAdListener(new AdListener(){
@Override
public void onAdLoaded() {
super.onAdLoaded();
Log.e(TAG, "onAdLoaded");
}
@Override
public void onAdClosed() {
super.onAdClosed();
Log.e(TAG, "onAdClosed");
}

@Override
public void onAdOpened() {
Log.e(TAG, "onAdOpened");
}

@Override
public void onAdClicked() {
super.onAdClicked();
Log.e(TAG, "onAdClicked");
}
@Override
public void onAdImpression() {
super.onAdImpression();
Log.e(TAG, "onAdImpression");
}

@Override
public void onAdFailedToLoad(@NonNull LoadAdError error) {
super.onAdFailedToLoad(error);
String errorDomain = error.getDomain();
int errorCode = error.getCode();
String errorMessage = error.getMessage();
ResponseInfo responseInfo = error.getResponseInfo();
AdError cause = error.getCause();
Log.i(TAG,"------------------------------------");
Log.i(TAG, "error=" + error.toString());
Log.i(TAG, "errorDomain=" + errorDomain);
Log.i(TAG, "errorCode=" + errorCode);
Log.i(TAG, "errorMessage=" + errorMessage);
Log.i(TAG, "responseInfo=" + responseInfo.getResponseId());
Log.i(TAG, "responseInfo=" + responseInfo.getMediationAdapterClassName());
Log.i(TAG,"------------------------------------");
}
});

Toast toast = new Toast(context);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setView(v);
toast.setDuration(duration);
return toast;
}
}

Custom Toast 을 호출할 때 duration 에 9을 전달하고 전달 받은 경우에만, mAdview 을 보여주지 않는 방식으로 ...


 


화면 layout 설계는 다음과 같이.


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/res-auto"
android:layout_width="300dp"
android:layout_height="400dp"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp"
android:weightSum="4">

<TextView
android:id="@+id/message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/background_text"
android:gravity="center"
android:text="@string/msgAdView"
android:textColor="@color/design_default_color_primary_dark"
android:textSize="24sp" />

<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
ads:adSize="BANNER"
ads:adUnitId="@string/adUnitId" />
</LinearLayout>

디자인 모드에서 보면 ...


custom Toast 을 위한 화면 예시



이렇게 Custom Toast 용 class 을 만들고 필요할 때 마다 호출해서 광고가 들어간 alert 을 발생 시킬 수 있게 구현 했는데...


KakaoToast.makeToast(getApplicationContext(), getString(R.string.msgBackPress), Toast.LENGTH_LONG).show();

activity에서 호출은 이런식으로 구현을 한다.  그렇게 하면 나만의 Toast 창이 사용되고, 그 안에 광고를 넣거나 하는 것도 쉽게 될 수 있다.


 




 


이렇게 해서 수정은 완성된 것 같다.  그래서 이제 다시 playstore 에 다시 등록을 요청 하였다.  


 




 


사용자는 몇 안되는 앱 때문에 구글도 고생이 많다. 


ㅋㅋㅋ


 


언제쯤 다시 앱이 게시 되었다는 메일을 받게될 것인가 ???


 


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


 


아래는 이앱에 대한 간략한 설명... 그리고 또한 이 앱은 일본어, 영어, 베트남어 로 지원되도록 구현해 두었다.


 


https://billcorea.tistory.com/25



 


우연히 사장 앱은.


 이 앱은 정말 작은 가게를 어쩌다 우연히 운영하게 되었을 때 물론 요새는 POS도 잘 들어가 있기는 하지만, 그것도 여의치 않을 떄 가게를 찾는 사람들은 들어오고, 가격 계산은 잘 안되고 할 때


billcorea.tistory.com




살아 돌아오길(?) 바라며... 링크를 걸어 본다.





오늘의 이야기


#스하리1000명프로젝트,
가끔 외국인 노동자들과 대화가 힘들 때가 있죠?
도움이 되는 간단한 앱을 만들어 봤습니다! 당신은 당신의 언어로 글을 쓰고, 다른 사람들은 그것을 그들의 언어로 봅니다.
설정에 따라 자동 번역됩니다.
쉬운 채팅에 매우 편리합니다. 기회되면 꼭 보세요!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

이전에 설명했던 Crashlytics 을 통해서 오류 보고를 확인하는 방법을 설명했었는데, 이번에 또 다른 것이 있는 것을 보게 되었다. ANR-WatchDog, ACRA 등도 앱의 오류가 발생했을 때, 나타나는 현상에 대한 오류 상태를 파악하고 그것으로 내가 만든 앱이 잘 돌아가는 지 확인할 수 있을 것 같았다.


 


1. 종류


  ANR-WatchDog : github 에서 찾을 수 있음


  ACRA              : github 에서 찾을 수 있음


  Crashlytics        : firebase 에서 제공


  Bugsnag          : trial 또는 demo 버전으로 제공됨 (미국에 있는 회사에서)


 


2. 각각에 대해서



  • ANR-WatchDog 


https://github.com/SalomonBrys/ANR-WatchDog#with-gradle--android-studio



 


GitHub - SalomonBrys/ANR-WatchDog: A simple watchdog that detects Android ANR (Application Not Responding) error and throws a me


A simple watchdog that detects Android ANR (Application Not Responding) error and throws a meaningful exception - GitHub - SalomonBrys/ANR-WatchDog: A simple watchdog that detects Android ANR (Appl...


github.com




현재 안드로이드 애플리케이션이 ANR 오류를 포착하고 보고할 수 있는 방법은 없습니다.
애플리케이션이 Play 스토어에 없는 경우(아직 개발 중이거나 다르게 배포하고 있기 때문에) ANR을 조사하는 유일한 방법은 /data/anr/traces.txt 파일을 가져오는 것입니다.
또한 Play 스토어를 사용하는 것이 자체 버그 추적 서비스를 선택하는 것만큼 효과적이지 않다는 것을 발견했습니다.


안드로이드 버그 트래커에 이 부족을 설명 하는 문제 항목 이 있습니다. 별표 표시를 해주세요 ;)


UI 스레드가 응답을 중지할 때 감지하는 "감시" 타이머를 설정합니다. 그렇게 하면 모든 스레드 스택 추적에서 오류가 발생합니다(기본 우선).


- github의 설명을 퍼옴  테스트를 해 보면 대기 시간이 발생하는 앱의 실행중 오류가 발생했을 때 아래 그림과 같은 오류 찾기를 할 수 있을 것으로 보임.


Watch-Dog 설정후 테스트 Logcat 이미지



 


 



  • ACRA


https://github.com/ACRA/acra



 


GitHub - ACRA/acra: Application Crash Reports for Android


Application Crash Reports for Android. Contribute to ACRA/acra development by creating an account on GitHub.


github.com




ACRA는 Android 애플리케이션이 자동으로 충돌 보고서를 보고서 서버에 게시할 수 있도록 하는 라이브러리입니다. 안드로이드 응용 프로그램 개발자가 충돌하거나 잘못 작동할 때 응용 프로그램에서 데이터를 얻을 수 있도록 지원하는 것을 목표로 합니다.


ACRA는 2020년 6월 기준 Google Play의 모든 앱 중 1.57%( AppBrain/stats 참조) 에서 사용됩니다 . 이는 ACRA를 포함하여 13,000 개 이상의 앱  50억 개 이상의 다운로드에 해당 합니다.


단계별 설치 및 사용 가이드는 설정  참조하십시오 .


Android 앱의 충돌 보고 기능은 Android 2.2(FroYo)부터 기본 제공되지만 공식 Android Market을 통해서만 사용할 수 있습니다(데이터가 제한됨). ACRA는 Android 개발자에게 큰 도움이 됩니다.


- github 의 설명 일부 내용을 퍼옴.


 



  • Crashlytics 


https://firebase.google.com/docs?authuser=0 



 


문서  |  Firebase



firebase.google.com




이것에 대한 설명은 예전 문서에도 있고,  release되는 앱에서도 잘 실행되는 것으로 확인된 바 있음.


https://billcorea.tistory.com/51



 


Android Firebase Crashlytics 무작정 따라하기


Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Tes..


billcorea.tistory.com




Crashlytics 의 stack flow 의 예시 이미지



 



  •  Bugsnag 


https://www.bugsnag.com/



 


Error Monitoring & App Stability Management | Bugsnag


Bugsnag is an error monitoring and reporting software with best-in-class functionality for mobile apps. Our tool alerts users of bugs, errors & more. Free trial!


www.bugsnag.com




Bugsnag는 애플리케이션 안정성을 모니터링하므로 새로운 기능을 구축해야 하는지 아니면 버그를 수정해야 하는지에 대한 데이터 기반 결정을 내릴 수 있습니다.
우리는
모바일 애플리케이션을위한 최고 수준의 기능을 가진 전체 스택의 안정성 모니터링 솔루션입니다.


- 홈페이지의 설명중 일부를 퍼옴.


 


3.  개인적인 의견


어떤 분의 의견 때문에 Watch-Dog 을 보다가 알게된 내용으로 이글을 정리해 보는데,  Watch-Dog이 실제 구현시 어떤 기능을 발휘 하는지는 아직 모른다, 다면 위의 logcat 이미지의 내용과 같이 ANR 오류가 발생했을 때 debug 하기 쉽지 않을 까 하는 생각이 들었을 뿐이다. 


 


개인적으로는 Crashlytics 가 나름 잘 지원이 되는 가 아닌가 하는 (물론 아직 비용 지불이 없었기는 했다) 생각이 든다.


다른 것들은 아직 적용해 보지 않아서 잘 모르겠지만... 혹시나 나중에 적용해 보게 되면 다시 정리를 해 볼 까 한다.


 





오늘의 이야기




안드로이드 스튜디어 버전을 업했다... 


안드로이드 스튜디오 버전 확인 버블비 2021.1.1 카나리12



 


그랬더니... 예전에 만들었던 project 을 열 때 마다 물어 본다.  이 project 을 신뢰할 수 있는 가?  새로운 gradle 로 변환을 하라는 것이다.


 


Trust Gradle Project ?



한번 해 보자... Trust Project ...


그래들 실행중...



그래들이 새로 빌드를 시작했다...


업데이트 해야지



프로젝트를 upgrade 할껀가 ?  upgraded 을 클릭하면 아래와 같이  시작할 껀지 물어 본다.




업그래이드를 선택하면 아래 그림과 같이 나온다. 




gradle 버전을 7.0.2 까지 올리는 건가 보다.  Run selected steps 을 클릭하면 다음 그림 처럼 라이브러리를 다운로드 한다.




다 끝나고 나서 project gradle 파일을 보면  upgrade가 끝난 것을 볼 수 있다.




 


이것으로 upgrade 가 완료 되었다.





반응형






























오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, a must-have app for badminton clubs!
👉 Match Play – Record Scores & Find Opponents 🎉
Perfect for anywhere, alone, with friends, or in a club! 🤝
If you like badminton, definitely try it

Go to app 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기










코딩하다가 comment 달아야 하는 경우가 생기면 쉽게 사용하는 단축키 Ctrl + / 인데... 간혹 이것이 동작하는 않는 경우가 있다. 


구글링을 해서 찾은 것은 한/영 입력기 가 Microsoft 입력기가 아닌 경우 나타난다고 한다.   실제로도 경험을 해보니 그런 경우가 있었다.  다음 부터는 그런 일이 없도록 잘 기억해 두어야 하겠다. 




 


 


 


오류가 난 주석처리



 


 


오류가 발생한 주석 처리는 이렇게 표시됨.


 


 


그럼 오늘도 즐~ 코딩...





반응형
























오늘의 이야기

어제에 이어 오늘은 추가 등록을 해 보겠다. 상품등록 가격 및 배포정보 이번 앱에는 google admob 광고가 들어가 있고 무료 배포를 목적으로 하기 때문에 무료 배포로 진행할 예정이고, 유료 상품으로 판매를 하기 위해서는 정산정보를 미리 등록해 ...