热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android编程之非调用系统界面实现发送彩信的方法(MMS)

这篇文章主要介绍了Android编程之非调用系统界面实现发送彩信的方法,涉及Android源码中的mms的使用技巧,需要的朋友可以参考下

本文实例讲述了Android非调用系统界面实现发送彩信的方法。分享给大家供大家参考,具体如下:

一、问题:

最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样:

不使用 StartActivity,像发短信那样,调用一个类似于发短信的方法

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneCode, null, text, null, null);

二、解决方法:

由于android上根本就没有提供发送彩信的接口,如果你想发送彩信,对不起,请调用系统彩信app界面,如下:

Intent sendIntent = new Intent(Intent.ACTION_SEND, Uri.parse("mms://"));
sendIntent.setType("image/jpeg");
String url = "file://sdcard//tmpPhoto.jpg";
sendIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(url));
startActivity(Intent.createChooser(sendIntent, "MMS:"));

但是这种方法往往不能满足我们的需求,能不能不调用系统界面,自己实现发送彩信呢?经过几天的努力,终于找到了解决办法。

第一步:先构造出你要发送的彩信内容,即构建一个pdu,需要用到以下几个类,这些类都是从android源码的MMS应用中mms.pdu包中copy出来的。你需要将pdu包中的所有类

都拷贝到你的工程中,然后自己酌情调通。

final SendReq sendRequest = new SendReq();
final PduBody pduBody = new PduBody();
final PduPart part = new PduPart();
//存放附件,每个附件是一个part,如果添加多个附件,就想body中add多个part。
pduBody.addPart(partPdu);
sendRequest.setBody(pduBody);
final PduComposer composer = new PduComposer(ctx, sendRequest);
final byte[] bytesToSend = composer.make();
//将彩信的内容以及主题等信息转化成byte数组,准备通过http协议
//发送到 ”http://mmsc.monternet.com”;

第二步:发送彩信到彩信中心。

构建pdu的代码:

String subject = "测试彩信";
String recipient = "接收彩信的号码";//138xxxxxxx
final SendReq sendRequest = new SendReq();
final EncodedStringValue[] sub = EncodedStringValue.extract(subject);
if (sub != null && sub.length > 0) {
sendRequest.setSubject(sub[0]);
}
final EncodedStringValue[] phOneNumbers= EncodedStringValue.extract(recipient);
if (phoneNumbers != null && phoneNumbers.length > 0) {
sendRequest.addTo(phoneNumbers[0]);
}
final PduBody pduBody = new PduBody();
final PduPart part = new PduPart();
part.setName("sample".getBytes());
part.setContentType("image/png".getBytes());
String furl = "file://mnt/sdcard//1.jpg";
final PduPart partPdu = new PduPart();
partPdu.setCharset(CharacterSets.UTF_8);//UTF_16
partPdu.setName(part.getName());
partPdu.setContentType(part.getContentType());
partPdu.setDataUri(Uri.parse(furl));
pduBody.addPart(partPdu);
sendRequest.setBody(pduBody);
final PduComposer composer = new PduComposer(ctx, sendRequest);
final byte[] bytesToSend = composer.make();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
  try {
    HttpConnectInterface.sendMMS(ctx, bytesToSend);
  //
  } catch (IOException e) {
    e.printStackTrace();
  }
 }
});
t.start();

发送pdu到彩信中心的代码:

public static String mmscUrl = "http://mmsc.monternet.com";
// public static String mmscUrl = "http://www.baidu.com/";
public static String mmsProxy = "10.0.0.172";
public static String mmsProt = "80";
private static String HDR_VALUE_ACCEPT_LANGUAGE = "";
// Definition for necessary HTTP headers.
private static final String HDR_KEY_ACCEPT = "Accept";
private static final String HDR_KEY_ACCEPT_LANGUAGE = "Accept-Language";
private static final String HDR_VALUE_ACCEPT =
"*/*, application/vnd.wap.mms-message, application/vnd.wap.sic";
public static byte[] sendMMS(Context context, byte[] pdu)throws IOException{
HDR_VALUE_ACCEPT_LANGUAGE = getHttpAcceptLanguage();
if (mmscUrl == null) {
  throw new IllegalArgumentException("URL must not be null.");
}
HttpClient client = null;
try {
  // Make sure to use a proxy which supports CONNECT.
  client = HttpConnector.buileClient(context);
  HttpPost post = new HttpPost(mmscUrl);
  //mms PUD START
  ByteArrayEntity entity = new ByteArrayEntity(pdu);
  entity.setContentType("application/vnd.wap.mms-message");
  post.setEntity(entity);
  post.addHeader(HDR_KEY_ACCEPT, HDR_VALUE_ACCEPT);
  post.addHeader(HDR_KEY_ACCEPT_LANGUAGE, HDR_VALUE_ACCEPT_LANGUAGE);
  //mms PUD END
  HttpParams params = client.getParams();
  HttpProtocolParams.setContentCharset(params, "UTF-8");
  HttpResponse respOnse= client.execute(post);
  LogUtility.showLog(tag, "111");
  StatusLine status = response.getStatusLine();
  LogUtility.showLog(tag, "status "+status.getStatusCode());
  if (status.getStatusCode() != 200) { // HTTP 200 is not success.
    LogUtility.showLog(tag, "!200");
    throw new IOException("HTTP error: " + status.getReasonPhrase());
  }
  HttpEntity resentity = response.getEntity();
  byte[] body = null;
  if (resentity != null) {
    try {
      if (resentity.getContentLength() > 0) {
        body = new byte[(int) resentity.getContentLength()];
        DataInputStream dis = new DataInputStream(resentity.getContent());
        try {
          dis.readFully(body);
        } finally {
          try {
            dis.close();
          } catch (IOException e) {
            Log.e(tag, "Error closing input stream: " + e.getMessage());
          }
        }
      }
    } finally {
      if (entity != null) {
        entity.consumeContent();
      }
    }
  }
  LogUtility.showLog(tag, "result:"+new String(body));
  return body;
 } catch (IllegalStateException e) {
  LogUtility.showLog(tag, "",e);
 //      handleHttpConnectionException(e, mmscUrl);
 } catch (IllegalArgumentException e) {
  LogUtility.showLog(tag, "",e);
 //      handleHttpConnectionException(e, mmscUrl);
 } catch (SocketException e) {
  LogUtility.showLog(tag, "",e);
 //      handleHttpConnectionException(e, mmscUrl);
 } catch (Exception e) {
  LogUtility.showLog(tag, "",e);
  //handleHttpConnectionException(e, mmscUrl);
 } finally {
  if (client != null) {
 //        client.;
  }
 }
 return new byte[0];
}

至此,彩信的发送算是完成了。

总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用ContentProvider这个组件去操作db。

总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。

最后推荐个好用的sqlite查看工具:SQLite Database Browser。

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SQL中查询分组后每组行数的统计方法。通过使用count()函数和GROUP BY子句可以统计每组的行数,但是如何统计所有组的行数呢?本文提供了一种实现方法,并给出了相应的SQL查询语句。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了如何在MySQL中将零值替换为先前的非零值的方法,包括使用内联查询和更新查询。同时还提供了选择正确值的方法。 ... [详细]
  • 本文介绍了如何使用Power Design(PD)和SQL Server进行数据库反向工程的方法。通过创建数据源、选择要反向工程的数据表,PD可以生成物理模型,进而生成所需的概念模型。该方法适用于SQL Server数据库,对于其他数据库是否适用尚不确定。详细步骤和操作说明可参考本文内容。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • 本文介绍了使用postman进行接口测试的方法,以测试用户管理模块为例。首先需要下载并安装postman,然后创建基本的请求并填写用户名密码进行登录测试。接下来可以进行用户查询和新增的测试。在新增时,可以进行异常测试,包括用户名超长和输入特殊字符的情况。通过测试发现后台没有对参数长度和特殊字符进行检查和过滤。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
author-avatar
十九世纪末的伦敦_371
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有