现在的位置: 首页 > 综合 > 正文

彩信包存入数据库(发件箱)

2014年09月05日 ⁄ 综合 ⁄ 共 9940字 ⁄ 字号 评论关闭

上篇介绍了彩信的发送,发送后我们介绍彩信入库,直接上代码:

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"));
   }

有没有人知道其根本原因是什么,或者我可以动态得到数据库的编码方式,再插入数据,望高手指教。。。

抱歉!评论已关闭.