Email 下载音频附件完成后播放不显示名称

来源:互联网 发布:面向对象编程 java 编辑:程序博客网 时间:2024/04/29 10:52

#0001281

【操作步骤】

电子邮件-收件箱-进入邮件查看详情界面-附件-音频附件-下载成功后直接点击播放-弹出播放器开始播放
【预期结果】
播放时应能够显示歌曲名称
【实际结果】

播放时不显示名称信息


原因:当打开邮件时,附件已经下载完成,存在database下的文件夹里,附件相关信息存在了Attachment表里,当点击播放时把缓存文件的Uri传给了音乐播放器,音乐播放器没根据Uri查找获取到_display_name,就显示Uri的最后一段作为名字。

解决方法:在AttachmentProvider里的query方法里给projection增加一个查询项Columns.DISPLAY_NAME。

解决方法原理:

1.Provider原理:

查询附件通过AttachmentProvider,其authorities="com.android.email.attachmentprovider"。当查询这个Provider时如果查询列为null,则查询列定为查询Columns._ID、Columns.DATA、Columns.MIMETYPE,我加了一项Columns.DISPLAY_NAME,接着拆分Uri,得到id,并查询EmailProvider得到mimetype。

接着查询AUTHORITY = "com.android.email.provider"的EmailProvider,查询字段为定义好了的AttachmentColumns.FILENAME、AttachmentColumns.SIZE、AttachmentColumns.CONTENT_URI,uri为EmailContent.CONTENT_URI + "/attachment/"+id。

获取返回结果name、size、contentUri,new一个MatrixCursor对象字段取自projection,给这个对象的列赋查询到的值,返回这个cursor。

2.调用流程:

当点击播放时,调用MessageViewFragmentBase类的onOpenAttachment方法。里面这个Intent的data是会变化的,如果保存了,Uri为"file:",否则为“content:”,变化还没明白。接着音乐播放器的AudioPreview会被调用,返回的cursor中_display_name为音乐名字。