Android 10 의 파 티 션 저장 메커니즘(Scoped Storage)적응 튜 토리 얼 을 자세히 설명 합 니 다.

1.프로필
휴대 전 화 를 사용 하면 모 르 는 폴 더 와 파일 이 가득 하 다 는 것 을 모두 가 알 고 있 을 것 이다.심지어 삭 제 된 소프트웨어 의 폴 더 까지 존재 한다.
왜 이런 문제 가 발생 했 을 까?
구 글 의 부재 로 안 드 로 이 드 생태 가 야만 적 으로 성장 하면 서 많은 개발 규범 이 제대로 이행 되 지 못 하고 있다.
이러한 문 제 를 해결 하기 위해 Google 은 펀치 출격 을 결정 하고 파 티 션 저장(Scoped Storage)체 제 를 샌 드 박스 저장 체제 라 고도 부 릅 니 다.
그럼 샌 드 박스 메모리 란 무엇 일 까요?
샌 드 박스 체 제 는 다른 응용 데 이 터 를 읽 는 것 을 방지 하 는 안전 메커니즘 이다.
4.567917.모든 응용 프로그램 은 자신의 저장 공간 을 가지 고 있다4.567917.응용 프로그램 은 자신의 디 렉 터 리 를 넘 어서 공공 디 렉 터 리 에 접근 할 수 없습니다4.567917.응용 프로그램 이 요청 한 데 이 터 는 모두 권한 검 사 를 통 해 검 측 되 어야 하 며 요구 에 부합 되 지 않 으 면 실행 되 지 않 습 니 다2.안 드 로 이 드 10 의 파 티 션 메커니즘

Android 10(API 레벨 29)및 더 높 은 버 전 을 대상 플랫폼 으로 하 는 응용 프로그램 은 기본 적 인 상황 에서 외부 저장 장치 에 대한 파 티 션 접근 권한(즉 파 티 션 저장)을 부여 하여 외부 저장 파일 접근 방식 을 재 설계 하여 사용자 가 외부 저장 문 서 를 더욱 잘 관리 할 수 있 도록 합 니 다.조건 에 맞지 않 으 면 호 환 모드 로 실 행 됩 니 다.호 환 모드 는 이전 과 마찬가지 로 경로 에 따라 파일 을 직접 저장 할 수 있 습 니 다.
응용 프로그램 은 이 응용 프로그램 에 만 있 는 디 렉 터 리(Context.getExternal FilesDir()를 통 해 접근)와 특정 유형의 미디어 만 볼 수 있 습 니 다.응용 프로그램 이 응용 프로그램 에 저 장 된 전용 디 렉 터 리 와 MediaStore 이외 의 파일 에 접근 하지 않 으 면 파 티 션 저장 소 를 사용 하 는 것 이 좋 습 니 다.
안 드 로 이 드 10 을 발표 할 때 공식 적 으로 명확 한 태 도 를 표명 했다.
2020 년 에 주요 플랫폼 버 전 은 모든 응용 프로그램 에 구역 별 저장 소 를 사용 하도록 요구 할 것 이다.응용 목표 SDK 등급 이 얼마 든 지 간 에.따라서 응용 프로그램 이 파 티 션 저장 소 를 사용 할 수 있 도록 미리 확보 해 야 합 니 다.이 를 위해 Android 10(API 레벨 29)및 더 높 은 버 전 을 탑재 한 장치 에 이 동작 이 활성화 되 었 는 지 확인 하 십시오.
통속 적 인 언어 로 번역 되 며,request Legacy External Storage=true 를 사용 하 는 방식 으로 호 환 모드 로 실행 되 든 targetSDK 를 낮 추 든 다음 2020 년 Android(API 29)10 업데이트 에서 면제 되 지 않 습 니 다.
그래서 응용의 안정성 을 위해 서 는 최선 을 다 해 배합 해 야 한다.
3.구체 적 인 파 티 션 저장 권한 에 대한 소개
기본 적 인 상황 에서 targetSdkVersion 이 29 이상 인 응용 에 대해 접근 권한 범 위 는 파 티 션 저장 으로 제한 합 니 다.이 프로그램 은 저장 소 와 관련 된 사용자 권한 을 요청 하지 않 아 도 됩 니 다.외부 저장 소 에 있 는 다음 유형의 파일 을 볼 수 있 습 니 다.
  • 외부 특정 디 렉 터 리 에 있 는 파일 을 사용 합 니 다(getExternalFilesDir()로 접근 합 니 다)
  • 자신 이 만 든 사진,동 영상 과 오디 오(MediaStore 를 통 해 방문)를 사용 합 니 다
  • 파 티 션 저장 소 는 Android 10 시스템 의 첫 설치 시작 과 targetSdkVersion>29 의 응용 에 영향 을 줍 니 다.외부 저장 파일 에 접근 하고 공유 해 야 하 는 응용 프로그램 이 영향 을 받 아 호환성 이 필요 합 니 다.
    영향 범위:
    Android 10 에서 실행 되 는 응용 프로그램:
    1.targetSdkVersion<=28,영향 받 지 않 음
    2.targetSdkVersion>=29 의 경우 기본 적 인 상황 에서 외부 저장 소 를 사용 하면 필터 링 됩 니 다.응용 은 파 티 션 저장 소 에 적합 해 야 합 니 다.
    그리고 주의해 야 할 것 은 다음 과 같은 두 가지 상황 이 비교적 특수 해서 구역 저장 의 영향 을 받 지 않 는 다 는 것 이다.
    안 드 로 이 드 10 이하 에 가장 먼저 설 치 된 시스템 을 적용 하면,
    1)그리고 시스템 은 Fota 를 통 해 Android 10 으로 업그레이드
    2)응용 프로그램 업 데 이 트 를 통 해 targetSdkVersion 으로 업그레이드>=29
    다음은 파 티 션 저장 권한 과 다른 관련 항목 에 대한 표 입 니 다.
    유형
    위치.
    자신 이 만 든 파일 에 접근 하기
    다른 응용 프로그램 에서 생 성 된 파일 에 접근 하기
    접근 방법
    마 운 트 해제 응용 프로그램 파일 삭제 여부
    외부 저장 소
    Photo/ Video/ Audio/
    권한 필요 없 음
    권한 필요 READEXTERNAL_STORAGE
    MediaStore Api
    아니.
    외부 저장 소
    Downloads
    권한 필요 없 음
    권한 필요 없 음
    저장 소 접근 프레임 워 크 SAF 를 통 해 시스템 파일 선택 기 불 러 오기
    아니.
    외부 저장 소
    특정 디 렉 터 리 적용
    권한 필요 없 음
    직접 접근 할 수 없 음
    getExternal FilesDir()에서 자신 만 의 파일 경 로 를 가 져 옵 니 다.
    예.
    4.전용 디 렉 터 리 저장 소
    전용 디 렉 터 리 에 있 는 파일 을 읽 거나 쓸 때 저장 권한 을 가 져 올 필요 가 없습니다.
    응용 프로그램 에서 현재 응용 프로그램의 전용 저장 디 렉 터 리 경 로 를 가 져 오 려 면 Context.getExternal FilesDir()방식 으로 가 져 올 수 있 습 니 다.
    
    val dirpath = context.getExternalFilesDir("")
    val fileString = dirpath + File.separator
    val file = File(fileString)
    ...  //        Java IO    IO      
    
    
    5.공유 미디어 집합 저장 소
    공유 미디어 집합 저장 소 에 미디어 파일 을 저장 할 때 파일 형식 에 따라 미디어 스토어 를 선택해 야 합 니 다.
    관련 데 이 터 를 ContentValues 에 넣 고 마지막 으로 ContentValues 를 ContentResolver 에 삽입 하여 되 돌아 오 는 Uri 를 얻 습 니 다.
    Uri 를 통 해 OutputStream 을 사용 한 후 Okio 의 IO 라 이브 러 리 로 파일 을 저장 합 니 다.
    Okio 에 관 한 것 은 앞으로 기회 가 된다 면 다시 한 번 잘 이야기 합 시다.
    권한 이 필요 하 다 는 것 을 잊 지 마 세 요.
    
    //              ,       
    //   ContentValues,      
    val values = ContentValues()
    values.put(MediaStore.Images.Media.DESCRIPTION, downloadedFile.name)
    values.put(MediaStore.Images.Media.DISPLAY_NAME, downloadedFile.name)
    values.put(MediaStore.Images.Media.MIME_TYPE, mimeType)
    values.put(MediaStore.Images.Media.TITLE, downloadedFile.name)
    values.put(
      MediaStore.Images.Media.RELATIVE_PATH,
      "${Environment.DIRECTORY_PICTURES}/${downloadedFile.name}"
    )
    //    ContentResolver,   Uri
    val insertUri = context.contentResolver.insert(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
      values
    )
    
    if (insertUri != null) {
      //   OutputStream
      val outputStream = context.contentResolver.openOutputStream(insertUri)
    if (outputStream != null) {
      sink = outputStream.sink().buffer()
    } else {
      return@runCatching FileDownloadResult.OthersError
      }
    } else {
      return@runCatching FileDownloadResult.OthersError
    }
    
     val responseBody = response.body ?: return@runCatching FileDownloadResult.OthersError
    
    try {
      val contentLength = responseBody.contentLength()
      if (contentLength > FileUtil.getAvailableSize(dirPath)) {
        continuation.resume(FileDownloadResult.StorageError)
      }
      var totalRead: Long = 0
      var lastRead: Long
    
      do {
        lastRead = responseBody.source().read(sink.buffer(), BUFFER_SIZE)
        if (lastRead == -1L) {
          break
        }
        totalRead += lastRead
        sink.emitCompleteSegments()
      } while (true)
      sink.writeAll(responseBody.source())
      sink.close()
      responseBody.close()
    }
    6.기타
    Github: https://github.com/HyejeanMOON/ScopedStorageDemo
    안 드 로 이 드 10 의 파 티 션 저장 체제(Scoped Storage)의 적합 한 튜 토리 얼 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 안 드 로 이 드 10 파 티 션 저장 체제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 우 리 를 많이 지 켜 주시 기 바 랍 니 다!

    좋은 웹페이지 즐겨찾기