解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..

insert Vodafone sim card,open the mms read report,when receive the read report,cann‘t download the message

Test steps:

1.insert Vodafone sim card

2.open the mms read report

3.send the mms successfully

4.when receive the read report

这里的环境须要描写叙述一下:在国内不会出现这个问题,该问题在土耳其測试发现,经过分析主要因国内外网络差异导致。

问题大概意思是在国外发送一条彩信。对方成功接收。发送方測试会接收一条阅读报告。

该阅读报告是以彩信的方式接收。这个时候问题来了。彩信无法自己主动下载,点击下载button也无法完毕下载(这里从界面时的确能够这么理解,分析代码之后才发现彩信数据已经下载成功,仅仅是在解析的时候格式不兼容导致解析发生异常,返回null。

因此经过分析打开NotificationTransaction.java中的log,从log中得到已经下载好的彩信数据,然后在国内用此模拟数据来解决这个问题。

if (retrieveConfData != null) {(这里加入凝视的意思也就是在这里输出log,得到国外模拟数据,然后在国内进行模拟測试)

//if (Log.isLoggable(LogTag.TRANSACTION, Log.DEBUG)) {

Log.v(TAG, "NotificationTransaction: retrieve data=" +

HexDump.dumpHexString(retrieveConfData));//HexDump这个工具类非常重要。假设有时间大家细致阅读一下源代码(能够将16进制字符串和字节数组进行转换)

//}

当然,终于改动解决这个问题的实在解析pdu和持久化保存的PduParser.java类。

case PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF:

if (LOCAL_LOGV) {

Log.v(LOG_TAG, "parse: MESSAGE_TYPE_RETRIEVE_CONF");

}

RetrieveConf retrieveConf =

new RetrieveConf(mHeaders, mBody);

byte[] contentType = retrieveConf.getContentType();

if (null == contentType) {

if (LOCAL_LOGV)

Log.v(LOG_TAG, "contentType is null");

return null;

}

String ctTypeStr = new String(contentType);

if (LOCAL_LOGV)

Log.v(LOG_TAG, "ctTypeStr is l"+ctTypeStr);

if (ctTypeStr.equals(ContentType.MULTIPART_MIXED)

|| ctTypeStr.equals(ContentType.MULTIPART_RELATED)

|| ctTypeStr.equals(ContentType.TEXT_PLAIN)//这里是加入对“text/plain”格式彩信的兼容

|| ctTypeStr.equals(ContentType.MULTIPART_ALTERNATIVE)) {

// The MMS content type must be "application/vnd.wap.multipart.mixed"

// or "application/vnd.wap.multipart.related"

// or "application/vnd.wap.multipart.alternative"

return retrieveConf;

} else if (ctTypeStr.equals(ContentType.MULTIPART_ALTERNATIVE)) {

// "application/vnd.wap.multipart.alternative"

// should take only the first part.

PduPart firstPart = mBody.getPart(0);

mBody.removeAll();

mBody.addPart(0, firstPart);

return retrieveConf;

}

return null;

以下这发现异常的时候忽视异常:

protected static PduBody parseParts(ByteArrayInputStream pduDataStream) {

if (pduDataStream == null) {

if (LOCAL_LOGV)

Log.v(LOG_TAG, "pduDataStream is null");

return null;

}

int count = parseUnsignedInt(pduDataStream); // get the number of parts

PduBody body = new PduBody();

for (int i = 0 ; i < count ; i++) {

int headerLength = parseUnsignedInt(pduDataStream);

int dataLength = parseUnsignedInt(pduDataStream);

PduPart part = new PduPart();

int startPos = pduDataStream.available();

            if (startPos <= 0) {

// Invalid part.

return body;//这里原本是返回null

}

/* parse part‘s content-type */

HashMap<Integer, Object> map = new HashMap<Integer, Object>();

byte[] contentType = parseContentType(pduDataStream, map);

if (null != contentType) {

part.setContentType(contentType);

} else {

if (LOCAL_LOGV)

Log.v(LOG_TAG, "contentType isn‘t null");

part.setContentType((PduContentTypes.contentTypes[0]).getBytes()); //"*/*"

}

/* get name parameter */

byte[] name = (byte[]) map.get(PduPart.P_NAME);

if (null != name) {

part.setName(name);

}

else{

if (LOCAL_LOGV)

Log.v(LOG_TAG, "name isn‘t null");

}

/* get charset parameter */

Integer charset = (Integer) map.get(PduPart.P_CHARSET);

if (null != charset) {

part.setCharset(charset);

}

else{

if (LOCAL_LOGV)

Log.v(LOG_TAG, "charset isn‘t null");

}

/* parse part‘s headers */

int endPos = pduDataStream.available();

int partHeaderLen = headerLength - (startPos - endPos);

if (partHeaderLen > 0) {

if (false == parsePartHeaders(pduDataStream, part, partHeaderLen)) {

// Parse part header faild.

if (LOCAL_LOGV)

Log.v(LOG_TAG, "Parse part header faild.");

                    //return null;

}

} else if (partHeaderLen < 0) {

// Invalid length of content-type.

if (LOCAL_LOGV)

Log.v(LOG_TAG, "Invalid length of content-type.");

                //return null;

}

/* FIXME: check content-id, name, filename and content location,

* if not set anyone of them, generate a default content-location

*/

if ((null == part.getContentLocation())

&& (null == part.getName())

&& (null == part.getFilename())

&& (null == part.getContentId())) {

part.setContentLocation(Long.toOctalString(

System.currentTimeMillis()).getBytes());

}

/* get part‘s data */

if (dataLength > 0) {

byte[] partData = new byte[dataLength];

String partContentType = new String(part.getContentType());

pduDataStream.read(partData, 0, dataLength);

if (partContentType.equalsIgnoreCase(ContentType.MULTIPART_ALTERNATIVE)) {

// parse "multipart/vnd.wap.multipart.alternative".

PduBody childBody = parseParts(new ByteArrayInputStream(partData));

// take the first part of children.

part = childBody.getPart(0);

} else {

// Check Content-Transfer-Encoding.

byte[] partDataEncoding = part.getContentTransferEncoding();

if (null != partDataEncoding) {

String encoding = new String(partDataEncoding);

if (encoding.equalsIgnoreCase(PduPart.P_BASE64)) {

// Decode "base64" into "binary".

partData = Base64.decodeBase64(partData);

} else if (encoding.equalsIgnoreCase(PduPart.P_QUOTED_PRINTABLE)) {

// Decode "quoted-printable" into "binary".

partData = QuotedPrintable.decodeQuotedPrintable(partData);

} else {

// "binary" is the default encoding.

}

}

else{

if (LOCAL_LOGV)

Log.v(LOG_TAG, "partDataEncoding isn‘t null");

}

if (null == partData) {

log("Decode part data error!");

return null;

}

else{

if (LOCAL_LOGV)

Log.v(LOG_TAG, "partData isn‘t null");

}

part.setData(partData);

}

}

if(LOCAL_LOGV)

Log.v(LOG_TAG,"checkPartPosition is "+checkPartPosition(part));

/* add this part to body */

if (THE_FIRST_PART == checkPartPosition(part)) {

/* this is the first part */

body.addPart(0, part);

} else {

/* add the part to the end */

body.addPart(part);

}

}

return body;

}

版权声明:本文博主原创文章,博客,未经同意不得转载。

解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..

时间: 2024-11-05 02:12:10

解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann&#39;t download..的相关文章

解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann&#39;t download..

insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the message Test steps: 1.insert Vodafone sim card 2.open the mms read report 3.send the mms successfully 4.when receive the read report 这里的环境需要描述一下:在国内不会出

在Debian8.3中解决Odoo出现的问题:Unable to find Wkhtmltopdf on this system. The report will be shown in html.

解决Odoo出现的问题:Unable to find Wkhtmltopdf on this system. The report will be shown in html. 下载wkhtmltopdf文件,我下载的是64位版本,根据你的系统来选择是32位还是64位. suod wget http://download.gna.org/wkhtmltopdf/0.12/0.12.3/wkhtmltox-0.12.3_linux-generic-amd64.tar.xz 解压文件下载的文件 ta

android之GMS认证

GMS综述 GMS认证,一般要求我们提供CTS, XTS, Verify三份测试报告,如下图: Bin: 认证的软件 CTS: CTS的测试报告 GTS: XTS的测试报告 ctsVerifierReports: Verify测试报告 CTS: CTS(全称"Compatibility Test Suite",即"兼容性测试包")的认证,这是一组用以测试的.apk程序之类的集合,它能够在官网(http://source.android.com/compatibili

论山寨手机与Android联姻 【8】 自己动手做XP手机

2010年1月20日,ViewSonic在北京发布了一款真正意义的电脑手机VCP08.根据商家的宣传,VCP08之所以能够被称为真正的电脑手机,是因为“该机做到了把真正的WindowsXP操作系统嵌入进手机当中”[1]. Figure 8.1 ViewSonic VCP08's shape and size.Courtesy http://farm5.static.flickr.com/4045/4309204242_024371d466_o.png ViewSonic VCP08电脑手机的平面

Arduino 3g shield using GSM bought from ITead

This is an old arduino 3G module bought half years ago. Its wiki: http://wiki.iteadstudio.com/ITEAD_3G_Shield Its mall: http://imall.itead.cc/itead-3g-shield.html Datasheet for ITEAD 3G Shield http://pan.baidu.com/s/1ntCH4UH Schematic for ITEAD 3G Sh

解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义重复

从图片中我们可以看到,这里在语义上有一定的重复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,不过由于Android4.3在锁屏功能上比起老版本做了很大的改动,而且通过常规方法(Strings.xml中字符串)对该问题的定位会有很大的难度,拿这个界面来说,EMERGENCY CALL并不是Strings中值,而是  <string name="lockscreen_emergency_call">Emergency call</s

Using Android Phone to recover SD card formatted with DD command under linux

1. Formatted a sd card with dd command under linux 2.insert the sd card into an android phone,certainly the card is not find and used.. 3 reset the android phone with format sd card option. 4.the sd card is ok!

10.SIM卡

绑定sim卡 ublic class Setup2Activity extends BaseSetupActivity { private SettingItemView sivSim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_setup2); sivSim = (Setti

解决:Android4.3锁屏界面Emergency calls only - China Unicom与EMERGENCY CALL语义反复

从图片中我们能够看到,这里在语义上有一定的反复,当然这是谷歌的原始设计.这个问题在博客上进行共享从表面上来看着实没有什么太大的意义,只是因为Android4.3在锁屏功能上比起老版本号做了非常大的修改,并且通过常规方法(Strings.xml中字符串)对该问题的定位会有非常大的难度,拿这个界面来说,EMERGENCY CALL并非Strings中值,而是  <string name="lockscreen_emergency_call">Emergency call<