2012-04-30 24 views
17

Trong lớp lớp MediaStore.Files, đề cập đến nó rằng,MediaStore - Uri để truy vấn tất cả các loại tập tin (phương tiện truyền thông và không phương tiện truyền thông)

bảng cung cấp dịch vụ truyền thông có chứa một chỉ số của tất cả các tập tin trong lưu trữ phương tiện truyền thông, bao gồm các tệp không phải phương tiện.

Tôi quan tâm đến việc truy vấn các tệp không phải là phương tiện như PDF.

Tôi đang sử dụng CursorLoader để truy vấn cơ sở dữ liệu. Tham số thứ hai cho hàm tạo yêu cầu một đối số Uri dễ dàng nhận được cho các loại phương tiện Âm thanh, Hình ảnh và Video vì mỗi loại có một hằng số EXTERNAL_CONTENT_URIINTERNAL_CONTENT_URI được xác định cho chúng.

Đối với MediaStore.Files, không có hằng số được xác định như vậy. Tôi đã thử sử dụng phương thức getContentUri() nhưng không thể tìm ra giá trị đối số cho volumeName. Tôi đã thử đưa "/ mnt/sdcard" và tên khối lượng xuất hiện khi tôi kết nối thiết bị với hệ thống của mình nhưng vô ích.

Tôi thấy số similar question on Google Groups nhưng chưa được giải quyết.

EDIT: Tôi cũng đã thử sử dụng Uri.fromFile (tệp mới ("/ mnt/sdcard /")) và Uri.parse (tệp mới ("/ mnt/sdcard"). ToString()) nhưng điều đó didn ' t làm việc ra một trong hai.

+0

chỉ file không phương tiện truyền thông? Như không có '.jpg'' .avi' '.mp3' nhưng chỉ' .txt' etc? – zapl

+0

Vâng. Chỉ các tệp phi phương tiện. Đối với '.jpg',' .avi', v.v. Tôi có thể sử dụng các lớp Âm thanh, Video và Hình ảnh. –

Trả lời

34

Đó là "external" hoặc "internal" mặc dù nội bộ (tệp hệ thống) có thể không hữu ích ở đây.

ContentResolver cr = context.getContentResolver(); 
Uri uri = MediaStore.Files.getContentUri("external"); 

// every column, although that is huge waste, you probably need 
// BaseColumns.DATA (the path) only. 
String[] projection = null; 

// exclude media files, they would be here also. 
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "=" 
     + MediaStore.Files.FileColumns.MEDIA_TYPE_NONE; 
String[] selectionArgs = null; // there is no ? in selection so null here 

String sortOrder = null; // unordered 
Cursor allNonMediaFiles = cr.query(uri, projection, selection, selectionArgs, sortOrder); 

Nếu bạn muốn .pdf duy nhất bạn có thể kiểm tra Mimetype

// only pdf 
String selectionMimeType = MediaStore.Files.FileColumns.MIME_TYPE + "=?"; 
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("pdf"); 
String[] selectionArgsPdf = new String[]{ mimeType }; 
Cursor allPdfFiles = cr.query(uri, projection, selectionMimeType, selectionArgsPdf, sortOrder); 
+0

Cảm ơn rất nhiều! :) Bạn đã hình dung ra điều đó như thế nào? Tôi đã tìm kiếm khá nhiều trên Internet. Tôi đã đi qua "bên ngoài" nhưng sử dụng nó như thế này Uri.fromParts ("nội dung", "bên ngoài", "") mà không làm việc ra ngoài. –

+0

Bằng cách xem các mã nguồn - 'Uri.parse (" nội dung: // media/external/file ")' hoặc 'Uri.fromParts (" nội dung "," phương tiện/external/file ", null)' nên làm tương tự – zapl

+0

có tương thích với Android 2.2 không? + ... –

Các vấn đề liên quan