일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 안드로이드
- 안스
- WebView
- error
- 웹뷰
- 의존성주입
- DI
- 에러
- image
- 스튜디오
- build
- 다트
- 안드로이드 스튜디오
- Github
- Gradle
- Android
- studio
- Kotlin
- dart
- ADB
- RecyclerView
- coroutine
- 안드로이드스튜디오
- 레트로핏
- Retrofit
- viewpager
- 깃헙
- 코틀린
- GIT
- MVVM
- Today
- Total
목록전체 글 (159)
코딩하는 일용직 노동자
#1 기존 이용했던 식별자 정보 안드로이드 10 이전에는 기기의 고유 식별자정보를 얻기가 쉬웠습니다. 이 정보를 이용해 중복로그인을 막는다던지 1계정에 1기기로만 서비스 되도록 한는 처리가 가능했습니다. 주로 아래의 기기 식별자정보를 사용했습니다. 기기 시리얼 번호 Build.getSerial() 디바이스 ID TelephonyManager.getDeviceId() 유심 시리얼 넘버 TelephonyManager.getSimSerialNumber() IMEI TelephonyManager.getImei() MEID TelephonyManager.getMeid() 하지만!! 안드로이드 10(Q) 버전부터는 보안정책이 변경되어서 이 정보들을 얻을 수 없게되었습니다. OS가 10 버전 이상인 기기에서는 위의 ..
생성자 없이 ViewModel을 만들어 사용하는 것은 매우 간단합니다. 하지만 ViewModel을 이용하다보면 repository 나 인스턴스들을 파라메터로 넘겨서 생성하는 경우가 많습니다. 일단 간단히 name을 전달하는 ViewModel을 만들어 테스트 해보겠습니다. class ViewModelActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view_model) try { var viewModel = ViewModelProvider(this).get(MyViewModel::cl..
MVVM 으로 개발할때 ViewModel은 View를 몰라야 합니다. (ViewModel을 만들고 사용하는 activity가 자신의 context를 넘겨주거나 하지 않습니다.) 때문에 ViewModel에서 View로 이벤트나 결과를 전달할 경우에는 View가 ViewModel을 observe 하다가 상태가 변하면 그에따른 처리를 하게 합니다. // ViewModel var resetList = MutableLiveData().apply { value = false } ... /** * Search 버튼 클릭 처리. */ fun onClickSearch() { if (!TextUtils.isEmpty(etStr)) { mPage = 1 resetList.value = true searchImage(etSt..
레이아웃을 수정한 후 앱을 재시작해보니 곧바로 죽는 현상이 발생했습니다. 로그를 보니 아래와 같은 에러메세지를 볼 수 있었습니다. All children of ConstraintLayout must have ids to use ConstraintSet 내용을 보니 ConstraintLayout 에서는 child layout 에 id가 항상 지정이 되어 있어야 한다는 것이었습니다. 소스를 보니 새로 추가한 레이아웃에 id가 지정이 안되어 있었고, id를 만들어주니 에러는 곧바로 해결됐습니다.
Kotlin Collections function fun get(index: Int): E 인덱스의 항목을 반환 fun clear() 모든 항목을 제거 fun indexOf(element: E): Int 지정된 항목의 인덱스를 반환 fun isEmpty(): Boolean 컬렉션이 비어있는지 반환 fun contains(element: E): Boolean 지정된 항목이 컬렉션에 포함되어 있는지 반환 fun subList(fromIndex: Int, toIndex: Int): List 시작 인덱스부터 끝 인덱스 -1 까지의 범위의 리스트를 반환 fun Iterable.all(predicate: (T)->Boolean): Boolean 모든 항목이 지정된 조건에 만족할 경우 true 반환 ex) list...
모바일 크롬 브라우저가 대대적인 개선을 한다고 5월 14일 크로미움의 공식블로그(https://blog.chromium.org/)에서 밝혔습니다. 최근 일부 광고에서 사용자 모르게 배터리 및 네트워크 데이터 장치의 소비를 포화시킨다고 파악하였고 CPU사용량이 많은 광고의 노출을 제한해서 배터리 사용량을 늘린다고 합니다. Chrome은 사용자가 광고와 상호 작용하기 전에 디스플레이 광고가 사용할 수 있는 리소스를 4MB로 제한합니다. 광고가 한도에 도달하면 광고 프레임이 오류 페이지로 보이며 사용자에게 광고가 너무 많은 리소스를 사용했음을 알려준다고 합니다.
픽셀4 출시로 인해 구글 폰에서 얼굴로 잠금해제(face unlock)가 가능하게 되었습니다. 아이폰의 FaceID처럼 결제에도 사용됩니다. 아직은 모든 안드로이드폰이 아닌 픽셀4에서만 됩니다. 또한 구글은 안드로이드10부터 기존에 사용돼 온 2D방식이 아닌 3D방식의 얼굴인식 방법만 채택할 예정입니다. 그리고 3D방식을 활용하기 위해선 전면ToF 카메라가 필수적입니다. 결국 ToF카메라가 없는 폰에서는 얼굴인식 기능이 활성화 되지 않거나 API를 제대로 지원안해줄 것으로 보입니다. 실제 2D방식의 얼굴인식은 어두운 환경, 역광 등 빛의 반사광이 심해지거나 특정 패턴에서 보안이 뚫리는 이슈가 종종 발생하고 있습니다. 예를 들어, 같은 무늬의 옷을 입거나 특정 인종의 경우 동일인으로 인식하는 비율이 높은 ..
클래스 객체를 만들때 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..
일반적인 메소드는 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는 옵션..
컬렉션 타입은 아래처럼 만든다. 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', ..