많은 좋은 질문, 파헤쳐 보겠습니다. :)
어떻게 사용합니까?
다음은 KitKat의 스토리지 액세스 프레임 워크와 상호 작용하기위한 훌륭한 튜토리얼입니다.
https://developer.android.com/guide/topics/providers/document-provider.html#client
Lollipop에서 새로운 API와 상호 작용하는 것은 매우 유사합니다. 사용자에게 디렉토리 트리를 선택하라는 메시지를 표시하려면 다음과 같은 인 텐트를 시작할 수 있습니다.
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
그런 다음 onActivityResult ()에서 사용자가 선택한 Uri를 새 DocumentFile 도우미 클래스에 전달할 수 있습니다. 다음은 선택한 디렉터리의 파일을 나열한 다음 새 파일을 만드는 간단한 예제입니다.
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
if (resultCode == RESULT_OK) {
Uri treeUri = resultData.getData();
DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
// List all existing files inside picked directory
for (DocumentFile file : pickedDir.listFiles()) {
Log.d(TAG, "Found file " + file.getName() + " with size " + file.length());
}
// Create a new file and write into it
DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel");
OutputStream out = getContentResolver().openOutputStream(newFile.getUri());
out.write("A long time ago...".getBytes());
out.close();
}
}
에서 반환 된 Uri DocumentFile.getUri()
는 다양한 플랫폼 API에서 사용할 수있을만큼 유연합니다. 예를 들어, 사용하여 공유 할 수 Intent.setData()
와 함께 Intent.FLAG_GRANT_READ_URI_PERMISSION
.
당신은 열린 우리당이 네이티브 코드에서, 당신이 호출 할 수있는 액세스하려면 ContentResolver.openFileDescriptor()
다음 사용 ParcelFileDescriptor.getFd()
또는 detachFd()
전통적인 POSIX 파일 기술자의 정수를 얻을.
파일 / 폴더에 액세스 할 수 있는지 어떻게 확인합니까?
기본적으로 Storage Access Frameworks 인 텐트를 통해 반환 된 Uris는 재부팅시 유지 되지 않습니다 . 플랫폼은 권한을 유지할 수있는 기능을 "제공"하지만 원하는 경우 권한을 "취득"해야합니다. 위의 예에서 다음을 호출합니다.
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
ContentResolver.getPersistedUriPermissions()
API 를 통해 앱이 액세스 할 수있는 지속 된 권한을 항상 파악할 수 있습니다 . 지속 된 Uri에 더 이상 액세스 할 필요가없는 경우 ContentResolver.releasePersistableUriPermission()
.
KitKat에서 사용할 수 있습니까?
아니요, 플랫폼의 이전 버전에 새 기능을 소급하여 추가 할 수 없습니다.
파일 / 폴더에 액세스 할 수있는 앱을 볼 수 있습니까?
현재이를 표시하는 UI는 없지만 adb shell dumpsys activity providers
출력 의 "허용 된 Uri 권한"섹션에서 세부 사항을 찾을 수 있습니다 .
동일한 기기에서 여러 사용자를 위해 앱을 설치하면 어떻게 되나요?
Uri 권한 부여는 다른 모든 다중 사용자 플랫폼 기능과 마찬가지로 사용자별로 격리됩니다. 즉, 두 명의 서로 다른 사용자에서 실행되는 동일한 앱에는 중복되거나 공유 된 Uri 권한 부여가 없습니다.
권한을 취소 할 수 있습니까?
지원 DocumentProvider는 클라우드 기반 문서가 삭제되는 경우와 같이 언제든지 권한을 취소 할 수 있습니다. 이러한 취소 된 권한을 발견하는 가장 일반적인 방법은 ContentResolver.getPersistedUriPermissions()
위에서 언급 한 권한이 사라지는 것 입니다.
권한은 부여와 관련된 앱에 대한 앱 데이터가 지워질 때마다 취소됩니다.
권한 요청이 선택한 폴더에서 반복적으로 작동합니까?
네,이 인 ACTION_OPEN_DOCUMENT_TREE
텐트는 기존 파일과 새로 생성 된 파일 및 디렉토리에 대한 재귀 적 액세스를 제공합니다.
다중 선택이 가능합니까?
네, KitKat 이후로 다중 선택이 지원되었으며 의도를 EXTRA_ALLOW_MULTIPLE
시작할 때 설정하여 허용 할 수 있습니다 ACTION_OPEN_DOCUMENT
. 당신은 사용할 수 있습니다 Intent.setType()
또는 EXTRA_MIME_TYPES
포착 할 수있는 파일의 종류를 좁힐 수 :
http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
에뮬레이터에서 새 API를 사용해 볼 수있는 방법이 있습니까?
예, 기본 공유 저장 장치는 에뮬레이터에서도 선택기에 표시되어야합니다. 앱이 공유 저장소에 액세스하기 위해 저장소 액세스 프레임 워크 만 사용하는 경우 더 이상 READ/WRITE_EXTERNAL_STORAGE
권한이 필요하지 않으며 권한 을 제거하거나 android:maxSdkVersion
기능을 사용하여 이전 플랫폼 버전에서만 요청할 수 있습니다.
사용자가 SD 카드를 다른 카드로 교체하면 어떻게됩니까?
물리적 미디어가 관련되면 기본 미디어의 UUID (예 : FAT 일련 번호)가 항상 반환 된 Uri에 기록됩니다. 시스템은이를 사용하여 사용자가 여러 슬롯 사이에서 미디어를 교체하더라도 사용자가 원래 선택한 미디어에 연결합니다.
사용자가 두 번째 카드를 교체하는 경우 새 카드에 액세스 할 것인지 묻는 메시지가 표시되어야합니다. 시스템은 UUID 단위로 허가를 기억하므로 사용자가 나중에 다시 삽입하는 경우 이전에 원래 카드에 대한 액세스 권한을 계속 부여 할 수 있습니다.
http://en.wikipedia.org/wiki/Volume_serial_number