上篇介绍了彩信的发送,发送后我们介绍彩信入库,直接上代码:
public class MmsToDb { private static String mmsContent = null; // 彩信存放路径 private static final String TEXT_CID = "<text_cid>"; private static final String IMAGE_CID = "<img_cid>"; private static final String AUDIO_CID = "<300k_cid>"; private static final String VIDEO_CID = "<300k_cid>"; private static String phoneNumb = null; private static Context mContext = null; public static void saveMmsToDb(Context context, String subject, String number, String mmscontent) { mContext = context; mmsContent = mmscontent; SharedPreferences spf = mContext.getSharedPreferences("userInfo", Context.MODE_PRIVATE); phoneNumb = spf.getString("phoneNum", "1"); List<SmilPar> smilParList = null; // 解析每一帧列表 // 获得smil文件名 String smilFile = FileUtils.getSmilFilesByPath(mmsContent); // 解析出要添加 的资源 File file = new File(mmsContent + "/" + smilFile); // 解析xmil文件返回数据 InputStream istream = null; try { istream = new FileInputStream(file); smilParList = ParseSmil.parseSmilPar(istream); } catch (FileNotFoundException e) { MLog.e("FileNotFoundException", e.toString()); } String[] numbers = number.split(";"); for (int i = 0; i < numbers.length; i++) { insert(Mms.MESSAGE_BOX_SENT, AttachmentType.IMAGE, subject, smilParList, numbers[i]); } } private static void insert(int msgBoxType, AttachmentType type, String subject, List<SmilPar> smilParList, String number) { long threadId = Threads.getOrCreateThreadId(mContext, number); Log.e("", "threadId = " + threadId); String smil_text = null; ContentValues cv_part_1 = null; // 组装一个彩信类 ContentValues cvMain = new ContentValues(); cvMain.put(Mms.THREAD_ID, threadId); cvMain.put(Mms.MESSAGE_BOX, msgBoxType); cvMain.put(Mms.READ, 1); cvMain.put(Mms.DATE, System.currentTimeMillis() / 1000); cvMain.put(Mms.SUBJECT_CHARSET, CharacterSets.UTF_8); try { if (Config.product.equals("samsung")) { cvMain.put(Mms.SUBJECT, subject); } else { // android 系统数据库默认iso8859-1 cvMain.put(Mms.SUBJECT, new String(subject.getBytes("utf-8"), "iso8859-1")); } } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } cvMain.put(Mms.CONTENT_TYPE, "application/vnd.wap.multipart.related"); cvMain.put(Mms.MESSAGE_CLASS, "personal"); cvMain.put(Mms.MESSAGE_TYPE, 132); // Retrive-Conf Mms cvMain.put(Mms.MESSAGE_SIZE, getTotleSize(smilParList) + 512); cvMain.put(Mms.PRIORITY, String.valueOf(129)); cvMain.put(Mms.READ_REPORT, String.valueOf(129)); cvMain.put(Mms.DELIVERY_REPORT, String.valueOf(129)); Random random = new Random(); cvMain.put(Mms.MESSAGE_ID, String.valueOf(random.nextInt(100000))); cvMain.put(Mms.TRANSACTION_ID, String.valueOf(random.nextInt(120000))); long msgId = 0; try { msgId = ContentUris.parseId(mContext.getContentResolver().insert( Mms.CONTENT_URI, cvMain)); } catch (Exception e) { Log.e("", "insert pdu record failed", e); return; } Uri partUri = Uri.parse("content://mms/" + msgId + "/part"); // 获得smil文件名 String smilFile = FileUtils.getSmilFilesByPath(mmsContent); smil_text = read(mmsContent + "/" + smilFile); // smil和彩信类关联 ContentValues cvSmil = createPartRecord(-1, "application/smil", "smil.xml", "<siml>", "smil.xml", null, smil_text); cvSmil.put(Part.MSG_ID, msgId); // 把数据插入数据库 mContext.getContentResolver().insert(partUri, cvSmil); String path = null; for (int i = 0; i < smilParList.size(); i++) { // 添加图片资源 for (int j = 0; j < smilParList.get(i).getSmilBtm().size(); j++) { path = smilParList.get(i).getSmilBtm().get(j); cv_part_1 = createPartRecord(0, getContentType(path), path, IMAGE_CID.replace("cid", "cid_" + j), mmsContent + "/" + path, null, null); cv_part_1.put(Part.MSG_ID, msgId); mContext.getContentResolver().insert(partUri, cv_part_1); Uri dataUri_1 = mContext.getContentResolver().insert(partUri, cv_part_1); if (!copyData(dataUri_1, mmsContent + "/" + path)) { Log.e("", "write " + mmsContent + "/" + path + " failed"); return; } } // 添加文本资源 for (int j = 0; j < smilParList.get(i).getSmilText().size(); j++) { path = smilParList.get(i).getSmilText().get(j); ContentValues cv_text_1 = createPartRecord(0, "text/plain", path, TEXT_CID.replace("cid", "cid_" + j), mmsContent + "/" + path, null, null); cv_text_1.put(Part.MSG_ID, msgId); cv_text_1.remove(Part.TEXT); cv_text_1.put(Part.TEXT, read(mmsContent + "/" + path)); cv_text_1.put(Part.CHARSET, "106"); // 把数据插入数据库 mContext.getContentResolver().insert(partUri, cv_text_1); } // 添加音频资源 for (int j = 0; j < smilParList.get(i).getSmilAudio().size(); j++) { path = smilParList.get(i).getSmilAudio().get(j); cv_part_1 = createPartRecord(0, getContentType(path), path, AUDIO_CID.replace("cid", "cid_" + j), mmsContent + "/" + path, null, null); cv_part_1.put(Part.MSG_ID, msgId); // 把数据插入数据库 mContext.getContentResolver().insert(partUri, cv_part_1); Uri dataUri_1 = mContext.getContentResolver().insert(partUri, cv_part_1); if (!copyData(dataUri_1, mmsContent + "/" + path)) { Log.e("", "write " + mmsContent + "/" + path + " failed"); return; } } // 添加视频资源 for (int j = 0; j < smilParList.get(i).getSmilVideo().size(); j++) { path = smilParList.get(i).getSmilVideo().get(j); cv_part_1 = createPartRecord(0, getContentType(path), path, VIDEO_CID.replace("cid", "cid_" + j), mmsContent + "/" + path, null, null); cv_part_1.put(Part.MSG_ID, msgId); // 把数据插入数据库 Uri dataUri_1 = mContext.getContentResolver().insert(partUri, cv_part_1); if (!copyData(dataUri_1, mmsContent + "/" + path)) { Log.e("", "write " + mmsContent + "/" + path + " failed"); return; } } } // to address ContentValues cvAddr = new ContentValues(); cvAddr.put(Addr.MSG_ID, msgId); cvAddr.put(Addr.ADDRESS, number); cvAddr.put(Addr.TYPE, "151"); cvAddr.put(Addr.CHARSET, 106); mContext.getContentResolver().insert( Uri.parse("content://mms/" + msgId + "/addr"), cvAddr); // 将数据库彩信信息关联到发件人 cvAddr.clear(); cvAddr.put(Addr.MSG_ID, msgId); cvAddr.put(Addr.ADDRESS, phoneNumb); cvAddr.put(Addr.TYPE, "137"); cvAddr.put(Addr.CHARSET, 106); mContext.getContentResolver().insert( Uri.parse("content://mms/" + msgId + "/addr"), cvAddr); } private static int getTotleSize(List<SmilPar> smilParList) { int totleSize = 0; String path = null; for (int i = 0; i < smilParList.size(); i++) { // 图片资源大小 for (int j = 0; j < smilParList.get(i).getSmilBtm().size(); j++) { path = smilParList.get(i).getSmilBtm().get(j); totleSize += getSize(mmsContent + "/" + path); } // 文本资源大小 for (int j = 0; j < smilParList.get(i).getSmilText().size(); j++) { path = smilParList.get(i).getSmilText().get(j); totleSize += getSize(mmsContent + "/" + path); } // 音频资源大小 for (int j = 0; j < smilParList.get(i).getSmilAudio().size(); j++) { path = smilParList.get(i).getSmilAudio().get(j); totleSize += getSize(mmsContent + "/" + path); } // 视频资源大小 for (int j = 0; j < smilParList.get(i).getSmilVideo().size(); j++) { path = smilParList.get(i).getSmilVideo().get(j); totleSize += getSize(mmsContent + "/" + path); } } return totleSize; } private static int getSize(final String name) { InputStream is = null; int size = 0; try { File file = new File(name); if (!file.exists()) { Toast.makeText(mContext, R.string.mms_pak_error, Toast.LENGTH_LONG).show(); return 0; } is = new FileInputStream(file); byte[] buffer = new byte[1024]; for (int len = 0; (len = is.read(buffer)) != -1;) size += len; return size; } catch (FileNotFoundException e) { Log.e("", "failed to found file?", e); return 0; } catch (IOException e) { Log.e("", "write failed..", e); } finally { try { if (is != null) is.close(); } catch (IOException e) { Log.e("", "close failed..."); } } return 0; } private static String getContentType(String name) { String type = FileUtils.getExtension(name); // 图片类型 if (type.equals("jpg") || type.equals("JPG")) { return ContentType.IMAGE_JPG; } else if (type.equals("jpeg") || type.equals("JPEG")) { return ContentType.IMAGE_JPEG; } else if (type.equals("wbmp") || type.equals("WBMP")) { return ContentType.IMAGE_WBMP; } else if (type.equals("png") || type.equals("PNG")) { return ContentType.IMAGE_PNG; } else if (type.equals("gif") || type.equals("GIF")) { return ContentType.IMAGE_GIF; // 音视频类型 } else if (type.equals("amr") || type.equals("AMR")) { return ContentType.AUDIO_AMR; } else if (type.equals("mid") || type.equals("MID")) { return ContentType.AUDIO_MID; } else if (type.equals("midi") || type.equals("MIDI")) { return ContentType.AUDIO_MIDI; } else if (type.equals("mp3") || type.equals("MP3")) { return ContentType.AUDIO_MP3; } else if (type.equals("ogg") || type.equals("OGG")) { return ContentType.AUDIO_OGG; } else if (type.equals("acc") || type.equals("ACC")) { return ContentType.AUDIO_AAC; } else if (type.equals("MP4") || type.equals("MP4")) { return ContentType.VIDEO_MP4; } else if (type.equals("3gp") || type.equals("3GP")) { return ContentType.VIDEO_3GPP; } else { return ContentType.VIDEO_UNSPECIFIED; } } private static ContentValues createPartRecord(int seq, String ct, String name, String cid, String cl, String data, String text) { ContentValues cv = new ContentValues(8); cv.put(Part.SEQ, seq); cv.put(Part.CONTENT_TYPE, ct); cv.put(Part.NAME, name); cv.put(Part.CONTENT_ID, cid); cv.put(Part.CONTENT_LOCATION, cl); if (data != null) cv.put(Part._DATA, data); if (text != null) cv.put(Part.TEXT, text); return cv; } private static boolean copyData(final Uri dataUri, final String name) { InputStream input = null; OutputStream output = null; try { File file = new File(name); if (!file.exists()) { Toast.makeText(mContext, R.string.mms_pak_error, Toast.LENGTH_LONG).show(); return false; } input = new FileInputStream(file); output = mContext.getContentResolver().openOutputStream(dataUri); byte[] buffer = new byte[1024]; for (int len = 0; (len = input.read(buffer)) != -1;) output.write(buffer, 0, len); } catch (FileNotFoundException e) { Log.e("", "failed to found file?", e); return false; } catch (IOException e) { Log.e("", "write failed..", e); return false; } finally { try { if (input != null) input.close(); if (output != null) output.close(); } catch (IOException e) { Log.e("", "close failed..."); return false; } } return true; } enum AttachmentType { IMAGE, AUDIO, VIDEO; } /** * 读取文件内容 * * @param filename * 文件名称 */ public static String read(String filename) { byte[] data = null; try { byte[] buffer = new byte[1024]; File file = new File(filename); if (!file.exists()) { Toast.makeText(mContext, R.string.mms_pak_error, Toast.LENGTH_LONG).show(); return new String(data); } FileInputStream inStream = new FileInputStream(file); ByteArrayOutputStream outStream = new ByteArrayOutputStream(); int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } data = outStream.toByteArray(); return new String(data, "gbk"); } catch (IOException e) { MLog.i("IOException", e.toString()); } return null; } }
解析smil文件获得彩信数据
smilParList = ParseSmil.parseSmilPar(istream);
利用ContentResolver将彩信数据插入数据库,主要两部,1是创建一条彩信数据,插入彩信表,2是根据彩信id向彩信数据表里插数据。
问题:在此遇到一个问题,在插入彩信主题的时候。因为 android 系统数据库默认iso8859-1但是,三星的手机插入后主题显示乱码,后来我尝试用utf-8插入竟然显示正常,可能是三星的大佬们把系统数据库给改了,在这里我就做了一个硬性的判断
if (Config.product.equals("samsung")) {
cvMain.put(Mms.SUBJECT, subject);
} else {
// android 系统数据库默认iso8859-1
cvMain.put(Mms.SUBJECT, new String(subject.getBytes("utf-8"),
"iso8859-1"));
}
有没有人知道其根本原因是什么,或者我可以动态得到数据库的编码方式,再插入数据,望高手指教。。。