Android访问系统下载目录
在新版本Android中应当使用MediaStore访问共享媒体文件。共享媒体文件也包括系统下载目录中的文件。MediaStore以ContentProvider的方式提供了文件信息,得到文件信息后,可以直接打开文件访问数据。
Listing 1: 读取下载目录下的文件信息
Cursor cursor = /* Context. */ getContentResolver().query( MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL), null, MediaStore.Files.FileColumns.DATA + " like ?", new String[]{"%.txt"}, null); while (cursor.moveToNext()) { long id = cursor.getLong(cursor.getColumnIndexOrThrow(BaseColumns._ID)); String fullFileName = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA)); int fileSize = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.SIZE)); String fileBaseName = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME)); } cursor.close();
MediaStore.MediaColumns.DATA列是文件的全名。有了全名,就可以使用File和InputStream可以访问文件中的数据。
Listing 2: 访问文件中的数据
// 方法一:使用File对象。 String fullFileName = "..."; InputStream inputStream1 = new FileInputStream(fullFileName); // 方法二:使用ContentResolver。 Uri uri = Uri.parse(ContentResolver.SCHEME_FILE + "://" + fullFileName); InputStream inputStream2 = /* Context. */ getContentResolver().openInputStream(uri);
列名字 | 数据类型 | 含义 |
---|---|---|
BaseColumns._ID | long | 文件编号 |
MediaStore.MediaColumns.SIZE | int | 文件大小 |
MediaStore.MediaColumns.DATA | String | 文件路径 |
MediaStore.MediaColumns.DISPLAY_NAME | String | 文件基础名 |
MediaStore.MediaColumns.RELATIVE_PATH | String | 文件目录 |
MediaStore.MediaColumns.DATE_MODIFIED | long | 文件修改时间 |
MediaStore.Files.FileColumns.MIME_TYPE | String | 媒体类型 |
Listing 3: 新建文件
String filename = "..."; ContentValues values = new ContentValues(); values.put(MediaStore.MediaColumns.DISPLAY_NAME, filename); values.put(MediaStore.MediaColumns.MIME_TYPE, "application/octet-stream"); values.put(MediaStore.MediaColumns.RELATIVE_PATH, "subdir"); ContentResolver resolver = requireContext().getContentResolver(); Uri uri = resolver.insert(MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL), values); OutputStream outputStream = resolver.openOutputStream(uri);