일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 오토바이
- 윈도우7
- 양평역
- 고속도로
- QTcpServer
- 엑티브엑스
- 스타2
- Qt4
- 안드로이드
- 잡담
- 이륜차
- 정성하
- qt 설치
- HTML
- 스타크래프트2
- Java
- Qt OpenGL
- 자료구조
- android SAF
- Qt 소켓프로그래밍
- c언어
- QT
- 자바
- FFI
- 바이크
- 알람프로그램
- vuejs
- 재귀함수
- 마영전
- 디자이어HD
- Today
- Total
프로그래밍과 잡담
안드로이드 Target 29 이상 일 경우, 폴더 및 파일 접근 방법 본문
좆같은 구글이 폴더에 접근방식을 개같이 만들어 버렸다.
아마 애플이 이딴 방식으로 되어 있겠지 안써봐서 모르겠지만.
타겟버전을 무조건 29 이상으로 안하면 스토어 앱을 못 올린다.
아직 29까지는 manifests 에 예외 기능을 넣어서 기존 처럼 사용이 가능하지만 언제 타겟 버전을 30으로 올릴지 모른다.
여하튼 여태까지 접근 하던 방식인 File 클래스를 통한 접근은 더 이상 동작하지 않는다.
File("/sdcard/").listFiles() // 이렇게 하면 null 떨어짐
구글 새끼들이 쓰라고 하는 방식은 공용 폴더는 MediaStore 인가 뭔가 써서 접근 하라고 하고 일반 폴더는 SAF(Storage Access Framework) 를 쓰라고 한다.
사실 이거 나왔을 때 잘 안썼다. 쓰기가 개같이 되어 있어서 안썼는데 이제는 강제로 사용해야한다.
아마 외부 저장소에 접근이 빈번한 앱을 가진 사람들은 코드 싹 갈아 엎어 버려야 할거다 ㅋ
내가 만든것도 그런데 그냥 난 포기할려고 너무 해야 할게 많더라고
여하튼 SAF로 접근 할려면 아래와 같이 하면 된다
// 이건 사용자한테 폴더 선택하라고 요청하는 코드
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
startActivityForResult(intent, REQUEST_DOCUMENT_ID)
// 요청 결과를 여기로 받는다
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
REQUEST_DOCUMENT_ID -> {
if (data == null) {
Log.i("Main", "권한 요청을 취소함")
return
}
this.folderUri = data.data
val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or
Intent.FLAG_GRANT_WRITE_URI_PERMISSION
// 영구 권한 얻기
contentResolver.takePersistableUriPermission(this.folderUri!!, takeFlags)
// 이걸 DB에 넣던지 파일로 저장하던지 해서 나중에 불러와서 사용하면 된다
save(data.data.toString())
}
}
}
// 폴더나 파일 관련 접근은 DocumentFile 클래스를 이용해서 처리하면 된다
위의 스크린샷은 권한 요청 시 뜨는 화면이다. 많아 봤을 거다. 아 그리고 안드로이드 11부터는 루트에는 접근 못함 ㅋ
다른 폴더에 접근 할 때마다 저 빌어처먹을 화면을 사용자한테 보여줘야 한다.
전체 소스는 github.com/Creon12/AndroidSAFTest 여기 들어가서 받으면 됨. DB 저장하는 부분은 좀 특이 할건데 귀찮아서 내가 개인적으로 사용하는 라이브러리로 한거니 크게 중요한거 아니니 대충 보면 됨.
그리고 올린 소스는 귀찮아서 클래스를 안 나눈건데 실제 프로젝트에서는 저렇게 하면 안된다. 왠만하면 기능별로 나누는게 나중을 위해서 좋을거다.
이거 만들어 본 이유는 매번 폴더에 접근 할 때마다 저 빌어먹을 화면을 띄워 줄 순 없으니까, 접근 권한을 영구적으로 얻고, 그 정보를 DB나 파일같은데 저장해서 다시 이용이 가능한지에 대한 테스트 성 코드이다.
근데 내꺼 앱에는 적용 안 할 예정임.
이 지랄할려고 하면 전반적으로 뜯어 고쳐야하는데 하기 싫어.
아니 ㅅㅂ 처음에 사용자한테 "나 저장소 이용 할꺼다" 하고 사용자가 "OK" 하면 그냥 접근되게 하면 되지 이게 뭔 개지랄이냐.
사용자 데이터 훔쳐가는 앱은 니들이 더 잘 검수를 해야지 쓰레기같은 구글
'프로그래밍 > 안드로이드' 카테고리의 다른 글
[안드로이드] 거지같은 개발툴 (2) | 2021.05.20 |
---|---|
[안드로이드] 안드로이드가 21년 11월부터는 TARGET API를 30 이상으로 강제한다. (0) | 2021.05.18 |
[안드로이드] 아 안드로이드가 점점 병신이 되가는거 같다. (6) | 2020.12.22 |
롤리팝에서 외장메모리 쓰기에 대해서 대충 알거 같군. (0) | 2015.09.29 |
[안드로이드] 서비스를 호출 시 암시적으로 호출 (0) | 2014.11.12 |