라벨이 android인 게시물 표시

android Webivew에서 새창 띄우기

Webview를 연동시 일반적인 페이지 이동이 아닌 새창이 띄워져야 하는데 아무동작이 없어 당황 스러울때가 있습니다. android에서는 새창으로 띄워지는 동작은 따로 처리가 필요합니다. 기본적으로는 위와같이 새창이 띄워져야 하는경우 WebChromeClien의 onCreateWindow함수가 호출 됩니다. 함수가 호출 되면 새창과 관련 동작을 추가 해주면 아무동작이 없어 당황스러운 상황은 쉽게 해결 됩니다. webview = ( WebView ) findViewById ( R . id . webview ) ; WebSettings settings = webview . getSettings ( ) ; settings . setJavaScriptEnabled ( true ) ; settings . setSupportMultipleWindows ( true ) ; settings . setJavaScriptCanOpenWindowsAutomatically ( true ) ; 웹뷰셋팅을 해줍니다. webview.setWebChromeClient(new WebChromeClient() { @ Override public boolean onCreateWindow ( final WebView view , boolean dialog ,                                                                       boolean userGesture , Message resultMsg ) { WebView newWebView = new WebView ( MainActivity . this ) ; WebView . WebViewTransport transport                 

android 5.0 이상 웹뷰에서 파일 업로드 하기

웹페이지에서 사진이나 문서등 다양한 형식의 첨부파일을 업로드하는 기능이 구현 되어있는 곳이 많습니다. 하지만 android 웹뷰에서 첨부파일 업로드 기능은 추가 구현을 해주어야 동작을 합니다. 5.0 이전과 이후 버전에서 이 기능의 구현 방법은 다른데요. 오늘은 5.0 이상 버전에서 어떻게 구현 하는지 알아볼까 합니다.   < uses - permission android : name = " android.permission.READ_EXTERNAL_STORAGE " / > manifest 파일에 권한을 추가 합니다. private ValueCallback<Uri[]> mFilePathCallback ; WebChromeClient webChromeClient = new WebChromeClient() { // For Android Version 5.0+ public boolean onShowFileChooser ( WebView webView , ValueCallback < Uri [ ] > filePathCallback , FileChooserParams fileChooserParams ) { if ( mFilePathCallback ! = null ) { mFilePathCallback . onReceiveValue ( null ) ; } mFilePathCallback = filePathCallback ; showImageChooser ( ) ; return true ; } } ; 업로드를 위해서 앱에서 해주어야 할 일은 간단 합니다. WebchromeClient를 통해 파일선택창이 호출 되면 파일

Intent란 무엇인가?

Intent는 안드로이드 앱 내부 혹은 외부 컴포넌트간의 호출및 정보 전달을 하는 역할을 합니다. 앱 구성요소(컴포넌트) * Activity * Service * BroadCast Receiver * Content Provider 앱의 구성요소는 위의 4가지 이며 해당 구성요소간의 호출및 정보를 전달하는데 사용하는 것이 Intent 입니다. 명시적 인텐트와 암시적 인텐트 2가지로 분류 할수 있습니다. 1. 명시적인텐트 - 호출할 대상을 지정 하여 사용 Intent intent = new Intent(context, CallActivity.class) ; startActivity(intent) ; 다른 Acitivity를 시작 하는 소스입니다. 시작할 Acitivity를 지정하여 Intent를 생성 하여 사용합니다. Intent intent = new Intent(context, MyService.class) ; startService(intent) ; 로컬서비스를 시작하는 소스입니다. (참고로 원격서비스는 바인딩하는 방식으로 구현됩니다.) Acitivity 시작하는 것과 크게 다르지 않게 Service를 지정하여 Intent를 생성하여 사용 하는 것을 알수있습니다. 2. 암시적인텐트  - 컴포넌트외의 속성(컴포넌트를 지정하면 명시적 인텐트가 된다)들로 구성하여 속성에 부합하는 컴포넌트를 실행 Intent intent = new Intent( "android.intent.action.CALL" , Uri.parse(tel)) ; startActivity(intent) ; 전화걸기를 요청 하는 소스입니다. Action값을 android.intent.action.CALL을 지정해서 Acitivity를 실행하면 디바이스내에 해당 Action값 속성을 가지고 있는 Activity를 선택할수 있는 창이 노출 됩니다. 위에 보이는 소스는

android Soket를 활용한 통신 - Server

android에서 socket을 활용하여 Server, Client를 구현하여 통신하는 법을 알아보도록 하겠습니다. 우선 Server를 만드는 일인데요. android 디바이스에서 Server를 만들기 위해서는 Wifi환경이어야 가능 합니다. public static String getLocalIpAddress(Context appContext) { WifiManager wifiMgr = ( WifiManager ) appContext . getSystemService ( WIFI_SERVICE ) ; WifiInfo wifiInfo = wifiMgr . getConnectionInfo ( ) ; int ip = wifiInfo . getIpAddress ( ) ; String ipAddress = String . format ( "%d.%d.%d.%d" , ( ip & 0xff ) , ( ip > > 8 & 0xff ) , ( ip > > 16 & 0xff ) , ( ip > > 24 & 0xff ) ) ; return ipAddress ; } Wifi환경에서 디바이스의 IP주소를 가져오는 소스입니다. Server가 직접 쓰는 것은 아니지만 Client가 Server에 접근하기 위해서는 필요 합니다. private ServerSocket serverSocket ; private void createServer() { try { isRunning = true ; serverSocket = new ServerSocket ( SERVER

android에서 Gson 라이브러리 사용하기

Json 형식은 데이터 교환방식중 가장 많이 사용 하지 않나 생각 합니다. android에서는 가장 기본적으로 JsonObject라는 클래스를 이용하여 편리하게 파싱을 할수 있습니다. 하지만 이방법도 더 편리한 방법으로 제공 하는 것이 바로 Gson입니다. Gson 라이브러리는 파싱할 클래스를 선언하고 간단한 함수 호출을 통하여 객체에 값들이 할당됩니다. compile 'com.google.code.gson:gson:x.x' build.gradle의 dependencies에 gson라이브러리를 추가 합니다. class SampleDTO { int idx ; String text ; public SampleDTO ( int idx , String text ) { this . idx = idx ; this . text = text ; } } 파싱할 클래스형태를 만들어 줍니다. Gson gson = new Gson ( ) ; SampleDTO dto = new SampleDTO ( 1 , " sample " ) ; String sJsonText1 = gson . toJson ( dto ) ; String sJsonText2 = gson . toJson ( dto , SampleDTO . class ) ; Log . d ( " gson " , " sJsonText1: " + sJsonText1 + " \n sJsonText2: " + sJsonText2 ) ; 생성한 객체를 통해 Json텍스트로 만들어 주는 형태입니다. Gson 객체와 Json텍스트로 만들어 줄 객체를 생성합니다. 데이터 객체를 텍스트로 만들어 주기 위한 함수 toJson을 사용합니다.

android 플랫폼 버전 분포 (2017.7.6 기준)

이미지
안드로이드 프로젝트 시작 초기에 고민하는 내용 중 한가지가 플랫폼 버전을 어디서 부터 지원 할것 이냐 하는 문제 인 것 같습니다. 지원 하는 버전에 따라 개발시에 신경 써야 할 부분이 달라지는 만큼 중요한 문제라고 생각 하는데요. 그래서 많이 참고 하는 정보가 android developer 사이트에서 제공해주는 플랫폼 버전 분포도 입니다. 대시보드에서 제공해주는 플랫폼 버전 정보를 보면 너무 낮은 비중을 차지 하는 버전에 대해서는 과감히 포기 할수 있게 하는 객관적인 지표가 되어 주는 것 같습니다. 현재(2017.7.6 기준) 까지의 분포도를 보면서 이야기를 계속 하겠습니다. 출처 : https://developer.android.com/about/dashboards/index.html#Platform 가장 최신 버전인 누가의 점유율이 총 11.5%로 10%가 넘은 것이 가장 눈에 띄는 점이라고 할 수 있을 것 같습니다. 올 1월 기준으로 약 1%로 밖에 되지 않던 누가의 점유율은 반년정도가 지난 시점에 10%가 넘어서 빠른 속도로 증가 하고 있습니다. 올 상반기에 삼성, 엘지등 제조사들의 최신 단말들이 누가로 출시된 부분과 기존 단말의 업데이트 지원이 큰 상승폭의 이유라고 할 수 있겠습니다. 가장 큰 점유율을 차지하고 있는 것은 마시멜로우 입니다. 어쩌면 기존의 안드로이드 플랫폼 버전 분포도를 생각하면 당연한 일이라고 생각이 됩니다. 아이폰의 경우 신규 버전이 나온 후 일정 기간이 지나고 나면 최신 버전의 점유율이 굉장히 높습니다. 하지만 안드로이드는 플랫폼 버전 업데이트가 제조사에 의해 결정 되는 만큼 업데이트보다는 신규 단말의 출시로 인한 최신 버전의 점유율이 올라 가는 비중이 높다고 생각이 됩니다. 이런 이유로 인하여 안드로이드는 항상 최신 버전이 출시되고 약 1년 가까이 시간이 흐르면 이전 버전의 점유율이 가장 높은 것이 대부분 이었기 때문에 마시멜로우의 점유율이 높은 것은 당연한일 이라 생각이 됩니다. 그 다음으로 높