上篇介绍了彩信的发送,发送后我们介绍彩信入库,直接上代码:
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"));
}