본문 바로가기

전체 글241

[WebRTC] Real time communication with WebRTC 3 https://codelabs.developers.google.com/codelabs/webrtc-web/#5 6. Use RTCDataChannel to exchange data 대부분의 내용이 이전 섹션과 동일합니다. 결국에는 RTCPeerConnection을 만드는 과정에서 sendChannel과 receiveChannel에 대한 생성과 메시지를 받아서 뷰에 출력해주는 부분, 버튼 막는 처리 등의 전부입니다. start 버튼을 누르면 connection생성을 시작합니다. 로컬 커넥션에서 sendDataChannel을 만드는 부분이 추가가 되어 있습니다. 각 localConnection과 채널에 callback 처리를 해주고 있는데 채널에는 각 뷰에 대한 활성화처리, 로깅이 되어 있고 onicecan.. 2022. 6. 10.
[WebRTC] Real time communication with WebRTC 2 https://codelabs.developers.google.com/codelabs/webrtc-web 5. Stream video with RTCPeerConnection In this step you'll find out how to: Abstract away browser differences with the WebRTC shim, adapter.js. Use the RTCPeerConnection API to stream video. Control media capture and streaming. WebRTC Shim과 adapter.js를 사용하여 브라우저간 차이를 추상화 하는 방법 비디오를 스트림하기 위한 RTCPeerConecttion API를 사용하는 방법 미디어 캡처와 스트리밍 관리 .. 2022. 6. 8.
[WebRTC] Real time communication with WebRTC 1 https://codelabs.developers.google.com/codelabs/webrtc-web 1. 소개 WebRTC는 실시간 소통을 위한 오픈 소스 프로젝트로 Web과 Native App에서 사용할 수 있습니다. WebRTC는 다양한 JavaScript API를 가지고 있습니다. getUserMedia(): capture audio and video. // 오디오와 비디오를 캡처합니다. MediaRecorder: record audio and video. // 오디오와 비디오를 기록합니다. RTCPeerConnection: stream audio and video between users. // 유저간 오디오와 비디오를 전송합니다. RTCDataChannel: stream data betwe.. 2022. 6. 5.
[Flutter] 화면 전환 애니메이션 추가(Screen, Dialog) MaterialPageRoute를 상속받아서 처리하는 방식으로 했다. 밑에 buldTransitions를 override해서 slide 애니메이션을 적용한다. (위 아래) my_page_route.dart import 'package:flutter/material.dart'; SlideTransition getSlideTransition(Animation animation, Widget child) { final tween = Tween(begin: const Offset(0.0, 1.0), end: Offset.zero); final offsetAnimation = animation.drive(tween); return SlideTransition( position: offsetAnimation, ch.. 2022. 6. 2.
[Flutter] ScrollToWidget Flutter 개발을 하다보면 특정 위젯의 위치로 Scroll을 하고 싶은 순간이 있다. 이럴 때 다음과 같이 사용을 할 수 있는데 특정 키를 가진 widget을 보이도록 하는 것이다. Scrollable.ensureVisible(key.currentContext!, duration: const Duration(milliseconds: 200), curve: Curves.ease); 예를 들어 스크롤을 해서 내가 원하는 위젯이 중간에 있도록 하고 싶다면, 그 상단에 있는 위젯에 GlobalKey를 주고 해당 키를 이용하여 함수를 호출하면 된다. final scrollKey = GlobalKey(); Container( key: scrollKey, child: null ), 2022. 6. 1.
[Flutter] Keyboard rebuild Flutter는 keyboard에 대한 show/hide처리를 할 때 rebuild가 일어나게 된다. 문제는 이러한 처리를 할 때 notifier의 생성자에서 데이터를 load해주고 있는데 키보드 클릭할 때마다 로드가 일어나서 대략 난감;; Scaffold의 resizeToAvoidBottomInset속성에 false를 줘라, MediaQuery를 사용하지 마라. (sizer 패키지를 사용해라) 이런 이야기들이 주를 이루고 있다. 나의 경우에는 ScrollView에 대한 처리해주고 있어서 그런지 위의 처리를 모두 처리해도 계속 rebuild가 일어났다. 데이터를 계속 받아온다. rebuild처리는 flutter의 정상적인 처리이고 위 해결책으로는 내 상황에서 사용을 할 수 없으니 새로운 방법을 찾아야 했.. 2022. 5. 20.
[Flutter] List<Widget>을 ListView로 사용하는 방법 SmartRefresher(controller: notifier.refreshController, enablePullDown: true, enablePullUp: false, header: const ClassicHeader(), onRefresh: () { notifier.loadConf(context); }, child: ListView( children: notifier.confList, ) ), Android로 치면 RefreshLayout 부분을 개발을 하고 있었는데 주어진 형태는 List의 형태가 들어가길 원하고 있었다. pull to refresh라는 라이브러리를 사용하여 개발을 하고 있었고 child에 Column을 감싸고 children에 List의 형태를 주고 있는데 오류를 계속 뿜어내.. 2022. 5. 16.
[Flutter] AES 암호화 encrypt 패키지를 사용하고 있습니다. AESKey를 넣어주면 16자리 키보다 작으면 늘리고 크면 16자리로 잘라서 사용합니다. (키를 16자리로 맞춰야 함) 그 외 empty값이 들어오면 죽어가지고 예외 처리 해주고 있습니다. import 'package:encrypt/encrypt.dart'; String encrypt(String strAesKey, String strValue) { if(strValue.isEmpty) { return ""; } if(strAesKey.length < 16) { strAesKey = strAesKey + ' ' * (16 - strAesKey.length); } else { strAesKey = strAesKey.substring(0, 16); } final e.. 2022. 5. 13.
[Android] Resize Bitmap 이미지가 들어왔을 때 원하는 width, height로 비율에 맞게 잘라준다. https://stackoverflow.com/questions/4837715/how-to-resize-a-bitmap-in-android 스택오버플로우에서 scale처리하는 함수 토대로 만들었다. private fun getResizedBitmap(bm: Bitmap, destWidth: Int, destHeight: Int): Bitmap? { val width = bm.width val height = bm.height if(width >= height) { // 세로 기준으로 비율을 잡아 확대하고 이미지 좌우를 자른다. val heightRatio = (destHeight / height.toFloat()) val ma.. 2022. 5. 11.
[Flutter] Flavor 처리(Old version) https://medium.com/@dev.juyoung/flutter-flavor%EB%A5%BC-%ED%86%B5%ED%95%9C-%EB%B9%8C%EB%93%9C-%EB%B3%80%ED%98%95-part-3-ba94fa1b4985 아래 내용은 모두 Native에서 직접 Flavor 및 스킴 처리를 하는 방식을 기반으로 합니다. 현재 회사 Meetings 프로젝트에서는 다양한 회사들에 따른 BuildConfig 정보가 분리되어 있고 리소스도 분리가 되어 있는 상태이다. 지금까지 조사한 방식에 대해서 정리한다. 아직 직접 적용하는 과정을 거치지는 않았고 테스트를 위한 사전 조사 과정까지 진행했다. 고려사항으로는 ApplicationId(BundleID), BuildConfig, 리소스(이미지) 분리,.. 2022. 5. 5.
[Flutter] 날씨 정보 받아오기(weather, geolocator) 개발하고 있는 프로젝트에서 날씨 정보가 ... 한 줄이 필요한데 날씨 API에다가 위치 처리를 package를 같이 연동해야 하는 형태입니다. weather 패키지에서 geolocator 패키지를 사용하길 추천하고 있습니다. weather 패키지에서는 위도, 경도 정보를 토대로 정보를 받아오는 방식과 도시 이름을 가지고 받아오는 형태가 있는데 각 사용자의 위치에 따른 처리를 하기 위해서는 geolocator 패키지를 사용하는 방식으로 가야 합니다. 1. 위치 정보 알아오기(geolocator) A Flutter geolocation plugin which provides easy access to platform specific location services (FusedLocationProviderCl.. 2022. 5. 2.
[Android] Network status Manifest에 추가 Deprecated on Android 10(api 29) val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork: NetworkInfo? = cm.activeNetworkInfo val isConnected: Boolean = activeNetwork?.isConnectedOrConnecting == true Android 11이상을 타겟팅하고 있는 경우 var isNetworkActive = false private val networkCallBack = object : ConnectivityManager.NetworkCallback() { ove.. 2022. 5. 1.
[Flutter] 난독화 # Flutter 난독화 How to obfuscate Flutter apps? https://stackoverflow.com/questions/50542764/how-to-obfuscate-flutter-apps Flutter’s code obfuscation, when supported, works only on a release build. https://docs.flutter.dev/deployment/obfuscate Android/iOS/macOS — Supported. Linux/Windows — Not yet supported. Web — Obfuscation is not supported for web apps, but a web app can be minified, which is si.. 2022. 4. 28.
[Flutter] Screen, StatusBar Size UI 개발 중에 위치를 Padding 처리를 직접하고 싶을 때 사용하기에 좋다. double getScreenWidth(BuildContext context) => MediaQuery.of(context).size.width; double getScreenHeight(BuildContext context) => MediaQuery.of(context).size.height; double getStatusBarSize(BuildContext context) => MediaQuery.of(context).padding.top; double getPixelRatio(BuildContext context) => MediaQuery.of(context).devicePixelRatio; /* // Full scre.. 2022. 4. 27.
[Flutter] Screen Orientation // This will works always for lock screen Orientation. void main() { WidgetsFlutterBinding.ensureInitialized(); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]) .then((_) { runApp(new MyApp()); }); } 2022. 4. 27.
[Flutter] 카카오 로그인 설정 https://developers.kakao.com/docs/latest/ko/getting-started/sdk-flutter Flutter에서 카카오 로그인을 사용하려면 pacakge를 추가해야 합니다. pubspec.lock kakao_flutter_sdk_user: ^1.0.0 미리 Android, IOS 플랫폼도 등록해야 한다고 합니다. Android 키 등록을 하려면 jks 파일을 만들어야 하는데, cmd 창에서 다음 명령어를 이용합니다. keytool -genkey -v -keystore keystore경로\keystore.jks -alias [alias 이름] -keyalg [암호화방식, RSA 입력] -keysize [key 크기, 2048] -validity [유효기간, 20000] e.. 2022. 4. 23.
[Flutter] StatusBar Color void setWhiteTextStatusBar() { SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, systemNavigationBarIconBrightness: Brightness.light, statusBarIconBrightness: Brightness.light, statusBarBrightness: Brightness.dark)); } void setBlackTextStatusBar() { SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transpare.. 2022. 4. 21.
[Flutter] ExpandablePageView initial page ExpandablePageView 플러그인을 사용하고 있는데 자꾸 페이지를 동적으로 처리할 때 항상 0번으로 셋팅이 되어 있어서 확인을 해보니 내부적으로 Controller가 설정이 안 되어 있으면 기본으로 생성을 하고 initial로 0번을 넣도록 되어 있다. controller를 직접적으로 사용하지 않더라도 임의로 생성해서 initialPage 정보를 넣어주면 해결 된다. ExpandablePageView( controller: PageController(initialPage: iPageIdx), onPageChanged: (iIdx) { }, children: [], ) 2022. 4. 18.
[Flutter] Scroll To Top 버튼 final ScrollController _scrollController = ScrollController(); void _scrollToTop() { _scrollController.animateTo(0, duration: const Duration(milliseconds: 750), curve: Curves.ease); } // ScrollView의 controller 속성에 추가 SingleChildScrollView( controller: _scrollController, ... ), // Top 버튼 in Column Padding( padding: const EdgeInsets.all(margin16), child: Align( alignment: Alignment.centerRight, ch.. 2022. 4. 17.
[Flutter] BackPress to exit int iPrevClickTime = 0; void updatePrevClickTime() => iPrevClickTime = DateTime.now().millisecondsSinceEpoch; bool clickedToExit() { int iClickTime = DateTime.now().millisecondsSinceEpoch; if(iClickTime - iPrevClickTime < 2000) { return true; } return false; } // wiget에서 WillPopScope( onWillPop: () async { if (clickedToExit()) { return true; } else { Fluttertoast.showToast('Press one more to exi.. 2022. 4. 16.