춤추는 개발자

[제작] 출시하기까지 개발 과정 및 이슈 대응 본문

우산 챙겨주는 알람시계/개발 과정

[제작] 출시하기까지 개발 과정 및 이슈 대응

Heon_9u 2021. 1. 6. 15:32
728x90
반응형

210105

BottomNavigationView

1. res/menu에 xml만들어서 item생성

2. behavior로 hide/seek

 

Coordinatorlayout

1. scroll, RecyclerView와 관련

 

FrameLayout

1. Fragment 구현

 

RecyclerView

1. Adapter와 ViewHolder기능 활용

2. ListView보다 효율성 좋음

3. ViewHolder로 View를 binding, getItemCount로 View 갯수만큼 객체 생성해서 재활용

4. alarm_item.xml은 ViewHolder의 변수에 해당

5. alarm_fragment가 FrameLayout의 RecyclerView


210106

1. Fragment에서 다른 Activity로 이동하는 Intent활용 시, getApplicationContext()대신 getActivity() 사용

2. CardView

3. RecylcerView in Fragment에서 Create item 구현(Intent로 페이지 전환)

4. Delete item에서 AlertDialog 구현


210107

1. TimePicker

2. AlarmManager로 알람기능 만들기

    2-1. AlarmManager에 호출할 Receiver와 알람시간 설정

    2-2. 알람 시간이 되면 AlarmManager가 Receiver에게 Broadcast

    2-3. Receiver는 이를 받아서 Service 호출

    2-4. Service에서 원하는 동작 구현

3. Adapter에서 Alarm update 구현하기

4. Create item을 할 때, 기존 Activity종료하고 CreateActivity를 나가면 MainActivity(AlarmListView) 실행

5. Update item도 마찬가지로 진행

6. Adapter에서finish하는 방법 -> ((Activity)context).finish();

7. Switch_button 활성화 및 Listener 구현


210108

1. OpenSource 찾기 - awesome android

2. AlarmExample - Service, Notification, PendingIntent

3. RingtoneManager, 기본 알림음에 접근하고 설정하기(퍼미션 없이)

4. 반복 알람 시, setExact()함수 이용하고 반복에 대한 부분은 직접 구현

5. 전체적인 컨셉은 보라색으로

6. 잠자기모드

   1. Android 5.1(API 수준 22)에서는 알람x

   2. setAndAllowWhileIdle()  setExactAndAllowWhileIdle()을 사용하여 설정

   3. 잠자기 모드에서도 테스트하기

7. 다중 알람은 PendingIntent에서 알람 index로 구분

8. ScrollView의 내부 View는 오직 한개

9. 참고: link2me.tistory.com/1719 hoyi327.tistory.com/33 stackoverrun.com/ko/q/4875826 stackoverflow.com/questions/14272295/how-can-i-get-the-repeat-alarm-for-week-days-using-alarm-manager jamssoft.tistory.com/30?category=561811 lifeasnomad.tistory.com/21


210110

1. 안드로이드 버튼 UI의 기본 요소 - brunch.co.kr/@chulhochoiucj0/#articles

2. LinearLayout의 내부 View들의 고정 비율은 layout_weight, 이때 고정하고자 하는 width 또는 height는 0dp

3. button리스너 등록

4. 버튼 클릭시 효과 주기 - black-jin0427.tistory.com/79


210111

1. create, update 페이지를 set 페이지로 병합

2. API 26이상부터 배터리 최적화 모드 해제 후 ForegroundService 실행하기 - FOREGROUND_SERVICE

3. 절전모드에서 화면을 키기 위한 퍼미션 - android.permission.WAKE_LOCK (PowerManager의 메소드)

4. 스마트폰 부팅 시 실행되는 Service - RECEIVE_BOOT_COMPLETED (알람 삭제 방지)


210112

1. Calendar 라이브러리

2. API버전에 따라 AlarmManager 메서드 다르게 구현

3. 오늘은.. 너무.. 게을렀다..


210113

1. Receiver와 Service, 반복 알람 구현

 

내일 해야할 것!!!

2. 알람이 발생하면 Service에서 특정 페이지 실행.

3. 특정 페이지에서 swipe하면 진행 중인 알람 종료

4. 알람이 반복 알람이면 AlarmActivity로 Alarm 객체 전달해서 새로운 알람 등록

5. 소리 및 진동 - lakue.tistory.com/58


210114

1. 잠금화면에서도 사용하기 getWindow()

2. Receiver에서 onReceive는 메인 스레드에서 작동

3. Activity에서 Receiver로 PendingIntent에서 데이터 전달에 문제 생김, null값

4. (3번) -> Receiver에서 Extra로 받는 데이터의 크기 제한, Alarm 객체를 전달하는 대신 alarmId를 전달

5. Alarm 작동 과정

   1. create alarm하면 자동으로 AlarmManager에 등록

   2. totalFlag에 따라 create or cancel Alarm 실행

   3. Alarm 작동 후, flag와 요일에 따라 반복(다시 AlarmActivity로 intent)

 

6. Ringtone과 Vibrate 구현 예정


210115

1. alarm 예제에 RingtoneManager 제작중.

2. 어플에 필요한 권한 (위치, 저장공간)

3. Service는 기본적으로 메인 스레드에 붙기 때문에 Service에 너무 많은 일을 처리하면 안됌

4. Service에는 startActivityForResult 사용 불가

5. 잠금화면 Activity 설정 - whale-order.tistory.com/10

6. Service 활용 - chebaum.tistory.com/25


210116

1. RingtoneManager - blog.naver.com/PostView.nhn?blogId=twotoedsloth&logNo=220018692059

2. Context.startForegroundService() did not then call Service.startForeground() Error

3. foreGround, backGround, thread, handler 이해하기

4. AlarmRecoder Example - github.com/akhilesh2k3/ClassTest2/tree/f94bce9f54c5aab6cff21ec248cc04b1d181c359/app/src/main/java/iitkgpakhilesh/classtest2


210117

1. foreGround, backGround, thread, handler 이해하기

medium.com/mj-studio/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%95%84%EC%84%B8%EC%9A%94-2-1-service-foreground-service-e19cf74df390

lcw126.tistory.com/74


210118

1. SharedPreferences

2. AlarmExample

   1. 백버튼 = Ringtone + Activity on

   2. 화면 꺼짐 = Ringtone + Activity on

   3. 백버튼 + 화면 꺼짐 = Ringtone + Activity on

   4. 홈버튼 = Ringtone만 실행

   5. 앱을 완전히 종료하면 = Ringtone만 실행

 

3. WakeLock이 이미 release가 된 상태에서 다시 release 메서드를 호출하면 에러 발생

d2.naver.com/helloworld/632413?fb_action_ids=625735487462529&fb_action_types=og.likes&fb_source=other_multiline&action_object_map=%5B606367092767686%5D&action_type_map=%5B%22og.likes%22%5D&action_ref_map=%5B%5D

4. 앱의 활동 수명 주기에 관해 - 

developer.android.com/guide/components/activities/activity-lifecycle

5. UX/UI -> pinterest, www.uplabs.com/templates/android

 


210119

1. Permission 체크 (권한필요 -> 권한체크 -> 권한요청 -> cancel ->

                                      권한필요 -> 권한체크 -> 권한체크의 필요성 -> 권한요청 -> OK)

2. Dialog를 이용해 Activity를 Dialog화 한다.

3. notification + pendingIntent

4. 권한 체크없이 진행할 예정, 권한을 주게되면 보안상의 문제 우려!

5. Service에서 notification은 무조건 발생,

    1. Screen_on -> 상단 dialog

    2. Screen_off -> 전체 dialog


210120

1. Permission 부여한 상태로 진행.. (없이하려 했으나 실패)

2. OnAlarm은 Fullscreen

3. Alarm reset 기능 만들기

4. 알람마다 볼륨 설정하기 ( DB에 컬럼 추가 ) - egloos.zum.com/everdream/v/5483837


210121

1. AlarmExample에서 구현한 기능 적용하기

2. AlarmDto에 volume 추가

3. Dto 변경 시, 수정사항이 너무 많다.(View, Adapter, DB, Receiver . . .) 확실하게 정하고 가자

4. Alarm create와 update하고 난 후, 새로운 객체 적용 방식 변경 (onStart())

5. Fragment의 생명 주기 이해하기


210122

1. AlarmService에 HourlyForecast 연동 및 구현

2. 전역변수 이해하며 변수 선언하기 - codingcoding.tistory.com/361

3. Service는 Main Thread로 작동, Notification은 Service에서 진행하고, Ringtone과 onPage는 new Thread로 진행, 이때 HourlyForecast에서 .execute() 메서드가 끝날 때까지 while문 (작업 끝나면 isFinish = true)

4. .execute() 메서드가 끝나야 API 응답 결과를 Service에서 접근 가능.

5. UTC를 date로 변환하기

6. 터치할 때 ripple 효과 추가 - www.youtube.com/watch?v=dmoiy1aPA9I&feature=emb_logo


210123

1. Workflow 작성(PPT)

2. 알람이 울린 후, repeat할 때마다 약간의 텀이 발생(2~3초), 이를 대비해 현재시간에 +30초(30000ms)를 더한 값과 알람시간을 비교해서 AlarmManager 설정


210124

1. GPS Tracker 구현 - unikys.tistory.com/283

2. 최근 위치와 resetLocation 버튼 구현

3. icon 적용 - material.io/resources/icons/?style=baseline


210125

1. swipe Event - codeburst.io/android-swipe-menu-with-recyclerview-8f28a235ff28 (잘 안됌...ㅠ)

2. delete버튼 삭제 -> CardView에 LongClickListener 적용

3. MediaPlayer.create에서 create failed (갑자기?)

4. GPS 동작x (너도?)


210126

1. Gps Tracker 최근 위치 적용 (불안정)

2. MediaPlayer 초기화, create failed 문제 해결

3. MediaPlayer와 Ringtone의 차이 - jamssoft.tistory.com/31

 

 

불안정한 부분

1. 처음 앱 설치 후, GPS 작동x. but 지도 앱에서 GPS한번 사용 후, 앱 실행하면 GPS 정상 작동

2. 알람음의 default가 처음에 실행안되지만, 알람음을 한번 바꾸고 save한 이후에는 정상 작동


210202

1. alarm_fragment의 Layout을 Relative로 변경, createAlarmLayout 생성 - recipes4dev.tistory.com/126


210203

1. Location 관련 ListView, Adapter, DatabaseHelper 제작 중.

2. Alarm마다 위치 설정할지, 대표 위치만 설정할지 고민 중...


210204

1. 주소 검색 api를 이용해 주소명 가져오기 - m.blog.naver.com/PostView.nhn?blogId=eo930827&logNo=221564953275&proxyReferer=https:%2F%2Fwww.google.com%2F

2. 안드로이드 Geocoder를 이용해 주소명으로 위도, 경도 구하기


210207

1. 주소검색 api 연동 중.. mcflynn.tistory.com/22

2. 도로명주소 개발자센터 api - juso.go.kr/addrlink/addrLinkApi.do?confmKey=devU01TX0FVVEgyMDIxMDIwODAxMjIzMTExMDc4OTc=&currentPage=1&countPerPage=20&keyword=백범로227번길

3. 현재 WebView 또는 직접 구현 중 하나로 진행할 예정


210208

1. 도로명주소 개발자센터 api 연동 완료.

2. Location과 api에서 받아온 juso 관련 adapter, activity 구현

3. 도로명주소 혹은 지번주소를 Geocoder를 이용해 위도, 경도로 변경

4. LocationAdapter에서 cardView 클릭리스너 구현 예정


210209

1. currentLocation과 GpsTracker 삭제(추후에 추가할 계획)

2. AlarmSetActivity에서 startActivityForResult로 LocationListView에서 넘어오는 Location 저장

3. LocationAdapter에서 getCallingActivity에 따라 Toast 혹은 setReult

4. 코드 정리 및 class 정리


210210

1. JusoApi 호출 시, errorMessage에 따라 분기

2. JusoApi 여러번 호출 시, while(!isFinish) 무한 루프 해결 -> isFinish를 voltile 키워드로 선언

3. HourlyForecast를 OpenWeatherApi로 변경

4. OpenWeatherApi에서 current, hourly, daily에 따라 수행.

 

5. Location no such table Error 발생 => "WeatherAlarm.db"에 테이블 2개를 만들려고 했으나 두번째 SQLiteOpenHelper에서 onCreate 메서드가 호출되지 않음.

문제 원인은 이미 db안에 table이 있는 경우, 다시 SQLiteOpenHelper를 호출할 때, onCreate가 다시 호출되지 않음!

새로운 db를 만들거나 처음 onCreate메서드에 테이블을 두개 생성해서 해결 가능.

참고사이트: huammmm1.tistory.com/466

 

6. E/MediaPlayerNative: Unable to create media player Error 발생

MediaPlayer가 처음 실행 때는 정상작동하지만 2번째부터 이슈 발생 => MediaPlayer의 release하는 과정에 원인이 있는 것으로 파악 중


210212

1. E/MediaPlayerNative: Unable to create media player 이슈 발생

2. prepare부터 버전별로 구분하며 접근했으나 실패, URI확인 결과, 기존에 설정한 URI와 값이 바뀐 것을 확인 => 기본음 URI를 "content://settings/system/ringtone"으로 변경

3. MediaPlayer 버전별 정리 포스트 - darksilber.tistory.com/327

4. AlarmManager_REQUEST_STATE => reboot(null 확인), create, update, cancel(null 확인)

5. create와 update는 null 상관없이 무조건 생성하는 것으로..

6. cancel은 알람있는지 확인 후, 진행

7. reboot는 알람 시작 or onStart, adapter에서 totalFlag를 매번 확인하므로 알람 있는지 확인하기.

 

8. 신경쓰이는 Log들 - 이유알고 처리할 수 있는 것들 처리하기.

  W/System: A resource failed to call close.  -> SQLiteDB 객체 생성 이후, 마지막에는 항상 close()

  onActivityFinishing(): calling cancelLocked()

  E/MediaPlayerNative: trying to set audio attributes called in state 8


210213

1. 이미지뷰 변경, UX/UI 수정하다가 이슈 발생..(mipmap의 파일 삭제)

2. Files under the build folder are generated and should not be edited

3. gradle에서 notification에따라 절차 진행해서 해결.

4. UI.... 니미럴


210214

1. AlarmService의 메서드 절차 변경, AlarmOnActivity UI 변경

2. weather관련 이미지 파일 저장


210215

1. 무료 저작권 사이트 juahnpop.tistory.com/135/

https://unsplash.com/

2. drawable 이미지 파일 정리, AlarmOnActivity 날씨에 따라 UI 수정

3. AnalogClock - medium.com/@mayurjajoomj/custom-analog-clock-using-custom-view-android-429cc180f6a3

4. doze모드 관련 테스트 진행하기 - iamrealizer.tistory.com/37

5. Custom Analog Clock 심플하게 구현 - UI이므로 Main thread


210216

1. AlarmOnActivity 체감온도 추가

2. AlarmOnActivity 백그라운드 자동 블러처리 이슈 발생.

3. 알람 해제하면 Activity 종료 + Task List에서 삭제하기

4. Terminal에서 Doze모드 테스트 => 정상 작동

 

5. apk 추출 후, 첫 테스트 결과

  1. 알람음 선택창에서 자동 종료 이슈 확인

  2. 미디어볼륨 대신 알람볼륨으로 다시 설정하기

  3. Alarm_item의 Text 키우기

  4. 스마트폰 재부팅 시, 알람 작동 안됌(RECEIVE_BOOT_COMPLETED한 상태)

  5. 알람 반복 부정확


210217

1. 알람 반복 시, 기존에 AlarmManager로 startActivity하던걸 Receiver에서 직접 AlarmManager설정

2. Recevier에서 다시 Receiver로 Alarm설정 시, Uri 객체 전송x (정확한 원인 아직 못찾음)

3. 현재 Service에서 notification, 날씨api, 알람음, 진동, 알람해제Activity

4. API22 Lollipop에서는 Dialog형태로 ACTION_RINGTONE_PICKER 작동 확인

 

5. MediaStore의 파일을 읽어서 Ringtone 설정하는 방법으로 진행할 예정

thdev.tech/androiddev/2017/05/06/Android-Studio-Create-Swipe-View/

   1. SwipeLayout과 RecyclerView로 Activity 구현

   2. MediaStore로 미디어파일 읽어와서 띄위기

   3. 내 파일에도 접근해서 읽어올 수 있게 설정.


210218

1. 목표: TabLayout + RecyclerView + MediaStore 사이드 예제 구현하기

2. internal ringtone 목록 읽어오기 - java2020.com/q/ixrbccom

developer88.tistory.com/192

3. android Q 버전에 따른 대응

4. RadioButton in RecyclerView - joshskeen.com/building-a-radiogroup-recyclerview/


210219

1. TabLayout에 Tab이동 시, 실행 중인 MediaPlayer stop

2. API22에서는 MediaStore의 Audio파일 접근 성공

3. API30 test 중... (Audio와 downloads 둘다 해봤지만 크롬에서 다운받은 mp3파일 불러오기 실패)


210221

1. 먼저, API22에서 구현, API30에서 외부 저장소 mp3 파일 읽어오기는 안되는 상태

2. 이 상태로 alarm-weather에 적용 및 구현 후, 추출해서 테스트하기


210222

1. AlarmSetActivity에서 setRingtone method 다시 구현

2. TabLayout과 ViewPager + Fragment로 RingtoneManager => 기본 벨소리, MediaStore.Audio => 저장된 mp3

3. 선택 및 적용까지는 Test 성공

4. 실제 알람 Test 필요

5. external storage permission 추가

6. TimePicker Theme 적용


210223

1. BootReceiver 구현해서 부팅 후에 알람 재설정하기 - m.blog.naver.com/sysmbh0312/221229919502

2. AlarmListView -> Fragment 생명주기에 따라 onStart 메서드에 checkNewAlarm으로 새로 생성된 alarm에 대응

3. alarmDB에 저장된 알람 갯수와 Fragment의 List.size()를 비교해 최근에 저장된(id가 가장 큰) 알람 adpater에 저장

    -> Alarm관련 CRUD에서 여러 경우에 대응하기 불편함, takeAdapter()로 adapter 리셋

 

4. 모든 activity의 background가 blur처리 되는 문제 해결,

   [drawable-anydpi-v24]에 저장된 이미지를 background로 설정 시, blur처리가 됌..

   기본 drawable로 파일 옮겨서 해결

5. 주소 Activity의 UI 변경

 

6. 실제 기기에서 실행하면 강제종료되는 이슈 발생.

   실제 기기에서 디버깅하기 - USB디버깅 방식으로 진행한 결과는 정상.

 

7. READ_EXTERNAL_STORAGE 권한 프로세스 변경 - dion-ko.tistory.com/18


210224

2차 테스트 결과

1.doze모드에 실행 정상, 알람 정상

2. 알람 소리가 너무 작고 Alarm이 아닌 Media로 적용됌

3. 백그라운드에서 실행, 배터리 사용량 최적화 설정하기.

4. MainActivity에서 onKeyDown 오버라이딩(전체적으로 알람 볼륨만 조절)

15051015.tistory.com/93

5. MediaPlayer를 .create로 하면 따로 Alarm으로 setting해도 Media로 적용되는 이슈로 확인,

   .setDataSource와 prepareAsync()로 해결

6. ic_launcher 적용

7. AdMob 적용 중, EGL error와 W/ConnectionTracker, cookie_manager, AdRequest null 이슈 발생


210225

1. 기본 아이콘들 flaticon으로 변경 - www.flaticon.com/packs/weather-256

2. alarm_item에 소리or진동 아이콘 추가

3. 광고칸 미리 만들어놓기

4. weather_view 정리

5. font 적용 - cookierun-regular - lktprogrammer.tistory.com/191

6. Admob test 및 앱ID test - soulduse.tistory.com/78

릴리즈 노트 or App test 과정에서는 admob을 test용으로 변경하기

banner test ID - ca-app-pub-3940256099942544/6300978111

 

 

21년 02월 25일 23시 40분

Google Play Console에 프로덕션 검토 제출 완료


210226

검토 중간 결과 이슈 관련사항

1. API 18에서 강제 종료 확인 - minSdkVersion 21로 변경

2. Alarm 반복 문제 확인 - setLooping(true)로 변경

3. API 26이하에서 Service notification is null 문제 확인 - 조건문으로 분기해서 재구현

4. Receiver에서 alarm.getLocation_id()에서 NullPointerException 발견 -

   (기존 설정) 알람을 생성 및 수정하는 과정에서 위치 설정을 안하면 0으로 초기화한 상태, 왜 int형에서 null 이슈가 나는지 이해가 안되는 상황..

   (수정 사항) Receiver에서 (Integer) alarm.getLocation_Id()의 null값 유무를 판단하고 진행.

5. 상단 배너 광고가 reset되는 문제 확인 - 각 탭이 아닌 MainActivity에 광고 구현


 

728x90
반응형

'우산 챙겨주는 알람시계 > 개발 과정' 카테고리의 다른 글

[6~7월] 개발 및 수정 사항  (0) 2021.06.17
[5월] 이슈 대응하기  (0) 2021.05.12
[4월] 이슈 대응하기  (0) 2021.04.16
[3월] 개발 과정 및 이슈 상황  (0) 2021.03.05
이후 계획 단계  (0) 2021.02.10