android 发彩信能用彩信发bitmap 吗,该怎么解决

Access denied | www.supmen.com used Cloudflare to restrict access
Please enable cookies.
What happened?
The owner of this website (www.supmen.com) has banned your access based on your browser's signature (c5408-ua98).只需一步,快速开始
只需一步, 快速开始
后使用快捷导航没有帐号?
今日: 45&|主题: 3|排名: 38&
- [阅读权限 30]
Powered byandroid 实现发送彩信功能
最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样: 不使用 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();
pduBody.addPart(partPdu);
sendRequest.setBody(pduBody);
final PduComposer composer = new PduComposer(ctx, sendRequest);
final byte[] bytesToSend = composer.make();
第二步:发送彩信到彩信中心。 构建pdu的代码:
String subject = "测试彩信";
String recipient = "接收彩信的号码";
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);
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() {
public void run() {
HttpConnectInterface.sendMMS(ctx,
bytesToSend);
} catch (IOException e) {
e.printStackTrace();
t.start();
发送pdu到彩信中心的代码:
public static String mmscUrl = "http://mmsc.monternet.com";
public static String mmsProxy = "10.0.0.172";
public static String mmsProt = "80";
private static String HDR_VALUE_ACCEPT_LANGUAGE = "";
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;
client = HttpConnector.buileClient(context);
HttpPost post = new HttpPost(mmscUrl);
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);
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) {
LogUtility.showLog(tag, "!200");
throw new IOException("HTTP error: " + status.getReasonPhrase());
HttpEntity resentity = response.getEntity();
byte[] body = null;
if (resentity != null) {
if (resentity.getContentLength() & 0) {
body = new byte[(int) resentity.getContentLength()];
DataInputStream dis = new DataInputStream(resentity.getContent());
dis.readFully(body);
} finally {
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));
catch (IllegalStateException e) {
LogUtility.showLog(tag, "",e);
} catch (IllegalArgumentException e) {
LogUtility.showLog(tag, "",e);
} catch (SocketException e) {
LogUtility.showLog(tag, "",e);
} catch (Exception e) {
LogUtility.showLog(tag, "",e);
} finally {
if (client != null) {
return new byte[0];
更多详细内容请浏览我的博客 至此,彩信的发送算是完成了。 总结:android的彩信相关操作都是没有api的,包括彩信的读取、发送、存储。这些过程都是需要手动去完成的。想要弄懂这些过程,需要仔细阅读android源码中的mms这个app。还有就是去研究mmssms.db数据库,因为彩信的读取和存储其实都是对mmssms.db这个数据库的操作过程。而且因为这个是共享的数据库,所以只能用ContentProvider这个组件去操作db。 总之,想要研究彩信这块(包括普通短信),你就必须的研究mmssms.db的操作方法,多多了解每个表对应的哪个uri,每个uri能提供什么样的操作,那些字段代表短信的那些属性等。 最后推荐个好用的sqlite查看工具:SQLite Database Browser。
转载:http://www.iteye.com/topic/1112515
没有更多推荐了,博客分类:
http://phenom.iteye.com/blog/1541291
(DOC)Displaying Bitmaps Efficiently
这篇是翻译的,
此次是实践,是关于Android系统的图片解码的实例
摄像头在GalaxyNexus拍一张照片有像素,如果bitmap使用ARGB_8888配置(2.3默认的),加载这张照片到内存需要消耗约19mb内存,(bytes)
19m的内存对模拟器的16m来说,显然太大了,但对于真实的机器 ,还是可以的
至于说Android的图片内存8m,这个不知道是听谁说的,总之我也没有找到标准的答案,有可能是在Android刚出来的时候定义的一个堆大小,我觉得最有可能的是这个值作为图片解码的内存大小,却不是对图片的大小限制的.所以上面的图片是可以解码显示出来的.
先说下情况:
一张440*17514大小的图片,直接在galaxy上解析,然后得到Bitmap,再放到ImageView中显示,一切正常的.说下galaxy的情况:
/system/build.prop中的heapsize=64m
两种方法,一种是argb_8888配置,一种 是rgb_565
实践也表明了,两种图片解码后的效果差不多的,如果不是图像处理,完全可以用rgb_565来处理图片的显示,
显然这张图片解析需要29m左右的内存,&64m.所以我觉得Android的内存限制不是只是图片上,而是整个进程的,当进程占用的内存没有超过这个值,就是正常的,而,解析图片通常是最耗内存的操作.
在ImageView中显示一张,argb_8888,然后再解码一次,29*2+其它的操作,对象内存,勉强&64m了,只能解码一次.
使用rgb_565解码一次15m左右,可以有四次的机会,为什么不是三次呢,29*2&64,但一次解析大图,消耗的其它对象内存也大了.
于是修改了/system/build.prop中的heapsize=48m,重启了,
再运行,argb_8888一次解码正常的.二次崩溃.
使用rgb_565解码,可以两次,三次崩溃.
于是修改了/system/build.prop中的heapsize=24m,重启了,
再运行,argb_8888一次崩溃.
使用rgb_565解码,可以一次,第二次崩溃.
,由此可见,不是一张大的图不可以显示出来,通常一张拍摄的照片像这样的,有这样的分辨率,就有相应的机器对应,所以内存也就大了,不是所谓的8m.
由于只分析了一些实践结果,对系统的代码没有研究,有可能这是不对的,或许
c对解码图片作了一些内存上的限制.
但是可以知道,8m的内存是不对的,即使现在新机器中最烂的也不小于512m的内存,heapsize也&24m,所以对于上面这种大的图片,使用rgb_565解码,是没有问题的.
final int memClass = ((ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
System.out.println("memClass:"+memClass);
可以得到这个值的大小.
最近做的微博程序中大图浏览直接崩溃,内存不足,64m的内存,缓存各种图片64张,图片大小大约是在400*1600,几十张图片加载后就崩溃了.
当然如果没有必要,还是缩放一下较好:
BitmapFactory.Options options = new BitmapFactory.Options();
使用缩放的效果明显要比使用rgb_565解码糟糕的多了.
浏览: 344208 次
来自: 福州
感谢楼主分享,帮大忙了。
你好,我最近也在搞这个,能发个demo吗,邮箱是:624951 ...
http://www.iteye.comhttp://www. ...
好棒!感谢楼主分享
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'CVE-:拒绝服务漏洞可以导致Android信息应用崩溃
本文是翻译文章,文章原作者,文章来源:trendmicro.com
原文地址:
译文仅供参考,具体内容表达以及含义原文为准
投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿
有时我们都会收到一些有趣的表情包GIF,但是,如果这个GIF会导致你的Android信息应用呢?
近期,趋势科技向Google报告了一个拒绝服务漏洞,而这种漏洞正好可以做到这一点,甚至更多。这个漏洞目前已被CVE收录为CVE-,我们通过测试,确定这个漏洞影响最新的Nexus和Pixel设备。这个漏洞允许攻击者非法远程发送一个恶意构造的包含畸形数据的彩信,导致受害者Android信息应用崩溃。即使设备/系统在安全模式下重启或启动,应用程序也无法从崩溃中恢复。
谷歌商店的Android信息应用安装量高达5000万。鉴于它也是许多Nexus和Pixel设备的默认信息应用程序(也就是说,它不能卸载),对使用它的终端用户和企业来说,其影响确实是显而易见的。
例如,企业可以利用Android信息应用与客户进行沟通。用户也可以创建更个性化的信息,与其他应用也不会发生混淆。鉴于这款应用是被定位为跨各种Android平台的无缝信息服务,假设该应用程序无法使用,可能会对Android用户的沟通产生很大的负面影响。此外,该应用程序的无法访问可以作为潜在攻击的催化剂,设备所有者无法看到、删除或控制。例如,这些攻击可能需要接管设备的SMS/MMS功能,或者发送和接收已知使用某些移动威胁的含有恶意软件的短信。
该漏洞涉及许多未处理的Java级空指针异常(NPEs),我们在信息应用程序解析GIF文件的过程中发现了这些异常。攻击者只需要一个电话号码,就可以利用这个缺陷将恶意的GIF文件发送给潜在的受害者。
Android消息使用FrameSequenceDrawable来显示GIF文件。FrameSequence首先构建一个基于GIF文件的位图对象,然后组件使用这个位图来显示GIF。然而,我们看到,acquireAndValidateBitmap函数调用位图中的方法“acquireBitmap”(包含图像文件的像素数据),而不检查它是否有效。
目前,涉及的相关应用程序,可通过Janus平台(htttp://appscan.io)进行查看,搜索相关字符串“FrameSequenceDrawable”可以查看相关应用程序。
当FrameSequence试图从一个畸形的GIF构建位图时,我们看到“acquireBitmap”函数会失败并返回一个空值。因此,如果另一个模块/组件或变量引用这个空对象,则将触发NPE。
忧伤的是,Android操作系统和Android信息应用程序都无法处理这个异常。这会导致信息应用在解析MMS中畸形GIF文件时发生崩溃。
用户可以选择刷机或将其恢复为出厂设置。这会删除恶意GIF文件以及存储在设备中的所有其他文件。用户需要衡量此操作的风险——或者先考虑备份文件——然后刷机或恢复出厂设置机。需要注意的是,卸载并重新安装应用程序无法解决崩溃。
减轻利用此漏洞的攻击的另一种方法是手动禁用Android信息的“自动下载彩信”功能。或者利用另一种方法,使用不受影响的信息应用程序手动删除恶意MMS文件。
移动设备越来越普及,必须采用良好的安全习惯来缓解(如果不能防止)可能利用这种缺陷产生的威胁。在收到未经请求的、可疑的、未知的消息和链接时,要更加谨慎,并定期更新设备的操作系统及其应用程序。
幸运的是,最新版本的Nexus和Pixel设备都有更统一或一致的补丁。然而,其他Android设备的更新仍然是碎片化的,因此用户应该联系他们的设备制造商以获得更新。对于企业/组织来说,IT/系统管理员应该加强补丁管理策略,以帮助提高BYOD设备的安全性。
我们已经向谷歌披露了这一安全问题,他们在号发布的Android安全公告(https://source.android.com/security/bulletin/)中更新了一个补丁,并已经在谷歌商店部署。补丁会捕获未处理的java级异常。谷歌还增加了安全网络日志,以监视任何利用该漏洞的攻击。
Janus移动安全威胁数据平台,感知未知威胁,溯源攻击情报。}

我要回帖

更多关于 android7.0发送彩信 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信