[Swift] 네비게이션 바의 하단 그림자(line) 제거하기

(Custom Navigation Bar)


iOS 개발 중 네비게이션 바를 커스텀하여 뒤에 있는 배경과 같은 색상으로 지정해주고 하단 그림자(혹은 선, line)까지 제거해야하는 경우가 있습니다.

오늘은 네비게이션 바의 하단 그림자 제거하는 방법을 알아보려합니다.

 

코드를 먼저 살펴보시죠.

 

코드 (Swift5 대응)

navigationBar.setBakcgroundImage(UIImage(), for : UIBarMetrics.default)
navigationBar.shadowImage = UIImage()

 

navigationBar에 setBackgroundImage 함수 설정과, shadowImage 변수 설정만 초기화해주시면 그림자가 제거되는 것을 확인하실 수 있습니다.

 

그림자는 배경이미지가 있는 경우 기본적으로 그림자 이미지가 사용되는 모양입니다.

따라서 아무 값을 넣지 않는 객체 UIImage로 BackgroundImage와 shadowImage를 초기화하면 빈 이미지를 가진 객체로 선언되어 그림자가 들어가지 않게 됩니다. 

 

버전정보 (v1.0)

 - v1.0 2020.06.20 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

* Karzin은 항상 공부중입니다. 설명이 틀리거나 잘못된 부분이 있다면 의견내주시는대로 수정하도록 하겠습니다.

 

Karzin

abbeea@naver.com

 


[Database] 데이터 모델이란?


오늘은 데이터 모델에 대해서 알아보는 시간을 가지고자 합니다.

 

데이터 모델 (Data Model)

A set of Symbols == 모든 Symbol들의 집합

 - 모든 심볼드의 집합으로 컴퓨터에 데이터를 저장하는 방식을 정의해 놓은 개념 모형

 - 대표적으로 계층형, 네트워크형, 관계형, 객체지향형 등

 

데이터 모델의 종류

 

데이터 모델링 (Data Modeling)

All Process == 모든 프로세스

 - 현실세계에서 스토리지로 저장하기 위한 모든 프로세스

 - 현실 -> Data Modeling -> DB

 

데이터 모델링

 

 - Conceptinal Modeling (개념적 데이터 모델링)

    -> 추상화 수준이 높고 업무중심적

    -> 포괄적인 수준의 모델링 진행

    -> EA 수립시 많이 이용 (E-R Modeling)

 

 - Logical Modeling (논리적 데이터 모델링)

    -> 시스템으로 구축하고자하는 업무에 대해 Key, 속성, 관계 등 정확히 표현

    -> 재사용성이 높음

    -> Relational (관계형)

 

 - Physical Modeling (물리적 데이터 모델링)

    -> 실제로 데이터 베이스에 이식할 수 있도록 성능, 저장 등 물리적인 성격을 고려하여 설계

    -> File, MetaDataFile, PhysicalDataFile

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

 

버전정보 (v1.0)

 - v1.0 2020.06.19 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com


[자료구조]Java로 Stack 구현해보기 (List 활용)


지난시간에 자료구조 파헤치기를 통해 Stack 구조에 대해서 정리해보았습니다. (페이지로)

 

이번에는 Stack구조를 Java로 만들어 보려합니다. (List 활용)

어렵지 않게 단순히 데이터를 저장할 Stack변수와 Pop 함수 및 Push 함수를 구현해 볼까 합니다.

 

아래는 개발전 설계한 Class-Diagram입니다.

Stack의 Class-Diagram

Class-Diagram 설명

 - stack 변수 : List형식으로 되어있으며, 값을 넣기(push) 위한 공간이라 생각하시면 됩니다.

 - popValues 변수 : 이는 stack변수에서 빠진(pop) 값을 담아두기 위한 공간입니다. (단순히 어떤식으로 빠지나를 확인하기 위한 용도입니다.)

 - push 함수 : String 값을 받아오면 stack 변수에 입력(push) 해줍니다.

 - pop 함수 : stack 변수에서 마지막 값을 꺼냅니다.(pop) 

 - printStack 함수 : push 및 pop 등의 과정을 거쳐 현재 상태를 console창에 print 해줍니다.

 - printPopValue 함수 : pop된 데이터 값을 순서대로 보여줍니다.(popValues 활용)

 

완성 소스 (소스는 github에도 업로드하였습니다. - 링크)

/**
 * Stack 클래스
 * @author karzin
 *
 */
public class Stack {
	
	//Stack 변수 생성 (List)
	private List<String> stack = null;
	
	//Stack 변수에서 pop된 데이터를 저장
	private List<String> popValues = null;
	
	//생성자 - stack을 초기화해줌
	Stack() {
		stack = new ArrayList<String>();
		popValues = new ArrayList<String>();
	}
	
	//stack에 값을 넣음(push)
	public void push(String pushValue) {
		stack.add(pushValue);
	}
	
	//stack에서 값을 뺌(pop)
	public String pop() {
		String popValue = "Stack이 비어있습니다.";
		
		if(stack.size() > 0) {
			popValue = stack.remove(stack.size()-1);
			popValues.add(popValue);
		} else {
			System.err.println(popValue);
		}
		
		return popValue;
	}
	
	//stack 내부에 있는 값을 모두 출력한다.
	public void printStack() {
		int i = 0;
		
		for(String value : stack) {
			if(i < value.length()) {
				i = "| ".length() + value.length() + " |".length();
			}
		}
		
		for(int s = stack.size()-1; s >= 0; s--) {
			int length = "| ".length() + stack.get(s).length() + " |".length();
			length = i-length;
			System.err.print("| "+stack.get(s));
			for(int j = 0; j < length; j++) {
				System.err.print(" ");
			}
			System.err.print(" |");
			System.err.println();
			for(int j = 0; j < i; j++) {
				System.err.print("-");
			}
			System.err.println();
		}
		
		System.err.println();
	}
	
	//popValues 변수에 있는 값을 순서대로 보여줌.
	public void printPopValue() {
		System.out.print("popValues ==> ");
		System.out.println(popValues);
		
		System.out.println();
	}

}

 

테스트해보기 (Main Class 생성 및 실행 -> 소스는 github에도 업로드하였습니다. - 링크)

stack.push("A");
stack.printStack();

stack.push("B");
stack.printStack();

stack.pop();
stack.printPopValue();

stack.push("C");
stack.printStack();

stack.pop();
stack.printPopValue();

stack.pop();
stack.printPopValue();

 

결과

-> Debug 모드로 실행하셔서 한줄 한줄 어떤식으로 바뀌는지 확인해보시면 더욱 이해하기 쉽습니다.

---

졸면서 하느라고 함수도 소스도 많이 적은느낌이네요.

버그같은거 있다면 댓글남겨주시면 최대한 바로 수정하겠습니다.

감사합니다.

 

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

 

버전정보 (v1.1)

 - v1.0 2020.06.18 배포

 - v1.1 2020.06.23 제목 말머리 [자료구조] 추가

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com





[자료구조 파헤치기] Stack구조란


간만에 자료구조나 뒤집어엎어보자는 생각에 하나씩 다뤄볼까 싶어서 한번 꺼내봤습니다.

아마 버전은 시간나는 틈틈이 제가 다룰 수 있는 모든 언어로 다뤄볼 예정입니다.

 

그럼 우선 첫번째로 Stack구조는 어떤형식의 구조인지를 한번 파악해보시죠.

이거 하나만 알면 됩니다. LIFO!

 

LIFO

LIFO의 의미는 후입선출(Last In First Out)이라는 의미로 맨 마지막에 들어온(Push) 데이터가 처음으로 빠져나간다고(Pop) 보시면 됩니다.

 

조금 쉽게 생각을 해보자면 창고에 박힌 상자를 생각해보시면 될 것 같습니다.

창고에 아래서부터 차근차근 상자를 쌓아 올려놨다면, 상자를 꺼내기 위해서는 맨 위에 있는 상자부터 꺼내게 될겁니다.

 

백문이 불여일견. 말보다는 눈으로 직접 보면서 설명드리겠습니다.

데이터를 넣고(Push) 빼는(Pop) 작업을 잘 확인해보세요!

 

 - 아래 보시는 이미지는 Stack과 데이터 A, B, C를 준비했습니다.

Stack의 구조

 

 - Stack에 데이터 A를 넣고, (Push)

A를 Stack에 Push

 

- 다시한번 더 데이터 B를 Stack에 넣습니다. (Push)

B를 Stack에 Push

 

 - 그럼 A와 B가 들어간 Stack에서 데이터를 뺀다면 어떤 데이터가(A?, B?) 빠져나올까요? (Pop)

Stack에서 Pop을 한다면

 

 - 정답은 B입니다.

  -> Stack은 LIFO. 즉, Last In First Out이기 때문에 맨 마지막에 들어간(Push) 데이터가 나오는(Pop) 형식입니다.

Stack에서 Pop을 한다면 데이터 B가 나옵니다.

 

 - 계속해서 진행을 해보면 C라는 데이터를 넣고(Push) 뺀다면(Pop) 이 또한 맨 마지막에 들어온(Push) C가 나오는(Pop) 형식입니다. (Last In First Out)

Stack에 데이터 C를 Push 후 Pop을 하면 데이터 C가 나옵니다.

 

- 마지막으로 데이터를 뺀다면(Pop) B-C-A 순으로 나오게 됩니다.

B-C-A순으로 데이터가 나옵니다.(Pop)

 

항상 맨 마지막에 들어온 데이터가 맨 처음으로 나온다는걸(LIFO - Last In First Out) 잘 기억해주세요.

이 LIFO만 잘 이해 하셨다면 Stack구조는 다 이해하신겁니다!

 

 # Stack을 소스로 만들어 보기

  ▷ JAVA-List : [자료구조]Java로 Stack 구현해보기 (List 활용) -> 링크로 이동

 

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

 

버전정보 (v1.1)

 - v1.0 2020.06.17 배포

 - v1.1 2020.06.23 내용 추가

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com

 

 

 


Project.다원 Ensemble_내부망 구조(서버 도식화)


오늘은 제가 구현할 ERP Ensemble의 서버 구조를 간단하게 설계해 보았습니다.

 

이는 내부망 구조로, 웹 서버가 구축된 내부망에서만 사용이 가능하며,

외부에서 필요한 경우 VPN 접속을 열어 최대한으로 보안을 유지하기 위해서 설계를 했습니다.

 

 - 아래는 내부망 구조 (서버 도식화)

내부망 구조 (서버 도식화)

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

** 상단 그림은 제가(Karzin) 직접 만들었으며, 필요한 픽토그램등의 작업도 직접 만든것임을 명시합니다.

** 상단 그림의 저작권은 Karzin에게 있음을 명시합니다.

 

- Ensemble는 위와 같은 구조로 개발이 진행 될 것입니다.

  -> 다만, 제게는 WEB, WAS, DB를 따로 두고 개발하진 못할것으로 보이며(테스트 서버의 부재), WEB/WAS/DB 서버를 하나로 합쳐서 테스트 할 것입니다.

 

-  WEB Server의 경우 Apache나 Nginx를 사용할 예정입니다.

  -> 이는 추후 변경가능성이 없지않아 있으며, 사실상 개발은 WAS단에서 이루어질 것이고, WEB서버는 사용자의 입맛에 맞추어 진행하는것으로 해볼 예정입니다.

  -> 다만, 제가 Apache나 Nginx 정도만 다뤄본 경험이 있어 추가적인 WEB Server에 대해서는 대응이 어려울 것으로 보여 Apache 혹은 Nginx를 Default로 잡았습니다.

 

- WAS Server의 경우 tomcat8을 타겟으로 잡고 진행합니다.

  -> 톰캣 외 WildFly (이전 JBoss)도 사용해보았지만, 저는 WAS는 아무래도 tomcat8이 좀 더 익숙하다 보니 tomcat8을 타겟으로 잡았습니다.

  -> 또한 tomcat은 APACHE 2 License를 따르고 있어 개인적 혹은 상업적 목적으로 사용할 수 있기 때문에(APACHE2 License를 포함시키고 아파치 소프트웨어 재단에 개발된 소프트웨어라는 것을 명확히 밝히기) 채택한 것도 큰 이유중 하나입니다.  

 

- DB Server의 경우 Master와 Slave를 나누어 사용합니다.

  -> Master는 CRUD 전반적인 입출력이 될 예정입니다.

  -> Slave의 경우 DBLink로 Master의 모든 테이블 및 데이터를 동일하게 복제할 예정이며, 이 복제된 데이터를 n일마다 새벽 2시(혹은 이외의 시간) 부터 Backup을 하여 Backup Storage로 Backup된 파일을 이동할 예정입니다.

    -->> Backup Data의 이동은 사람이 하는것이 아닌, Linux crontab(Shell Script)을 활용하여 옮길 예정입니다.

  -> Backup Storage의 경우 실제 물리적인 HDD를 따로 두어 Backup Data를 관리를 하던, Backup용 Server를 따로 구축하여 관리를 하는 형식으로 이루어질 예정입니다.

  * 저의 경우 어떠한 DB Data가 되었던 자신 혹은 회사 혹은 나라의 자산이라 생각하기 때문에 Backup을 굉장히 중요하다고 생각합니다. 따라서 가능하면 Backup에도 많은 공을 들일 예정입니다.

  -> WAS와 데이터를 주고 받을 시 중요한 데이터(Password 및 개인 정보 등)에 대해서 암호(encryption)/복호(decryption)화를 통해 주고받을 예정입니다.

  -> 또한 Master Server의 상태가 불안정할시 Slave Server로 변경하여 작업을 원할하게 진행할 수 있도록 개발할 생각입니다. (이는 추후 과제가 될예정)

  -> 사실 설계적인 부분에 있어서는 고민을 많이 했는데, 처음에는 Replication을 활용을 할까 고민을 많이 했습니다. (Insert/Update/Delete는 Master, Select는 Slave 형식의 분산처리) 다만, Replication을 활용할 만큼 엄청나게 많은 데이터가 오가지 않는다는 생각으로 설계를 했으므로, 추후 변경가능성이 다소 있습니다. (Ref1. DB를 DBLink가 아닌 Replication을 활용한 경우의 구조도)

 

- 내부망에 붙기 위해서는 VPN을 활용

  -> 요즘의 공유기는 날이 가면 갈수록 좋아집니다. 특히 VPN이 지원될 정도로 말이죠. (적어도 제가 사용중인 iptime의 경우 지원하고 있습니다.)

  -> 최대한 외부로의 포트를 막고 내부에서만 작업을 하게끔 하고 있으며, 외부에서 작업이 필요한 경우 VPN을 통해 접속을 할 수 있도록 생각하고있습니다.

 

- Client

  -> 최대한 모든 Web Browser를 지원할 예정입니다. (시간이 걸리더라도)

  -> Front단을 Bootstrap을 이용하여 개발하여 PC, 모바일, 태블릿 등 OS에 상관없이 수많은 플랫폼에서 지원이 가능하며, Ensemble의 개발이 어느정도 진척이 이루어지면 Application(Android, iOS)을 제작하여 Ensemble의 장비관리 파트에 붙여서 사용할 예정입니다.

    -->> 장비관리 파트의 대략적인 기능으로는

          1. 모바일 등에서 장비촬영,

          2. 촬영된 장비를 등록 및 관리,

          3. 장비 상태에 따른 불용 및 폐기 처리 등을 지원하도록 할 예정입니다.

 

Ref1. DB를 DBLink가 아닌 Replication을 활용한 경우의 구조도

DBLink가 아닌 Replication을 활용한 구조도

 

** 그림에 사용된 글자체는 네이버 나눔글꼴의 나눔스퀘어 Bold입니다.

** 상단 그림은 제가(Karzin) 직접 만들었으며, 필요한 픽토그램등의 작업도 직접 만든것임을 명시합니다.

** 상단 그림의 저작권은 Karzin에게 있음을 명시합니다.

 

버전정보 (v1.1)

 - v1.0 2020.06.16 배포

 - v1.1 2020.06.16 Ref1. 추가 (Replication의 활용 구조도 그림 추가)

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Project.다원은 개인(karzin)이 기획, 분석, 설계, 디자인, 개발, 유지보수 등

모든 부분을 혼자 맡아 진행하는 개인 프로젝트입니다.

Project.다원 Ensemble

Karzin

abbeea@naver.com

 


그럼에도 기부를 멈추지 않는 이유


 

저에게는 기부를 시작해서 매달마다 정기적으로 결제되는 금액이 있습니다.

큰 금액은 아니지만(물론 여유가 된다면 그 만큼 더 기부를 하겠지만), 매년마다 더 기부를 하려고 노력하고 있습니다.

 

분명 시작은 여유가 있다고해서 시작한 것은 아니지만 힘든 누군가에게 작지만 힘이 되어드리고 싶어서 시작했습니다.

제게 그럴만한 여유가 있냐고 물어보신다면, 언제나 여유는 없었죠..

 

블로그를 보시면 아시겠지만, 자취를 하며, 회사를 다니며, 대학원을 다니며.

매달 수입은 회사에서 나오는 금액은 일정수준이겠지만,

그에 비해 지출은

대학교의 남은 학자금 대출과

대학원에 들어가는 등록금, 교통비, 기타 비용과

자취를 하며 들어가는 월세와 생활비(전기세, 교통비, 가스비, 수도세, 통신비)

그리고 부모님께 드리는 용돈과 나 자신의 보험비 등등 수 없이 많습니다.

빠듯합니다..ㅎ...

 

그럼에도 제가 기부를 멈추지 않는 이유는 '책임감' 때문입니다.

남들보다 유독 잘 사는건 아니지만,

그래도 사니까 숨쉬니까 저보다 더 어려운 분들을 위해서 나누자는 생각으로 시작했기 때문에,

분명 기부를 하는 금액을 모았다면 더 여유로운 생활로 바뀌겠지만,

그래도 이미 시작했으니 책임을 지고 진행하자는 생각을 가지고 있습니다.

 

남들이 보기에는 아주 조금의 금액이지만,

물론 그 조금의 금액도 노후를 위한 연금으로 모았다면 제 자신은 조금 더 배를 부를 수 있을진 몰라도

내가 살아가는 우리나라는 배가 부르지 못할 수 있다는걸 생각합니다.

저는 앞으로 더욱 자라야 할 우리나라의 미래가 돈이라는 장애물에 발목이 잡히지 않기를 바랍니다.

원한다면 더 배울 수 있고, 더 배부를 수 있는.

모두가 행복한.. 돈에 얽매이지 않기를 바라며.. (정작 자신은 돈에 얽매여서 삐걱거리지만..)

 

저의 작은 기부로 얼마나 바뀌겠나 싶지만,

그래도 조금의 금액이라도 우리의 미래를 위한 투자라 생각하고

여유는 없어도 계속해서 멈추지 않고 기부를 진행하려고 합니다.

 

잔고가 빈 텅장에 힘들어 할 때 한번씩 다시 읽고 되새겨야 겠습니다 ㅎㅎ

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com



'노트 > 주저리주저리' 카테고리의 다른 글

[20200701] 애견호텔 학대 뉴스를 보고..  (0) 2020.07.01
[20200623] 기대되는 WWDC(2020)  (0) 2020.06.23
기부, 벌써 일년  (0) 2019.08.29
즐거웠던 추석연휴?!  (0) 2018.09.27
180915 일상  (0) 2018.09.16

Project.다원ERP_이름정하기

- Ensemble -


 

 


개인적으로 이름이라는건 굉장히 중요하다고 생각합니다.

인플루언서가 말하는 한문장 문장이 전부 영향력을 끼치는 것처럼

title, 즉 제목, 칭호와 같은 이런 이름 또한 영향력을 행사한다고 생각을 하고 있습니다.

때문에 저는 Project.다원의 이름을 정할때에도 순 우리말이라는 다원이라는 이름의 뜻(ref.1)이

프로젝트에 있어서도 모두 다 원하는 모두 다 사랑하는 프로젝트가 되기를 바라면서 지었습니다.

 

오늘은 제가 진행하는 Project.다원의 하나 ERP에 이름을 지어줄까 합니다.

 

Project.다원 ERP 라고 생각만 했고, 프로그램의 이름은 계속해서 보류를 해가며 정하지 않았지만,

이번에 그 이름을 확실하게 정했습니다.

 

이번 프로젝트에서 사용할 프로그램의 이름은 Ensemble(ref.2)입니다.

 

Ensemble은 ERP의 모든 기능을 가능한 모듈화를 통해 구현될 것이며,

이 모든 기능은 모두가 함께 조화를 이루며 있었으면 하여 정했습니다.

또 Ensemble인 만큼 ERP를 더 뛰어넘는 자원관리 시스템이 되었으면 좋겠다는 소망으로 정했습니다.

 

 

Project.다원의 ERP System. Ensemble을 잘 부탁드리겠습니다.

 

 

ref.1 :

다원 - 모두 다 원하는 모두 다 사랑하는 사람

ref.2 :

Ensemble - 앙상블, 함께, 동시에, 같이 등의 의미를 내포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Project 다원_ERP

Karzin

abbeea@naver.com

 


[Kotlin, Java] Android 10에서 파일 엑세스가 되지 않는 문제 해결

- EPERM 오류 해결하기 -


얼마전 개발 테스트 진행중 Android 8이나, Android 9에서 잘만 읽기/쓰기가 되던 파일이 Android 10에서 구동을 하니 에러만 열심히 뿜어내고 저장이 안되는 문제가 있었습니다.

로그창을 확인해보니 EPERM 오류를 뿜어내고 있었고, 저장이 되지않아 곤란해 하고 있었습니다.

특히 테스트를 하며 확인되었지만, READ_EXTERNAL_STORAGE 및 WRITE_EXTERNAL_STORAGE 권한을 유저에게 승인받고 있어서 유독 Android 10에서만 생기는 문제로 파악이 되었죠.

오늘은 이런 Android10으로 올라가면서 파일에 대한 읽기 쓰기가 되지않는 문제에 대해 다뤄보겠습니다.

 - 원인과 해결

Android 10 부터는 외부 저장소 액세스에 대해서 제한을 걸어두는 모양입니다.

해당 제한을 풀기 위해서는 AndroidManifest.xml에 requestLegacyExternalStorage의 값을 true로 설정해주어야합니다. (Android 10 이상을 타겟팅으로 하는 앱의 경우)

<manifest ... >

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  
  <!-- This attribute is "false" by default on apps targeting
  Android 10 or higher. -->
  <application 
  	android:requestLegacyExternalStorage="true" ... >
    
  ...
  
  </application>
</manifest>

 

* Android 10 이상에서는 외부저장소에 접근을 하기위해 requestLegacyExternalStorage 속성을 꼭 넣어주시기 바랍니다.

** 다만 해당 방법이 완벽히 해결을 할 수 있는 방법은 아니며, 추후 업데이트 되는 Android 버전에서는 동작하지 않을수 있으니 주의해주시기 바랍니다.

 

 - 참조

https://developer.android.com/training/data-storage/files/external-scoped?hl=ko#opt-out-of-scoped-storage

 

범위가 지정된 외부 저장소 액세스 관리하기  |  Android 개발자  |  Android Developers

사용자에게 파일의 더 많은 권한을 제공하고 파일이 복잡해지는 것을 제한하기 위해, Android 10(API 레벨 29) 이상을 타겟팅하는 앱은 외부 저장소로 범위가 지정된 액세스 또는 범위 지정 저장소��

developer.android.com

버전정보 (v1.0)

 - v1.0 2020.06.12 배포

 

* 저작권에 위반될 수 있는 컨텐츠(이미지, 동영상 등)나 게시글은 삭제되거나 수정될 수 있습니다.

* 문제의 여지가 될 수 있는 컨텐츠의 경우 댓글 달아 주시면 빠른 시일 내에 조치하도록 하겠습니다.

 

Karzin

abbeea@naver.com

+ Recent posts