Rất nhiều câu hỏi hay, hãy cùng tìm hiểu. :)
Làm thế nào để bạn sử dụng nó?
Đây là một hướng dẫn tuyệt vời để tương tác với Khung truy cập lưu trữ trong KitKat:
https://developer.android.com/guide/topics/providers/document-provider.html#client
Tương tác với các API mới trong Lollipop rất giống nhau. Để nhắc người dùng chọn một cây thư mục, bạn có thể khởi chạy một ý định như sau:
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, 42);
Sau đó, trong onActivityResult (), bạn có thể chuyển Uri do người dùng chọn sang lớp trợ giúp DocumentFile mới. Dưới đây là một ví dụ nhanh liệt kê các tệp trong thư mục đã chọn, sau đó tạo một tệp mới:
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 được trả về DocumentFile.getUri()
đủ linh hoạt để sử dụng với các API nền tảng khác nhau. Ví dụ, bạn có thể chia sẻ nó bằng cách sử dụng Intent.setData()
với Intent.FLAG_GRANT_READ_URI_PERMISSION
.
Nếu bạn muốn truy cập Uri đó từ mã gốc, bạn có thể gọi ContentResolver.openFileDescriptor()
và sau đó sử dụng ParcelFileDescriptor.getFd()
hoặc detachFd()
lấy số nguyên bộ mô tả tệp POSIX truyền thống.
Làm cách nào để kiểm tra xem bạn có thể truy cập các tệp / thư mục hay không?
Theo mặc định, Uris được trả về thông qua ý định của Khung truy cập lưu trữ không được duy trì khi khởi động lại. Nền tảng này "cung cấp" khả năng duy trì quyền, nhưng bạn vẫn cần phải "lấy" quyền nếu bạn muốn. Trong ví dụ của chúng tôi ở trên, bạn sẽ gọi:
getContentResolver().takePersistableUriPermission(treeUri,
Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
Bạn luôn có thể tìm ra những khoản tài trợ lâu dài mà ứng dụng của bạn có quyền truy cập thông qua ContentResolver.getPersistedUriPermissions()
API. Nếu bạn không cần quyền truy cập vào Uri tồn tại nữa, bạn có thể giải phóng nó bằng ContentResolver.releasePersistableUriPermission()
.
Cái này có trên KitKat không?
Không, chúng tôi không thể thêm chức năng mới vào các phiên bản cũ hơn của nền tảng.
Tôi có thể xem những ứng dụng nào có quyền truy cập vào tệp / thư mục không?
Hiện không có giao diện người dùng nào hiển thị điều này, nhưng bạn có thể tìm thấy chi tiết trong phần "Quyền của Uri được cấp" của adb shell dumpsys activity providers
đầu ra.
Điều gì xảy ra nếu một ứng dụng được cài đặt cho nhiều người dùng trên cùng một thiết bị?
Việc cấp quyền cho Uri được tách biệt trên cơ sở mỗi người dùng, giống như tất cả các chức năng nền tảng đa người dùng khác. Có nghĩa là, cùng một ứng dụng chạy dưới hai người dùng khác nhau không có sự cấp phép trùng lặp hoặc được chia sẻ với Uri.
Quyền có thể bị thu hồi không?
Trình hỗ trợ DocumentProvider có thể thu hồi quyền bất kỳ lúc nào, chẳng hạn như khi tài liệu dựa trên đám mây bị xóa. Cách phổ biến nhất để khám phá các quyền bị thu hồi này là khi chúng biến mất khỏiContentResolver.getPersistedUriPermissions()
được đề cập ở trên.
Quyền cũng bị thu hồi bất cứ khi nào dữ liệu ứng dụng bị xóa đối với một trong hai ứng dụng liên quan đến việc cấp.
Yêu cầu quyền có hoạt động đệ quy trên một thư mục đã chọn không?
Đúng, ACTION_OPEN_DOCUMENT_TREE
mục đích cung cấp cho bạn quyền truy cập đệ quy vào cả tệp và thư mục hiện có và mới được tạo.
Điều này có cho phép nhiều lựa chọn không?
Đúng, nhiều lựa chọn đã được hỗ trợ kể từ KitKat và bạn có thể cho phép nó bằng cách thiết lập EXTRA_ALLOW_MULTIPLE
khi bắt đầu ACTION_OPEN_DOCUMENT
ý định của mình . Bạn có thể sử dụng Intent.setType()
hoặc EXTRA_MIME_TYPES
thu hẹp các loại tệp có thể được chọn:
http://developer.android.com/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
Có cách nào trên trình giả lập để thử API mới không?
Đúng, thiết bị lưu trữ dùng chung chính sẽ xuất hiện trong bộ chọn, ngay cả trên trình giả lập. Nếu ứng dụng của bạn chỉ sử dụng truy cập Khung lưu trữ để truy cập lưu trữ chia sẻ, bạn không còn cần đến READ/WRITE_EXTERNAL_STORAGE
quyền ở tất cả và có thể loại bỏ chúng hoặc sử dụngandroid:maxSdkVersion
tính năng để chỉ yêu cầu họ trên các phiên bản nền tảng cũ.
Điều gì xảy ra khi người dùng thay thế thẻ SD bằng một thẻ khác?
Khi có liên quan đến phương tiện vật lý, UUID (chẳng hạn như số sê-ri FAT) của phương tiện cơ bản luôn được ghi vào Uri trả về. Hệ thống sử dụng điều này để kết nối bạn với phương tiện mà người dùng đã chọn ban đầu, ngay cả khi người dùng hoán đổi phương tiện giữa nhiều vị trí.
Nếu người dùng đổi sang thẻ thứ hai, bạn sẽ cần phải nhắc để có quyền truy cập vào thẻ mới. Vì hệ thống ghi nhớ các khoản cấp trên cơ sở mỗi UUID, bạn sẽ tiếp tục có quyền truy cập đã cấp trước đó vào thẻ gốc nếu người dùng nạp lại thẻ sau.
http://en.wikipedia.org/wiki/Volume_serial_number