일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 안드로이드스튜디오
- 코루틴
- build
- Kotlin
- ADB
- Gradle
- MVVM
- 안드로이드 스튜디오
- error
- WebView
- Retrofit
- 유튜브
- coroutine
- RecyclerView
- dart
- 코틀린
- image
- Android
- 레트로핏
- 안드로이드
- 깃헙
- 의존성주입
- Github
- 스튜디오
- viewpager
- GIT
- studio
- 웹뷰
- 에러
- 안스
- Today
- Total
목록전체 글 (164)
코딩하는 일용직 노동자
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/5BMvh/btqEg0CiYn3/U2u8bQvQ8kXZcA94bZ9O01/img.png)
모바일 크롬 브라우저가 대대적인 개선을 한다고 5월 14일 크로미움의 공식블로그(https://blog.chromium.org/)에서 밝혔습니다. 최근 일부 광고에서 사용자 모르게 배터리 및 네트워크 데이터 장치의 소비를 포화시킨다고 파악하였고 CPU사용량이 많은 광고의 노출을 제한해서 배터리 사용량을 늘린다고 합니다. Chrome은 사용자가 광고와 상호 작용하기 전에 디스플레이 광고가 사용할 수 있는 리소스를 4MB로 제한합니다. 광고가 한도에 도달하면 광고 프레임이 오류 페이지로 보이며 사용자에게 광고가 너무 많은 리소스를 사용했음을 알려준다고 합니다.
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ci21ua/btqEd9kvqVI/cRE9CGX0RZk9iZjKqvyxjk/img.png)
픽셀4 출시로 인해 구글 폰에서 얼굴로 잠금해제(face unlock)가 가능하게 되었습니다. 아이폰의 FaceID처럼 결제에도 사용됩니다. 아직은 모든 안드로이드폰이 아닌 픽셀4에서만 됩니다. 또한 구글은 안드로이드10부터 기존에 사용돼 온 2D방식이 아닌 3D방식의 얼굴인식 방법만 채택할 예정입니다. 그리고 3D방식을 활용하기 위해선 전면ToF 카메라가 필수적입니다. 결국 ToF카메라가 없는 폰에서는 얼굴인식 기능이 활성화 되지 않거나 API를 제대로 지원안해줄 것으로 보입니다. 실제 2D방식의 얼굴인식은 어두운 환경, 역광 등 빛의 반사광이 심해지거나 특정 패턴에서 보안이 뚫리는 이슈가 종종 발생하고 있습니다. 예를 들어, 같은 무늬의 옷을 입거나 특정 인종의 경우 동일인으로 인식하는 비율이 높은 ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dgJOQ4/btqEcTPPWfA/IqGYDBB0BNM7i5o0TlXCNk/img.png)
클래스 객체를 만들때 new 키워드를 생략이 가능하다. class Person { String name; int age; } var person = Person(); // new를 붙여도 되고 생략해도 된다. 생성자도 Java와 비슷하다. class Person { String name; int age; /* * String name, int age 로 하면 값을 받아서 다시 셋팅해주는 * 처리가 필요하지만 이렇게 하면 코드수를 줄일 수 있다. */ Person(this.name, this.age); } 코틀린의 .apply처럼 클래스의 값을 연속으로 셋팅해줄 수 있다. class Car { String _model; int _makeYear; void setModel(String model) { thi..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nelma/btqEdjgsmd4/qmSvhDf9JN5y2NLGOnG1P0/img.png)
일반적인 메소드는 Java의 그것과 똑같다. void printMsg(String msg) { print(msg); } printMsg('Hello World'); 메소드에 파라메터명을 반드시 적도록 하는 옵션을 줄 수 있다. void printMsg({String msg}) { print(msg); } 이렇게 정의된 메소드를 파라메터명을 함께 표기해야 한다. printMsg(msg: '헬로 월드'); 단, 옵션의 경우 값을 넘겨도 되고, 안넘겨도 되는 nullable의 개념으로 생각해야 한다. 때문에 필수로 값을 넘겨야 하는 경우에는 옵션으로 지정하면 안된다. void userInfo(String name, {int age}) { print('$name $age'); } name은 필수, age는 옵션..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/m6ZQ6/btqEepAg6VP/4mVc07Rcid0sZFkvMUTw0k/img.png)
컬렉션 타입은 아래처럼 만든다. List 타입 List items = ['a', 'B', 'c']; var items = ['a', 'B', 'c']; 만들어진 List의 값을 꺼내오는 것은 java의 배열처럼 하면 된다. Dart에는 배열은 없고 List타입만 있다. print(items[0]); List타입은 java처럼 add, isEmpty 함수등을 이용할 수 있다. 두개의 List를 하나로 합치는 방법 var items1 = ['a', 'B', 'c']; var items2 = [...items1, 'd', 'e']; // 첫번째 값에 ...items1으로 넣었다. print(items2); Set 타입 Set itemSet = {'a', 'B', 'c'}; var itemSet = {'a', ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bcSLZL/btqEepAg6jf/5h0dMUdaVgcHur6SMMptx0/img.png)
아래 주소에서 쉽게 Dart문법을 이용해서 실행시켜볼 수 있다. https://dartpad.dartlang.org/ DartPad dartpad.dartlang.org 1.자료형 타입추론 방식을 사용한다. var a = 10; 이렇게 써도 되고 int a = 10; 이렇게 써도 된다. dynamic b = 10; 이런 문법도 있다. myFunc(dynamic param) { print('$param') } 이렇게 파라메터를 dynamic 타입으로 받게 된다면 myFunc(10); myFunc('Hello'); 를 넣어도 다 된다. 마치 자바의 제너릭과 비슷하다. num c = 10.1; 또한 숫자형을 모두 포함하는 num 이라는 자료형도 존재한다. 이것은 int 형이든 double 형이든 숫자형을 모두..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/drtWf3/btqD5Jgq2y3/oqOts4D3BUjdAZT3Qtv0Hk/img.jpg)
공지사항을 표시할 팝업을 만들려고 합니다. Dialog 안에는 뷰페이저가 있고 아이템으로는 ImageView 하나만 있는 Fragment 를 갖고 있습니다. ImageView의 height를 wrap_content로 설정하고 adjustBoundView = true로 설정했습니다. 하지만 뷰페이저의 height를 wrap_content로 설정을 해도 실제 구동시 match_parent로 표시되는 문제가 있습니다. 이를 해결하려면 ViewPager를 상속받은 CustomViewPager를 만들어서 onMeasure를 오버라이딩 해줘야 합니다. /** * 설명 : 일반적인 ViewPager 는 height 값이 화면 전체를 갖는다. * wrap_content 만큼만 갖게 하기 위해 onMeasure 를 오버..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cBiGBh/btqD2u4Jxz3/jwLF2Jb1n8CKsbLB5KLr21/img.png)
최근 업데이트 후 멀쩡하던 new ViewModelProvider(this).get(MyAndroidViewModel.class) 에서 Cannot create an instance of class 에러가 발생했습니다. java.lang.RuntimeException: Cannot create an instance of class my.custom.viewmodel.CustomViewModel at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202) at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135) at an..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bMOeLW/btqD4T3n4x0/0ekxQZLJkCOrFKK1HAFWk1/img.jpg)
라운드된 배경에 알맞게 view를 잘려 보이도록 처리하는 방법입니다. 흰색 라운드 배경위에 RecyclerView 를 배치했는데 배경의 라운드와 딱맞게 이미지가 가려져 보이도록 처리했습니다. https://youtu.be/d1BPxyT_Iog 실제 구현 영상 import android.content.Context; import android.graphics.Canvas; import android.graphics.Path; import android.graphics.RectF; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; /**..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/78Mez/btqD4TWh08i/kVvQArLF0ALHB6XORVYfJ0/img.jpg)
유튜브를 웹뷰로 보여주도록 처리를 했는데 사이드 이펙트가 있었습니다. 전체화면 모드로 이동 후 복귀하면 웹뷰에 보여지는 화면 UI가 너무 이상하게 나오는겁니다. 또한 전체화면 모드에서 가로모드로 플레이가 되지 않습니다. 첨부된 소스를 이용하면 전체화면 모드시 가로모드로 전환해서 플레이가 됩니다. 또한 Back key 를 눌러 복귀해도 UI 상에 문제도 발생하지 않습니다. private fun setWebViewYoutube(wvYoutube: WebView, movieId: String) { wvYoutube.settings.apply { javaScriptEnabled = true setAppCacheEnabled(true) pluginState = WebSettings.PluginState.ON } ..