Android最佳实践之获取文件信息

原文链接:Retrieving File Information

本课程教你:

  • 获取文件的MIME类型
  • 获取文件的名字和大小

在一个客户端应用尝试使用content URI读写文件之前,这个应用可以从服务端应用获取关于这个文件的信息,包括文件的数据类型和大小。文件类型帮助客户端应用判断它是否能处理这个文件;文件的大小帮助客户端应用对这个文件设置缓冲和缓存。

本课程展示了如何向服务端应用的 FileProvider 获取它的文件的MIME类型和大小。

获取文件的MIME类型

一个文件的数据类型会指导客户端应用该怎么处理这个文件的内容。为了获取content URI代表的文件的数据类型,客户端应用调用 ContentResolver.getType()。这个方法返回文件的MIME类型。默认情况下,一个 FileProvider 根据这个文件的扩展名决定这个文件的MIME类型。

下面这段代码展示了一个客户端应用如何从服务端应用返回的content URI中获取文件的MIME类型:

...
/*
 * Get the file's content URI from the incoming Intent, then
 * get the file's MIME type
 */
Uri returnUri = returnIntent.getData();
String mimeType = getContentResolver().getType(returnUri);
...

获取文件的名字和大小

FileProvider 类扩展了 [query()](https://developer.android.com/reference/android/support/v4/content/FileProvider.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)) 方法在 Cursor 中默认返回与content URI对应的文件的名字和大小。默认实现方法有两栏:

DISPLAY_NAME
字符串形式的文件名。这个值与通过 File.getName() 返回的值保持一致。

SIZE
文件字节的大小,以long形式返回。这个值与 File.length() 返回的值保持一致。

客户端应用通过在 [query()](https://developer.android.com/reference/android/support/v4/content/FileProvider.html#query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String)) 中设置除了content URI之外的其他值为null,能够获取到文件的 DISPLAY_NAMESIZE。例如,下面这段代码获取了文件的 DISPLAY_NAME
SIZE,然后将它们分别显示在 TextView 中:

...
/*
 * Get the file's content URI from the incoming Intent,
 * then query the server app to get the file's display name
 * and size.
 */
Uri returnUri = returnIntent.getData();
Cursor returnCursor =
        getContentResolver().query(returnUri, null, null, null, null);
/*
 * Get the column indexes of the data in the Cursor,
 * move to the first row in the Cursor, get the data,
 * and display it.
 */
int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);
returnCursor.moveToFirst();
TextView nameView = (TextView) findViewById(R.id.filename_text);
TextView sizeView = (TextView) findViewById(R.id.filesize_text);
nameView.setText(returnCursor.getString(nameIndex));
sizeView.setText(Long.toString(returnCursor.getLong(sizeIndex)));
...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,731评论 19 139
  • API定义规范 本规范设计基于如下使用场景: 请求频率不是非常高:如果产品的使用周期内请求频率非常高,建议使用双通...
    有涯逐无涯阅读 2,954评论 0 6
  • 如以上DEMO截图所示效果,我们对于这种类似的功能肯定不算陌生,因为这可以说是实际开发中一类非常常见的功能需求了。...
    Machivellia阅读 2,651评论 1 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,420评论 25 708
  • 那是2015年夏天的夜晚,我就那么不惊不喜的遇见了你,没有交集,也没有交流,你不认识我,我认识你。从此以后,你只与...
    羞涩和小七阅读 555评论 0 1

友情链接更多精彩内容