프로그래밍과 잡담

안드로이드 Target 29 이상 일 경우, 폴더 및 파일 접근 방법 본문

프로그래밍/안드로이드

안드로이드 Target 29 이상 일 경우, 폴더 및 파일 접근 방법

크레온 2020. 12. 23. 20:56

좆같은 구글이 폴더에 접근방식을 개같이 만들어 버렸다. 

아마 애플이 이딴 방식으로 되어 있겠지 안써봐서 모르겠지만.

 

타겟버전을 무조건 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" 하면 그냥 접근되게 하면 되지 이게 뭔 개지랄이냐.

 

사용자 데이터 훔쳐가는 앱은 니들이 더 잘 검수를 해야지 쓰레기같은 구글

 

 

 

 

 

반응형
Comments