Android 10 의 파 티 션 저장 메커니즘(Scoped Storage)적응 튜 토리 얼 을 자세히 설명 합 니 다.
6012 단어 Android10파 티 션 저장 소
휴대 전 화 를 사용 하면 모 르 는 폴 더 와 파일 이 가득 하 다 는 것 을 모두 가 알 고 있 을 것 이다.심지어 삭 제 된 소프트웨어 의 폴 더 까지 존재 한다.
왜 이런 문제 가 발생 했 을 까?
구 글 의 부재 로 안 드 로 이 드 생태 가 야만 적 으로 성장 하면 서 많은 개발 규범 이 제대로 이행 되 지 못 하고 있다.
이러한 문 제 를 해결 하기 위해 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 이상 인 응용 에 대해 접근 권한 범 위 는 파 티 션 저장 으로 제한 합 니 다.이 프로그램 은 저장 소 와 관련 된 사용자 권한 을 요청 하지 않 아 도 됩 니 다.외부 저장 소 에 있 는 다음 유형의 파일 을 볼 수 있 습 니 다.
영향 범위:
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 파 티 션 저장 체제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 우 리 를 많이 지 켜 주시 기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Android 10 의 파 티 션 저장 메커니즘(Scoped Storage)적응 튜 토리 얼 을 자세히 설명 합 니 다.4.567917.모든 응용 프로그램 은 자신의 저장 공간 을 가지 고 있다4.567917.응용 프로그램 은 자신의 디 렉 터 리 를 넘 어서 공공 디 렉 터 리 에 접근 할 수 없습니다4.567917.응용 프로그램 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.