반응형 분류 전체보기171 [Android] 오디오 모드 변경 및 볼륨 조절 권한 설정 소리 설정을 변경하기 위해 Write Settings 권한이 필요하다. AndroidManifest.xml Write Settings는 시스템 권한이라 앱 실행 시 자동으로 권한을 묻는 창이 뜨지 않기 때문에 설정 창을 띄워서 사용자가 직접 권한을 부여하도록 해야 한다. MainActivity.kt private fun requestWriteSettingsPermission() { if(!Settings.System.canWrite(this)) { Toast.makeText(this, "알림음을 켜기 위해 권한 설정이 필요합니다.", Toast.LENGTH_SHORT).show() startActivity(Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS)) } .. 2022. 2. 7. [Front-End] Prettier 단축키 보호되어 있는 글 입니다. 2022. 1. 27. [Android] Ringtone 재생 및 목록 가져오기 Ringtone 재생 val ringtoneUri: Uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM) val ringtone: Ringtone = RingtoneManager.getRingtone(context, ringtoneUri) ringtone.play() ringtoneUri 자리에 아래의 Ringtone 목록에 조회된 Uri로 대체할 수 있다. Ringtone 목록 가져오기 RingtoneManager(context).cursor.run { Log.d(TAG, "Ringtones: ") while(moveToNext()) { Log.d(TAG, "${getString(RingtoneManager.TITLE_COLUMN_INDEX).. 2022. 1. 24. [It's My Waye] 7. 메인화면 UI 구현 (DrawerLayout) Intro 이전 시간에 DB 구현과 테스트를 모두 끝냈다. 이제 메인화면 부터 UI를 구현해야 한다. UI는 아래와 같이 만들 예정이다. 찾아보니 내가 만들려고 하는 UI가 DrawerLayout이란 것을 알게 되었다. 마침 Android Studio에서 기본 템플릿으로 제공하는 예제 Activity가 있어서 참고용으로 예제 소스를 뜯어봤는데, 너무 복잡하게 돼있어서 그냥 인터넷 찾아보면서 만들었다. DrawerLayout 구현 DrawerLayout은 위와 같이 구성되어있다. MainActivity에 content가 들어가고, 그 content 상단에 toolbar를 넣어준다. 그리고 NavigationView에 header와 main을 포함시킨다. 따라서 toolbar - content - nav_h.. 2022. 1. 23. [It's My Waye] 6. DB 기능 구현 - 테스트 코드 작성 Intro 내가 작성한 DB 코드가 정상작동하는지 테스트를 해보는 시간이 왔다. 개인적으로 어떤 프로그램을 개발하든 테스트는 필수라고 생각한다. 개발을 다 마치고 실제 제품을 배포했는데 갑자기 오류가 발견되어 다시 전부 수정하는 것보다 미리미리 테스트 케이스를 생성해두고 오류가 발생하기 전 사전에 차단하는 게 훨씬 개발비용이 덜 들기 때문이다. 나중에 테스트하는 방법 관련해서 따로 글을 작성해 볼 예정이다. DBHelper 테스트 가장 먼저 DBHelper 클래스를 테스트한다. DBHelper가 제대로 동작하지 않으면 ItemDAO와 AlarmDAO는 보나마나 동작하지 않을 것이기 때문이다. DBHelperTest.kt package com.devjaewoo.itsmywaye.database import.. 2022. 1. 23. [It's My Waye] 5. DB 기능 구현 - DAO 작성 DAO 작성 이제 이전 글에서 작성한 모델에 접근할 수 있게 해주는 DAO(Data Access Object)를 작성해야 한다. DAO는 DB와 프로그램 사이의 인터페이스 역할을 수행하여, Model을 DB에 쉽게 저장하고 불러올 수 있도록 해주는 클래스다. Item엔 Alarm의 FK가 있기 때문에 Alarm DAO부터 작성했다. AlarmDAO.kt class AlarmDAO(val context: Context) { fun insert(alarm: Alarm): Int { val db = DBHelper(context) val result = db.insert(Alarm.TableInfo.TABLE_NAME, ContentValues().apply { put(Alarm.TableInfo.COLUMN.. 2022. 1. 22. [It's My Waye] 4. DB 기능 구현 - Model 작성 Model 작성 이제 설계한 DB를 바탕으로 테이블에 해당하는 Model을 만들어줘야 한다. 그림을 보면 Item과 Alarm이 1:1 관계이기 때문에, FK를 어느 테이블에 줘야 할지 선택해야 했다. FK를 Item에 주면, Item 모델 내에 Alarm 변수를 두어 관리하고, 반대로 Alarm에 주면 Alarm 모델 내에 Item 변수를 만들어 관리해야 한다. FK를 Item에 둔 경우 // Item class Item( var name: String, var enabled: Boolean, var alarm: Alarm? = null) {} // Alarm class Alarm( var filePath: String, var volume: Int = 100, var repeatTimes: Int =.. 2022. 1. 22. [It's My Waye] 3. DB 기능 구현 - DBHelper DBHelper 작성 이전 글에서 설계한 DB 구조를 바탕으로 Android에서 제공하는 SQLite를 활용한 DBHandler와 Model, Model에 접근할 수 있게 해주는 DAO를 작성했다. 우선 Android의 DB에 접근하기 위한 DBHandler부터 만들었다. DB 인터페이스 종류로는 Room과 SQLiteOpenHelper가 있는데, Room을 사용하면 편리하겠지만 SQLite를 써서 기본을 다져야겠다는 생각으로 SQLiteOpenHelper를 선택했다. (Room으로 편하게 할걸 그랬다는 후회가...) 클래스를 맨 처음 만들었을 때 코드다. 여기에 Insert, Select, Update, Delete 기능을 수행하는 함수를 추가해줬다. class DBHelper(val context: .. 2022. 1. 22. [CSS] 애니메이션이 떨릴 때 (will-changed) CSS 애니메이션이 떨릴 때 CSS에서 애니메이션을 적용시켰을 때 적용시킨 개체가 떨리는 경우가 가끔 있습니다. 주로 조그마한 개체에 애니메이션을 주었을 때 떨림 현상이 발생하는데, 이때 will-change에 애니메이션에서 변경하는 속성을 주어 실제 요소가 변화되기 전에 브라우저가 애니메이션을 최적화할 수 있게 해 주면 이런 떨림 현상을 방지할 수 있습니다. Ex) @keyframes heartBeat { 0% { transform: none; } 50% { transform: scale(1.2); } 100% { transform: none; } } h1 { animation: heartBeat 0.5s ease-in-out infinite; will-change: transform; } 실험 HTM.. 2022. 1. 12. 이전 1 ··· 10 11 12 13 14 15 16 ··· 19 다음 반응형