[Kotlin]Activity 전체화면 처리


예전에는 뭔가 AndroidManifest.xml에서 android:theme의 설정을 조금 만져주면 되었던걸로 기억하는데(개발한지 오래되서 맞는지는..) 최근버전에서는 많이 달라진것같네요.

 

전체화면모드가 생겨서 lean back, Immersive, sticky immersive라는 3가지 옵션으로 앱의 전체화면을 컨트롤하는 모양입니다.

 

private fun fullScreen(fullScreenOption : Int) {
  window.decorView.systemUiVisibility = (
    fullScreenOption
    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_FULLSCREEN )
}​

 - fullScreenOption은 전체화면의 옵션을 설정해주기위한겁니다.

 - Immersive, sticky immersive

 - Immersive 옵션 : View.SYSTEM_UI_FLAG_IMMERSIVE

 - sticky immersive 옵션 : View.SYSTEM_UI_IMMERSIVE_STICKY

 - 위 두 옵션은 상태표시줄이나, 탐색메뉴를 없애 전체화면으로 만들어주며, 필요시 아래나 위에서 스와이프 동작을 하면 상태표시줄과 탐색메뉴가 동시에 보이게 됩니다.

 - 다만 sticky immersive옵션을 주면 상태표시줄이나, 탐색메뉴가 불투명하게 보이며, 스와이프 후 일정시간이 지나면 다시 전체화면으로 돌아가지만, Immersive옵션의 경우 스와이프 후 상태표시줄과 탐색메뉴가 불투명하지 않고, 일정시간이 지나도 계속 존재함을 확인하실 수 있습니다. (촬영 등에 탐색이벤트를 사용할일이 적은 Activity에 적합해보입니다.)

 - 만일 lean back 옵션을 주고 싶다면, fullScreenOption 매개변수를 지워주시면 됩니다. (lean back 옵션의 경우 Activity를 터치하면 상태표시줄과 탐색메뉴가 나오게됩니다. - 유저가 동영상을 보다가 어떠한 탐색 이벤트 등을 발생하고 싶을때 적합한듯 보입니다.), 아래 예시 참조

private fun fullScreen() {
  window.decorView.systemUiVisibility = (
    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    or View.SYSTEM_UI_FLAG_FULLSCREEN )
}

 

 - 위 함수는 onWindowFocusChanged 함수안에서 실행해주면 됩니다. (아래 예제 참조)

override fun onWindowFocusChanged(hasFocus : Boolean) {
  super.onWindowFocusChanged(hasFocus)
  if(hasFocus) fullScreen(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
}​

 - onWindowFocusChanged함수는 Activity의 선택(Focus)여부를 확인하는 함수입니다. (override하여 사용하시면 됩니다.) 

 - Activity가 포커스 되면 fullScreen이 되는 형식입니다.

 - lean back 옵션의 경우 매개변수를 넘겨주지않으면 됩니다.

  >> fullScreen()

 

 *** Reference : https://developer.android.com/training/system-ui/immersive?hl=ko

 

전체 화면 모드 사용 설정  |  Android 개발자  |  Android Developers

동영상, 게임, 이미지 갤러리, 책, 프레젠테이션 슬라이드 같은 콘텐츠를 이용하기에 최적의 환경은 전체 화면입니다. 이 페이지에서는 전체 화면에서 사용자를 콘텐츠에 더욱 몰입하게 하는 방법과 사용자가 앱을 실수로 종료하지 않도록 하는 방법을 설명합니다. 앱에 화면 공간을 최대한 활용하겠다는 단순한 이유로 전체 화면 모드를 사용 설정하려고 할 수 있습니다. 하지만 사용자가 알림 확인이나 즉흥적인 검색 등을 위해 얼마나 자주 앱을 시작하고 종료하는지 고려해야

developer.android.com

 *** 소스에 문제가 있을 시 댓글달아주시면 최신화하도록 하겠습니다. 감사합니다.

 

 


[Kotlin]안드로이드 권한 요청


 

 

권한요청은 JAVA 버전도 만들었었지만 이번에 개발하는 Kotlin(이하 코틀린)에서 사용할 권한 요청을 정리해 보았습니다. (JAVA는 추후에 다시)

 

1. JAVA와 동일하게 AndroidManifest.xml에서 권한을 요청할 permission을 지정해줍니다.

 예 ) <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

      //저장소 쓰기에 대한 권한 요청

2. PermissionCheck Class (아래 소스코드 참고)

class PermissionCheck(val permissionActivity: Activity, val requirePermissions: Array<String>) {

    private val permissionRequestCode = 100

    //권한 체크용
    public fun permissionCheck() {
        var failRequestPermissionList = ArrayList<String>()

        for(permission in  requirePermissions) {
            if(ContextCompat.checkSelfPermission(permissionActivity.applicationContext, permission) != PackageManager.PERMISSION_GRANTED) {
                failRequestPermissionList.add(permission)
            }
        }

        if(failRequestPermissionList.isNotEmpty()) {
            val array = arrayOfNulls<String>(failRequestPermissionList.size)
            ActivityCompat.requestPermissions(permissionActivity, failRequestPermissionList.toArray(array), permissionRequestCode)
        }
    }
}

 - 첫번째 매개변수는 Activity를 넘겨받으며, 두번째 매개변수는 Array 즉, 권한요청할 permission의 배열을 받아옵니다.

 - permissionCheck 함수를 돌려주면 permission 배열내에서 권한승인이 되지않은 권한을 모드 failRequestPermissionList 로 담아줍니다. 담아준 결과는 Empty 즉, 빈값이 아니라면 권한을 요청하게됩니다.

 

3. 실행할 위치에 권한요청할 permission의 Array를 생성해주고(아래 requestPermissions), PermissionCheck 클래스의 permissionCheck 함수를 실행해줍니다.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)

  var requestPermissions = arrayOf(
  Manifest.permission.WRITE_EXTERNAL_STORAGE
  )

  val permissionCheck = PermissionCheck(this, requestPermissions)
  permissionCheck.permissionCheck()
}

 

** 만일 permissionCheck 함수를 실행하지 않고 바로 실행하고 싶다면 init 활용 (아래 참조)

class PermissionCheck(val permissionActivity: Activity, val requirePermissions: Array<String>) {

    private val permissionRequestCode = 100

    //권한 체크용
    init {
        var failRequestPermissionList = ArrayList<String>()

        for(permission in  requirePermissions) {
            if(ContextCompat.checkSelfPermission(permissionActivity.applicationContext, permission) != PackageManager.PERMISSION_GRANTED) {
                failRequestPermissionList.add(permission)
            }
        }

        if(failRequestPermissionList.isNotEmpty()) {
            val array = arrayOfNulls<String>(failRequestPermissionList.size)
            ActivityCompat.requestPermissions(permissionActivity, failRequestPermissionList.toArray(array), permissionRequestCode)
        }
    }
}

 -> 사용시에는 아래처럼 PermissionCheck 클래스에 매개변수만 담아주면 권한체크가 실행됩니다.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)

  var requestPermissions = arrayOf(
  Manifest.permission.WRITE_EXTERNAL_STORAGE
  )

  PermissionCheck(this, requestPermissions)
}

 

*** Reference : https://developer.android.com/training/permissions/requesting?hl=ko

*** 소스에 문제가 있을 시 댓글 달아주시면 최신화하도록하겠습니다.

 


[Windows] 업데이트 오류 해결 (0x80240fff)


 

노트북의 SSD를 새것으로 교체 후 시원한 마음으로 윈도우10을 설치를 하고 나니 업데이트 오류가 저를 반겼습니다.

 

 

위와 같이 0x80240fff 오류가 났을 때에는 [다시 시도] 버튼을 여러번 눌러도 해결이 되지 않으므로,

 

https://www.microsoft.com/ko-kr/software-download/windows10

 

Windows 10 다운로드

Windows 10용 ISO 파일을 다운로드한 경우, 해당 파일은 선택한 위치에 로컬로 저장됩니다.컴퓨터에 타사 DVD 굽기 프로그램이 설치되어 있으며 해당 프로그램을 사용하여 설치 DVD를 만들려는 경우, 파일이 저장된 위치로 이동하여 ISO 파일을 두 번 클릭하거나 마우스 오른쪽 단추를 클릭하고, 다른 프로그램으로 열기를 선택하여 선호하는 해당 DVD 굽기 소프트웨어를 선택하면 프로그램을 열 수 있습니다. Windows 디스크 이미지 버너를 사용하여

www.microsoft.com

 

위 링크를 타고 가셔서 화면에 보이는 [지금 업데이트] 버튼을 누르시면 파일을 하나 다운(Windows 10 업데이트 도우미)받게 됩니다.

 

 

다운로드 된 실행파일(Windows 10 업데이트 도우미)을 실행 하시고 업데이트를 시작합니다.

 

 

위 업데이트가 정상적으로 완료되면 남은 업데이트를 시작하실 수 있습니다.

 


[MySql, MariaDB] 

Spring Boot 연동시 타임존 에러 해결


 

개인적인 프로젝트를 진행하며 보인 에러입니다.

 

더보기

The server time zone value 'KST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

 

DB 서버단에서 특별한 설정(타임존 세팅 등)을 하지 않아서 발생하는 문제이지만, 귀찮으므로 서버는 건들지 않는 선택을 하도록 하겠습니다.

 

 -해결방법 (DB서버를 건들지 않는 방법)

  > database url 맨 마지막에 ?serverTimezone=Asia/Seoul를 추가해주시면 됩니다.

  > 협정세계표준시(UTC)의 경우 ?serverTimezone=UTC를 추가해주시면 됩니다.

 


[Mysql, MariaDB] 계정 생성 및 권한 부여하기


 

Mysql 및 MariaDB에서 계정을 생성하고 권한을 부여하는 방법입니다.

 

 - root 권한으로 로그인

sudo mysql -u root -p

 > root 패스워드를 입력 후 로그인합니다.

 

 

 - 계정생성하기

 > 로컬 및 원격으로 접속이 가능한 계정 생성

create user 'USERNAME'@'%' identified by 'PASSWORD';

  -> username 부분에는 계정의 이름을, password 부분에는 계정의 암호를 입력합니다.

 

 > 로컬로만 접속이 가능한 계정 생성

create user 'USERNAME'@'localhost' identified by 'PASSWORD';

 

 

 - 생성한 계정에 권한을 부여할 DB 만들기

create database DBNAME default character set UTF8;

 > DBNAME 부분에 생성할 DB 명칭을 입력해주세요.

 > default charater를 utf8로 설정합니다.

 

 

 - 생성된 DB 확인

show databases;

 

 

 - 계정에 DB 권한 부여

grant all privileges on DBNAME.* to 'USERNAME'@'%';

 > 변경된 권한 적용

flush privileges;

 

 

 

 - 계정생성이 완료되면 생성된 계정으로 로그인이 가능

mysql -u USERNAME -p

 > 설정한 패스워드 입력 후 로그인

 > 권한 부여된 DB 확인

show databases;

 

 


[Ubuntu] Maria DB 설치하기


저는 개인적으로 DB 서버를 구축시엔 오픈소스와 여러 이유로 항상 Maria DB를 선택하곤 합니다.

오늘은 제가 좋아하는 Maria DB 설치방법을 알아겠습니다.

 

 - update하기 (필요시)

sudo apt update

 

 - Maria DB Server 설치하기

sudo apt install mariadb-server

 > 디스크 공간 사용 여부 (Y/n)이 나오면 y를 누르고 엔터를 하면 설치가 시작됩니다.

 > 설치가 완료되면 Maria DB의 보안에 대해서 설정할 수 있습니다.

sudo mysql_secure_installation

 > 루트 계정의 암호 설정 등 자신이 원하는 옵션을 취향에 따라 선택해주면 됩니다.

 > 1. Change the root password?_루트패스워드를 바꿀것인지? (개인적으론 y권장)

  -> 이후 루트패스워드 변경

 > 2. Remove anonymous users?_익명사용자를 지울것인지? 

 > 3. Disallow root login remotely?_외부 접속시(원격으로 접속시) root 로그인 가능 여부를 막을것인지? (개인적으론 y권장)

 > 4. Remove test database and access to it?_test 데이터베이스와 접속권한을 지울것인지?

 > 5. Reload privilege tables now?_권한 변경시 reload 할것인지?

 -- 잘 읽어보시고 보안설정하시면 될 것 같고, 잘 모르겠다 싶으면 모두 y를 권장합니다.

 --- 선택여부는 개인의 판단입니다. *보안을 위한 권장일 뿐이지, 강요는 아닙니다.

 

 

 - 설치 완료가 되었는지 root로의 로그인

sudo mysql -u root -p

 > 패스워드는 위에서 설정한 루트 암호를 넣어주시면 됩니다.

 ** sudo권한이 아닌 상태(mysql -u root -p의 경우) 에서 로그인을 하려다보면 "ERROR 1698 (28000) : Access denied for user 'root'@'localhost'"에러가 나므로, sudo권한을 꼭 넣어주셔야합니다.

 > 로그인 후 계정 생성은 Database 카테고리로..

 


[Ubuntu] ifconfig 설치하기

(리눅스 ip확인하기)


리눅스서버를 포맷하고 ifconfig를 사용하려고보니 패키지가 설치가 되어있지 않은 경우가 있어 작성합니다.

ifconfig를 통해 리눅스 서버의 ip를 확인할 수 있습니다.

 

 - update를 진행합니다. (필요시)

sudo apt update

 

 - net-tools 패키지 설치하기

 sudo apt install net-tools

 > 위 apt로 설치 진행이 되지 않을 경우 apt-get을 사용

sudo apt-get install net-tools

 

 

설치 후 콘솔창에 ifconfig를 치면 ip정보를 확인할 수 있습니다.

 


[Ubuntu] vim 설치


 

요즘 나오는 Ubuntu에는 기본적으로 vim이 설치되어 있는걸로 알고있습니다.

 

설치가 필요한 경우 참고하시면 됩니다.

 

 - update하기

sudo apt update

> apt-get을 사용하는 경우 (위 apt가 실행이 안되는 경우)

sudo apt-get update

 

 - vim 설치

sudo apt install vim

>apt-get을 사용하는 경우 (위 apt가 실행이 안되는 경우)

sudo apt-get install vim

 

 

 - 설치 확인

vim

 

 - vim을 이용하여 파일 수정하기

vim <파일명>

 

 - 기본적인 vim 사용법

  > 입력모드 i키(명령모드에서)

  > 입력모드 나가기(명령모드) ESC키

  > 저장 :w(명령모드에서)

  > vim 나가기 :q(명령모드에서)

  > vim 저장 후 나가기 :wq(명령모드에서)

  > vim 저장하지 않고 나가기 :q!(명령모드에서)

  > 문자열 찾기 /[찾을 문자열]

    -> n키로 다음 단어, N키로 이전 단어를 찾음

 

+ Recent posts