最近在做彩信数据库的添加,国内找了好久,没有一个现成的代码,翻墙出去了之后,下了一部分发送图片的代码,自己整理了之后添加了音频和视频,还有文字,特地整理了一下,充分发挥程序员共享的精神!

不过代码结构还是有点乱,大家凑合着看看哈!

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

public class MmsDatabase {
private static final String TAG = "MmsDatabase";

public static final int MESSAGE_TYPE_ALL = 0;
public static final int MESSAGE_TYPE_INBOX = 1;
public static final int MESSAGE_TYPE_SENT = 2;
public static final int MESSAGE_TYPE_DRAFT = 3;
public static final int MESSAGE_TYPE_OUTBOX = 4;
public static final int MESSAGE_TYPE_FAILED = 5;
public static final int MESSAGE_TYPE_QUEUED = 6;

public static final int ATTACH_TYPE_JPG = 0;
public static final int ATTACH_TYPE_AUDIO = 1;
public static final int ATTACH_TYPE_VEDIO = 2;

public static void update(Context context, Uri uri, int status) {
ContentValues updateValues = new ContentValues();
context.getContentResolver().update(uri, updateValues, null, null);
}

public static void update(Context context, Uri uri, int status,
String message_id) {
ContentValues updateValues = new ContentValues();
updateValues.put("msg_box", status);
updateValues.put("m_id", message_id);
context.getContentResolver().update(uri, updateValues, null, null);
}

public static void setUnread(Context context, Uri uri) {
ContentValues updateValues = new ContentValues();
updateValues.put("read", 0);
context.getContentResolver().update(uri, updateValues, null, null);
}

/**

* @param context
* @param msg_box
*            此条彩信属于哪个信箱,all为0,inbox为1,sent为2,draft为3,outbox为4,failed为5
* @param to
* @param message_body
*            此条彩信文字内容
* @param imageBytes
* @param read_flag
*            此条彩信是否已读:0-未读,1-已读
* @param attachment
*            彩信选项对应附件列表,0对应图片,1对应音频,3视频,4主题
* @param subject_flag
*            彩信
* @return
*/
public static Uri insert(Context context, int msg_box, String[] to,
String message_body, int read_flag, Map<Integer, Boolean> attachment) {

// 根据不同的勾选结果,给byte赋值
byte[][] imageBytes = new byte[1][1];
byte[][] audioBytes = new byte[1][1];
byte[][] vedioBytes = new byte[1][1];
String sub = "";

AssetManager assetManager = context.getAssets();

try {
// 图片数据
InputStream imageIs = assetManager.open("Image100K.JPG");
byte[] image = MmsDatabase.input2byte(imageIs);
imageBytes[0] = image;

// 音频数据
InputStream audioIs = assetManager.open("Sound100k.amr");
byte[] audio = MmsDatabase.input2byte(audioIs);
audioBytes[0] = audio;

// 视频数据
InputStream vedioIs = assetManager.open("test1.3gp");
byte[] vedio = MmsDatabase.input2byte(vedioIs);
vedioBytes[0] = vedio;

// 主题数据
sub = "this my subject";

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try {
// Get thread id
Set<String> recipients = new HashSet<String>();
recipients.addAll(Arrays.asList(to));
long thread_id = getOrCreateThreadId(context, recipients);
Log.d(TAG, "[DATABASE] Thread ID is " + thread_id);

// Create a new message entry
long now = System.currentTimeMillis();
ContentValues mmsValues = new ContentValues();
mmsValues.put("thread_id", thread_id);
mmsValues.put("date", now / 1000L);
mmsValues.put("msg_box", msg_box);
mmsValues.put("read", read_flag);

// 若主题被勾选,则添加主题内容
if (attachment.get(3)) {
mmsValues.put("sub_cs", 106);
mmsValues.put("sub", sub);
}

mmsValues.put("ct_t", "application/vnd.wap.multipart.related");
mmsValues.put("exp", 604800);
mmsValues.put("m_cls", "personal");
mmsValues.put("m_type", 128); // 132 (RETRIEVE CONF) 130 (NOTIF IND)
// 128 (SEND REQ)
mmsValues.put("v", 18);
mmsValues.put("pri", 129);
mmsValues.put("rr", 129);
mmsValues.put("tr_id", "T" + Long.toHexString(now));
mmsValues.put("d_rpt", 129);
mmsValues.put("resp_st", 128);

// Check if column exists (Fix for Xperia)
Cursor c = context.getContentResolver().query(
Uri.parse("content://mms"), null, null, null, null);
if (c.getColumnIndex("sequence_time") != -1) {
mmsValues.put("sequence_time", now);
}
c.close();

// Insert message
Uri res = context.getContentResolver().insert(
Uri.parse("content://mms"), mmsValues);
String messageId = res.getLastPathSegment().trim();
Log.d(TAG, "[DATABASE] Message saved as " + res);

// 专门针对文本信息的ContentValue
ContentValues textPartValue = new ContentValues();
textPartValue.put("mid", messageId);
textPartValue.put("ct", "text/plain");// 附件为文本
textPartValue.put("text", message_body);
textPartValue.put("name", now + ".txt");
textPartValue.put("cl", now + ".txt");
textPartValue.put("cid", "<" + now + ".txt>");
Uri partUri = Uri.parse("content://mms/" + messageId + "/part");
context.getContentResolver().insert(partUri, textPartValue);

// Create parts
for (int i = 0; i < imageBytes.length; i++) {
if (attachment.get(0)) {
createPart(context, messageId, imageBytes[i],
ATTACH_TYPE_JPG, message_body);
}
if (attachment.get(1)) {
createPart(context, messageId, audioBytes[i],
ATTACH_TYPE_AUDIO, message_body);
}
if (attachment.get(2)) {
createPart(context, messageId, vedioBytes[i],
ATTACH_TYPE_VEDIO, message_body);
}
}

// Create addresses
for (String addr : to) {

createAddr(context, messageId, addr);
}

return res;
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

/**
* 添加图片到彩信

* @param context
* @param id
*            彩信的id
* @param imageBytes
*            图片字节文件
* @param type
*            插入的文件类型,0为图片,1为音频,2为视频
* @return
* @throws Exception
*/
private static Uri createPart(Context context, String id,
byte[] imageBytes, int type, String message_body) throws Exception {
long now = System.currentTimeMillis();

ContentValues mmsPartValue = new ContentValues();
mmsPartValue.put("mid", id);
switch (type) {
case ATTACH_TYPE_JPG:
mmsPartValue.put("ct", "image/jpeg");// 附件为图片
mmsPartValue.put("name", now + ".jpg");// 该PART的名字
mmsPartValue.put("cl", now + ".jpg");// 该PART的文件的位置
mmsPartValue.put("cid", "<" + now + ".jpg>");// 该PART内容的id
break;
case ATTACH_TYPE_AUDIO:
mmsPartValue.put("ct", "audio/arm");// 附件为图片
mmsPartValue.put("name", now + ".arm");
mmsPartValue.put("cl", now + ".arm");
mmsPartValue.put("cid", "<" + now + ".arm>");
break;
case ATTACH_TYPE_VEDIO:
mmsPartValue.put("ct", "video/3gpp");// 附件为视频
mmsPartValue.put("name", now + ".3gp");
mmsPartValue.put("cl", now + ".3gp");
mmsPartValue.put("cid", "<" + now + ".3gp>");
break;

default:

break;
}

Uri partUri = Uri.parse("content://mms/" + id + "/part");
Uri res = context.getContentResolver().insert(partUri, mmsPartValue);

Log.d(TAG, "[DATABASE] Part uri is " + res.toString());

// Add data to part
OutputStream os = context.getContentResolver().openOutputStream(res);
ByteArrayInputStream is = new ByteArrayInputStream(imageBytes);
byte[] buffer = new byte[256];
for (int len = 0; (len = is.read(buffer)) != -1;) {
os.write(buffer, 0, len);
}
os.close();
is.close();

return res;
}

private static Uri createAddr(Context context, String id, String addr)
throws Exception {
ContentValues addrValues = new ContentValues();
addrValues.put("address", addr);
addrValues.put("charset", "106");
addrValues.put("type", 151); // TO
Uri addrUri = Uri.parse("content://mms/" + id + "/addr");
Uri res = context.getContentResolver().insert(addrUri, addrValues);
Log.d(TAG, "[DATABASE] Addr uri is " + res.toString());

return res;
}

/**
* 151 * This is a single-recipient version of 152 * getOrCreateThreadId.
* It's convenient for use with SMS 153 * messages. 154
*/
public static long getOrCreateThreadId(Context context, String recipient) {
Set<String> recipients = new HashSet<String>();
recipients.add(recipient);
return getOrCreateThreadId(context, recipients);
}

/**
* 163 * Given the recipients list and subject of an unsaved message, 164 *
* return its thread ID. If the message starts a new thread, 165 * allocate
* a new thread ID. Otherwise, use the appropriate 166 * existing thread ID.
* 167 * 168 * Find the thread ID of the same set of recipients (in 169 *
* any order, without any additions). If one 170 * is found, return it.
* Otherwise, return a unique thread ID. 171
*/
public static long getOrCreateThreadId(Context context,
Set<String> recipients) {
Uri.Builder uriBuilder = Uri.parse("content://mms-sms/threadID")
.buildUpon();

for (String recipient : recipients) {
uriBuilder.appendQueryParameter("recipient", recipient);
}

Uri uri = uriBuilder.build();
Cursor cursor = context.getContentResolver().query(uri,
new String[] { "_id" }, null, null, null);
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
return cursor.getLong(0);
} else {
Log.e(TAG, "getOrCreateThreadId returned no rows!");
}
} finally {
cursor.close();
}
}
return -1;
}

/**
* 将流转换成byte[]

* @param inStream
* @return
* @throws IOException
*/
public static final byte[] input2byte(InputStream inStream)
throws IOException {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in2b = swapStream.toByteArray();
return in2b;
}
}

Android对彩信数据库添加彩信(图片,音频,视频,文字)相关推荐

  1. mysql存储音频视频文件_如何在mysql 或者 其他的数据库中存放图片 音频 视频

    root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信图片_20190711095019.jpg "$i".jp ...

  2. 图片/音频/视频/文字相关软件

    图像方面 图片方面的软件,分类 一是图片查看器, 二是图片管理器, 三是图片编辑器, 四是图片截图工具 1.格式工厂 2.画图 3.PS 4.iconlover 5.FastStone Image V ...

  3. Android之获取手机上的图片和视频缩略图thumbnails

    2019独角兽企业重金招聘Python工程师标准>>> [0]大家都知道Android从1.5开始刚插入SD卡时系统会调用MediaScanner服务进行后台扫描,索引新的歌曲.图片 ...

  4. Android之靠谱的把图片和视频插入手机系统相册

    1 需求 把图片和视频插入手机系统相册,网上查了下基本上很乱,没几个靠谱的. 2 结果爆照 3 思路 图片插入系统相册(可以直接插入系统相册,但是我这里多做了一步就是先把图片拷贝到了一个目录再插入系统 ...

  5. android 查询所有图片和视频,Android系统详解之获取图片和视频的缩略图

    从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位置,可以帮助我们从mediaprovi ...

  6. android edittext设置内容为空,Android中给数据库添加EditText中内容,添加后数据为空的情况...

    搞了两天的代码,将EditText中内容添加至数据库,怎么都搞不定,总是插入数据为空: 这里需要将获取EditText内容的代码写在onClick函数中. 举例如下: EditText代码如下: an ...

  7. Android 实现openGL录像添加静态图片水印

    /**  * 贴纸滤镜  */ public class WaterFilter extends AbstractFrameFilter {     private static final Stri ...

  8. day10 多媒体(文字 图片 音频 视频)

    1计算机表示图形的几种方式 bmp:以高质量保存     用于计算机 jpg:以良好的质量保存    用于计算机或者网络 png:以高质量保存 图片大小的计算公式:图片的总像素*每个像素的大小     ...

  9. CTF-MISC文件隐写总结(图片,音频,视频,压缩包等文件)

    前置知识 file 命令根据文件头,识别文件类型,如果文件头前边有数据就识别不出来了 strings 输出文件中的可打印字符 可以发现一些提示信息或者特殊编码的信息 可以配合-o参数获取所有的ASCI ...

最新文章

  1. 大神程序员几行代码增粉 100W 最后入狱,附源码。
  2. wordpress网站后台打开速度很卡很慢解决方法?
  3. LInux查看文件内容
  4. 乔布斯亲笔签名的Apple II手册 拍卖了511万元
  5. python学习-列表的操作(常用函数均会介绍)
  6. 魔方微店商城系统 v1
  7. 华为畅享8的悬浮窗在哪里_1299元起,更大超清屏幕+强劲续航 华为畅享20 SE发布...
  8. finally引起的异常丢失问题
  9. 网站运营模式之行业网站分析
  10. 阿里灵杰问天引擎电商搜索 -- 数据说明
  11. 全球首个用户分享区块链+AI大数据体系,专业跨境医疗机构“海医通”发布XMC“海医链”
  12. Android CoordinatorLayout之自定义Behavior
  13. 关于中文分词的一元分词讨论
  14. ShortcutManager桌面app图标长按快捷入口
  15. Win10 22H2更新时间 Win10 22H2怎么更新
  16. java合并单元格边框不完整,java poi 合并单元格后边框问题
  17. vmware安装ubuntu Intel VT-x 处于禁用状态
  18. 为战而生的联想拯救者Pro,你值得拥有的手游神器
  19. Citrix联机插件配置管理器:找不到满足所有锁定要求的值
  20. 史上最强大的procreate笔刷,调色卡,字体分享站点大推荐

热门文章

  1. R中的Kolmogorov-Smirnov检验(带示例)
  2. python zipfile模块分卷_python zipfile模块用法详解
  3. iconfont的用法
  4. Fiddler IOS 抓包配置步骤
  5. 计算机管理任务计划程序损坏,win7旗舰版的任务计划程序崩溃了,怎么处理?
  6. 黄金分析师职级如何评定?初级、高级如何划分?
  7. mac 安装cnpm
  8. JVM内存区域划分Eden Space\Survivor Space\Tenured Gen\Perm Gen
  9. 【100%通过率】华为OD机试真题 JavaScript 实现【字符串解密】【2023 Q1 | 100分】
  10. html网页制作期末大作业成品_新疆旅游网页设计作品_dreamweaver作业静态HTML网页设计模板_新疆旅游景点网页作业制作