求教 关于发送短信手机重启以及电话本的问题
目前在做一个短信功能的应用
已经到了真机测试阶段
现在面临两个问题
1.有些手机,在发送短信时会莫名重启,并且不是每次都会重启,大概有一半的概率,但短信能发送成功.
发送短信用的是ISMS_SendMsg()接口;
2.有些手机,在读取电话本的时候,只能导入存在手机中的内容,无法读取SIM卡中的内容.
望高手指教,先谢过
[最优解释]
重启有可能是读野指针造成的。可以检查一下内存分配释放有没有什么问题。也有可能是机器上的问题,可以换一台试一下。
[其他解释]
先谢谢bsr2009同学
我现在的情况是 在模拟器上看不出任何指针和内存异常的问题 , 并且OUTPUT WINDOW也没有任何错误的提示. 模拟器上也不会死机.
但是真机上有时,是有时...执行到ISMS_SendMsg()就重启了...
在高通论坛上找到过一个相似的帖子,说是回调没有设置好,但是我目前并没看出来自己的回调有什么问题.
重启的几率大概在30%左右
继续求解 希望各位大侠点拨
[其他解释]
模拟器没有问题,也说明不了什么
重启肯定是发生了某种异常,可能是硬件异常,也可能是软件异常
除了确认的手机外,其他的手机是否也存在相同的问题?
实机环境下,问题不发生和问题发生时,
ISMS_SendMsg出力参数分别返回什么?
时序上有什么差分?
CB中各变量的生命周期?
....
[其他解释]
回楼上
ISMS_SendMsg的返回没有问题
并且虽然重启,但短信能发送成功.
时序用ISHELL_PostEvent处理的
CB.....我也怀疑CB有问题.....但是不知道在哪.....
[其他解释]
有JTAG不,debug一下,
重启时,CB调到了吗?如果调到了,看看执行到哪一步时发生重启?
CB关联的上下文的生命周期没有问题?
举个可能不恰当例子,
比如说app终了前,会进行某个处理,这个处理会调到一个CB,
CB中需要利用app的上下文,
受各种影响,有时这个CB被调用的时机可能有点微妙,
可能在app终了前或者app终了后。
如果app终了后,即上下文都释放掉了,那么CB调用时,问题发生
[其他解释]
现在的情况是单独给一个号码发送短信是没有问题的, 重启只有在群发的时候才会发生.
所以想问一下关于那个回调
是不是每发一条短信 都要重新设置一个回调 发送完成之后CANCLE掉?
还是设置一个回调 等全部发送完毕之后再注销
[其他解释]
void SendSms::StartSend()
{
nSendNow = 0;
nAllToSend=0;
m_nSms = 0;
nCurSend = 0;
n_SmsId=0;
int i ;
for(i = 0 ; i < m_pBase->m_pItemMenu->m_nItemNum ; i++ )
{
if(m_pBase->m_pItemMenu->m_pItemData[i]->nSendFlag == 2 )
{
nAllToSend ++;
}
}
if( m_pBase->m_pToSendSms != NULL)
{
int nTotalLen = WSTRLEN(m_pBase->m_pToSendSms);
if( m_pBase->m_pPhoneInfo->nMaxWord != 0)
{
int a = nTotalLen/m_pBase->m_pPhoneInfo->nMaxWord;
int b = nTotalLen%m_pBase->m_pPhoneInfo->nMaxWord;
m_nSms = (b==0)?a:(a+1);
}
else
m_nSms = 1;
}
nAllToSend = nAllToSend*m_nSms;
//CALLBACK_Init(&m_cb,SendCB,this);
SendAction();
}
void SendSms::SendAction()
{
int k = 0;
boolean bToSend = FALSE;
for(k = 0 ; k < m_pBase->m_pItemMenu->m_nItemNum ; k++)
{
if( m_pBase->m_pItemMenu->m_pItemData[k]->nSendFlag == 2)
{
AECHAR *pwNumber =(AECHAR *)m_pBase->m_pItemMenu->m_pItemData[k]->dwData;
if( pwNumber == NULL)
{
continue;
}
FREEIF(m_pszNumber);
int nLen = WSTRLEN(pwNumber)+1;
m_pszNumber =(char *)MALLOC(nLen);
m_pszNumber = (char *)WSTRTOSTR(pwNumber,m_pszNumber,nLen);
bToSend = TRUE;
break;
}
}
if( !bToSend
[其他解释]
nSendNow >= nAllToSend
[其他解释]
m_nSms == 0)
{
CALLBACK_Cancel(&m_cb);
m_pBase->m_bInSend = FALSE;
return;
}
FREEIF(m_pCurSendSms);
m_pCurSendSms = (AECHAR *)MALLOC(m_pBase->m_pPhoneInfo->nMaxWord *2 +2);
WSTRNCOPYN(m_pCurSendSms,m_pBase->m_pPhoneInfo->nMaxWord+1,
m_pBase->m_pToSendSms + nCurSend*m_pBase->m_pPhoneInfo->nMaxWord,m_pBase->m_pPhoneInfo->nMaxWord);
WebOpt awo[6];
int i = 0 ;
uint32 nReturn=0;
ISHELL_CreateInstance( m_pIShell, AEECLSID_SMSMSG, (void **)&m_pMsg);
awo[i].nId = MSGOPT_TO_DEVICE_SZ ;
awo[i].pVal = (void *)m_pszNumber;
i++;
awo[i].nId = MSGOPT_PAYLOAD_WSZ ;
awo[i].pVal = (void *)m_pCurSendSms;
i++;
awo[i].nId = MSGOPT_PAYLOAD_ENCODING;
awo[i].pVal = (void *)AEE_ENC_UNICODE ;
i++;
awo[i].nId = MSGOPT_MOSMS_ENCODING;
awo[i].pVal = (void *)AEESMS_ENC_UNICODE;
i++;
awo[i].nId = MSGOPT_END;
/* add 'em */
int np;
np=ISMSMSG_AddOpt(m_pMsg, awo);
if(np!=SUCCESS)
{
DBGPRINTF("opt problem");
return;
}
else
{
DBGPRINTF("ready to send sms");
ISMS_SendMsg(m_pISms,m_pMsg, &m_cb, &nReturn); //<---- 就是这里 导致机器重启 单发重启概率很小 回调的问题
}
n_SmsId++;
if( nReturn == 0 )
{
DBGPRINTF("===============ACCESS=========%d",n_SmsId);
if( m_pBase->m_pItemMenu->m_pItemData[k]->nSendFlag == 2 && nCurSend == m_nSms-1)
m_pBase->m_pItemMenu->m_pItemData[k]->nSendFlag = 1;
}
else
{
DBGPRINTF("=============FAIL===========%d",n_SmsId);
m_pBase->m_pItemMenu->m_pItemData[k]->nSendFlag = 0;
}
nCurSend = ++nCurSend%m_nSms;
nSendNow++;
m_pBase->m_bInSend = TRUE;
}
void SendSms::SendCB(SendSms *pSms)
{
RELEASEIF(pSms->m_pMsg);
ISHELL_PostEvent(pSms->m_pIShell,ISHELL_ActiveApplet(pSms->m_pIShell),EVT_SMSSEND_COMMAND,0,0);
CALLBACK_Cancel(&pSms->m_cb);
}