在Android下使用自带Email客户端在发送中文名附件时,不管是在PC机上还是在Android设备上,都会显示为乱码,在网上查了些资料,发现跟发送时传送的文件名参数有关系,那要如何处理呢?
出现该问题是在写邮件头部信息时,文件名是中文字符时没有对其进行编码转换导致。
那么接下来我们修改相应代码来处理:
修改packages/apps/Email/emailcommon/src/com/android/emailcommon/internet/Rfc822Output.java文件,将writeOneAttachment函数中的如下内容:
writeHeader(writer, 'Content-Type', attachment.mMimeType + ';\n name='' + attachment.mFileName + '''); writeHeader(writer, 'Content-Transfer-Encoding', 'base64'); // Most attachments (real files) will send Content-Disposition. The suppression option // is used when sending calendar invites. if ((attachment.mFlags & Attachment.FLAG_ICS_ALTERNATIVE_PART) == 0) { writeHeader(writer, 'Content-Disposition', 'attachment;' + '\n filename='' + attachment.mFileName + '';' + '\n size=' + Long.toString(attachment.mSize)); }
修改为如下内容:
writeHeader(writer, 'Content-Type', attachment.mMimeType + ';\n name='' + MimeUtility.foldAndEncode2(attachment.mFileName,'Content-Type'.length() + 2) + '''); writeHeader(writer, 'Content-Transfer-Encoding', 'base64'); // Most attachments (real files) will send Content-Disposition. The suppression option // is used when sending calendar invites. if ((attachment.mFlags & Attachment.FLAG_ICS_ALTERNATIVE_PART) == 0) { writeHeader(writer, 'Content-Disposition', 'attachment;' + '\n filename='' + MimeUtility.foldAndEncode2(attachment.mFileName,'Content-Disposition'.length()+ 2) + '';' + '\n size=' + Long.toString(attachment.mSize)); }
重新编译源码,再次烧录Android镜像,或者重新安装该APK,或者通过adb push替换掉/system/app/目录下同名文件即可验证了。
再次发送中文名附件的邮件,现在可以在Android的Email客户端的发件箱和电脑的收件箱看到附件名是显示为正确的中文名了。END