2015-07-01 22 views
6

Tôi có một ứng dụng cho phép người dùng chọn đích truyền thông của họ thông qua SAF bằng OPEN_DOCUMENT_TREE. Khi các tệp phương tiện mới được thêm vào, tôi muốn kiểm tra để đảm bảo có số lượng không gian tối thiểu thay vì điền vào. Nó cũng có thể được sử dụng để chọn số lượng bộ nhớ cache tập tin nếu kích thước của điểm đến được biết đến.Xác định khoảng trống có sẵn trong Khung Truy cập Bộ nhớ cho 5.0+ OS ver

AFAIK, DocumentFile, v.v., không cung cấp cho bạn bất cứ điều gì. Về mặt kỹ thuật, nếu bạn đi qua OPEN_DOCUMENT_TREE, đích thực sự không được biết đến, trong khi đó có thể là sdcard, nó cũng có thể là đích đến trên đám mây.

Tuy nhiên, có thể ai đó đã thực hiện đủ thử nghiệm để xác định đáng tin cậy ổ đĩa flash đang được sử dụng. Nếu người dùng chọn phân vùng chính thì nó có thể được trích xuất từ ​​DocumentFile, ít nhất tôi có thể loại bỏ không gian chính. Các điểm gắn thẻ Sdcard khác nhau giữa các thiết bị để có được bản đồ chính xác có thể có vấn đề.

Tôi có thể nhận được không gian của các thẻ sd có sẵn bằng cách sử dụng getFilesDir tiêu chuẩn hoặc getMediaFilesDir và sử dụng tệp này để có dung lượng trống.

Vậy làm cách nào để tìm không gian nếu bạn chỉ có đối tượng DocumentFile?

+0

Tôi đã điều tra điều này. Bạn sử dụng loại danh mục và MIME nào khi xây dựng ý định của mình với OPEN_DOCUMENT_TREE? Tôi đã không thể tìm thấy một sự kết hợp hoạt động. –

+0

Vâng ... không, cho nó là một thư mục và không phải là một tập tin. Vì vậy, chỉ Intent (Intent.ACTION_OPEN_DOCUMENT_TREE) sau đó bắt đầu hoạt động với kết quả. Tôi có thể có được thư mục và sử dụng nó, chỉ cần không gian có sẵn ngay bây giờ. – Bruce

+0

@Bruce bạn đã làm việc này? Có cùng một vấn đề bản thân mình. Cảm ơn. – brindy

Trả lời

3

Ok, tôi đã tìm thấy một số loại giải pháp. Điều này đã được thử nghiệm trên Android set-top-box Android. Trước tiên, hãy lấy treeUri từ ACTION_OPEN_DOCUMENT_TREE. Sau đó, thực hiện như sau:

Uri docTreeUri = DocumentsContract.buildDocumentUriUsingTree(
      treeUri, 
      DocumentsContract.getTreeDocumentId(treeUri) 
    ); 
    try { 
     ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(docTreeUri, "r"); 
     assert pfd != null; 
     StructStatVfs stats = Os.fstatvfs(pfd.getFileDescriptor()); 
     Log.i(LOG_TAG, "block_size=" + stats.f_bsize + ", num_of_blocks=" + stats.f_bavail); 
     Log.i(LOG_TAG, "free space in Megabytes:" + stats.f_bavail * stats.f_bsize/1024/1024); 
    } catch (FileNotFoundException | ErrnoException e) { 
     Log.e(LOG_TAG, Log.getStackTraceString(e)); 
    } 
Các vấn đề liên quan