목록안드로이드 개발 (49)
일모도원(日暮途遠) 개발자
챗GPT API를 쓰는 앱을 개발중에 릴리즈모드에서만 죽는 현상이 발견되었다. 에러로그가 이렇게 알아보기 힘들게 나온다. 다행히 ".NoSuchFieldException: system"라는 문구로 어디가 문제인지는 파악이 된다. E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dalnimsoft.araconv, PID: 17238 java.lang.AssertionError: java.lang.NoSuchFieldException: system at f.h.g.r.k.n$j0.(:792) at f.h.g.r.k.n$w.a(:818) at f.h.g.d.k(:458) at f.h.g.r.k.i.b(:117) at f.h.g.r.k.i.e(:166) at f.h..
아래처럼 채팅창을 구현하고 있다. 원하는것은 상대방 채팅일때 약간 왼쪽으로 쏠린듯한 느낌을 주게, 시작마진은 8, 끝마진은 30으로 줬다. 근데 문제는 글자가 길어지면 아래처럼 뷰의 넓이 전체를 다 사용해버린다. 상대편의 말 풍선은 시작마진은 8dp, 끝마진을 30dp로 줬지만, 끝 마진이 먹지 않는다. android:layout_marginStart="8dp" android:layout_marginEnd="30dp" 해결하는 방법은 상대편의 말 풍선은 끝마진을 주지 말고, 대신 세로 가이드 라인을 만들어서 가이드라인에 30dp를 준다. 텍스트뷰에 있는 "android:layout_marginEnd="30dp"" 는 불필요하니 삭제하고 끝 위치 제약조건을 가이드로 준다. app:layout_constra..
OpenSubtitles.com에서 자막을 받아오는 소스를 만들고 있다. 자막을 받아왔는데, "1"이란 숫자만 보인다. 짐작에 자막이 srt포맷이라 맨처음 ID를 보여주는거 같다. 구글링 해보니 GsonConverterFactory를 쓰지 말고 ScalarsConverterFactory를 사용하라고 한다. A converter for strings and both primitives and their boxed types to text/plain bodies. 문자열이나 기본형을 텍스트형태 그대로 보여준다. interface OpenSubtitleDownloadService { @GET Call downloadFile(@Url String url); } public class OpenSubtitleApi..
앱의 타겟버전을 30에서 33으로 올리고 구글플레이어에 앱을 제출하니 아래와 같은 에러가 나온다. Your app targets Android 13 (API 33) or above. You must declare the use of advertising ID in Play Console. 구글플레이 콘솔의 앱 콘텐츠를 보면 광고ID에 에러표시가 있다. 광고ID의 시작을 누르면 아래처럼 물어본다. 애드몹 광고가 앱에 있어서 아래처럼 했다. manifest에 아래를 추가하고 build gradle에서 버전을 올린후 앱을 다시 제출하자.
웹브라우저에서 텍스트를 선택한후 메뉴에서 내가 만들고 있는 앱을 선택하면, 앱으로 선택한 텍스트를 가져와서 원하는 뷰를 보여주고 싶다. "GIS"문구를 선택한후 "아라ICT"를 선택. 아라ICT앱을 열고 선택한 문구"GIS"가 포함된 용어 리스트를 보여줌. manifest파일에서 선택된 용어 리스트를 보여줄 액티비티에 intent filter를 걸어준다. PROCESS_TEXT 웹 브라우저에서 텍스트선택시 메뉴에 보여지는 "아라ICT"는 label에서 정해진다. 없으면 앱 이름을 사용하고, 원하면 다른 이름으로 적어줘도 된다. android:label="@string/app_name" 해당 액티비티의 onCreate나 onResume등에서 선택된 텍스트가 들어왔을때 처리를 해준다. (내 앱의 경우에는 프..
앱의 기능중 서버에서 데이타를 받아와서 앱 내에 있는 SQLite의 내용을 업데이트 하는 기능이 있다. 디버그 모드에서는 동작이 잘되나, 릴리즈 모드에서는 저 기능이 동작하지 않는다. 삽질 끝에 build.gradle의 minifyEnabled가 true일때 저 이슈가 나온다는것을 발견했다. (minifyEnabled가 true이면 shrinkResources도 true여야 한다.) buildTypes { debug { } release { debuggable false minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } minif..
타겟을 33으로 올리고 구글 플레이에 제출하니 아래와 같은 에러가 나온다. Your app targets Android 13 (API 33) or above. You must declare the use of advertising ID in Play Console. 만약 앱에 광고가 있으면 manifest에 아래를 추가하자.(광고가 없으면 추가하면 안됨) 구글 플레이에서 정책 및 프로그램 밑에 있는 앱 콘텐츠로 가서 "광고 ID"에 있는 시작을 클릭한다. 광고 ID 사용여부를 체크해준다.
타겟을 버전 31로 올리고 구글 플레이에 올리니 아래와 같은 에러가 나왔다. Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. 기존에는 work-runtime버전이 2.1.0인데 implementation "androidx.work:work-runtime:2.1.0" 이걸 2.7.0으로 업그레이드하니 해결되었다. 되었는줄 알았다 // 자바를 쓰는 경우 implementation 'androidx.work:work-runtime:2.7.0' // 코틀린을 쓰는 경우 implementation 'androidx.work:wo..