【预期结果】可以正常收发彩信
经过分析我们发现,由于发送彩信需要数据业务打开进行支持,数据业务关闭后,则无法发送彩信,因此我们为了不影响彩信业务,在彩信发送前对数据网络是否打开进行检测,如果数据业务设置为关闭状态,我们则打开数据业务进行彩信的发送,当彩信发送结束后我们在对关闭数据业务,保持数据业务原始的状态。
根据代码定位,彩信发送的业务逻辑主要集中在TransactionService类中,因此我们作出以下分析和修改:
private boolean isNetworkAvailable() {
NetworkInfo ni = mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS);
return (ni == null ? false : ni.isAvailable()) && mConnMgr.getMobileDataEnabled();
}
上述代码中我们发现这个方法用来得到当前网络连接的服务和判断当前的网络状态是否可用,由于我们的修改目标为,彩信业务不再受当前数据业务的状态限制,因此我们修改为如果网络连接服务不为空,我们即可进行彩信业务的收发:
private boolean isNetworkAvailable() {
NetworkInfo ni = mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS);
return (ni == null ? false : true;
}
下面这段代码是开始彩信业务的具体函数,红色部分为我们增加的部分,主要逻辑为首先得到当前网络连接设置的状态,并且保存状态(状态保存在MmsConfig类中),然后开始彩信业务的传送:
protected int beginMmsConnectivity() throws IOException {
// Take a wake lock so we don't fall asleep before the message is downloaded.
createWakeLock();
int result = mConnMgr.startUsingNetworkFeature(
ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_MMS);
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE) || DEBUG) {
Log.v(TAG, "beginMmsConnectivity: result=" + result);
}
boolean bMobileDataEnabled = mConnMgr.getMobileDataEnabled();
if (!bMobileDataEnabled ) {
MmsConfig.setDataConnectEnabled(false);
mConnMgr.setMobileDataEnabled(true);
mServiceHandler.sendEmptyMessageDelayed(EVENT_MMS_CONNECTIVITY_TIMEOUT, MMS_AUTO_OPEN_CONNECTIVITY_DELAY);
acquireWakeLock();
return Phone.APN_REQUEST_STARTED;//由于版本问题这里如果找不到Phone这个类,可以试试PhoneConstants这个类
}
switch (result) {
case Phone.APN_ALREADY_ACTIVE:
acquireWakeLock();
return result;
case Phone.APN_REQUEST_STARTED:
acquireWakeLock();
mServiceHandler.sendEmptyMessageDelayed(EVENT_MMS_CONNECTIVITY_TIMEOUT, MMS_CONNECTIVITY_DELAY);
/* Add 20120823 TS-FMC-V2 start */
if (FeatureQuery.FEATURE_CT_FMC_SUPPORT) {
broadcastFmcConnectivity(WifiManager.FMC_MMS_START);
}
/* Add 20120823 TS-FMC-V2 end */
return result;
}
throw new IOException("Cannot establish MMS connectivity");
}
这里补充一行代码:
private static final int MMS_AUTO_OPEN_CONNECTIVITY_DELAY = 1 * 1000;//设置延迟时间为1秒
下面这段代码是结束彩信业务的具体函数,红色部分为我们增加的部分,得到我们开始彩信业务前保存的状态,并恢复我们所保存的状态,并结束彩信业务(红色部分为我们添加的代码):
protected void endMmsConnectivity() {
try {
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE) || DEBUG) {
Log.v(TAG, "endMmsConnectivity");
}
if(mProcessing.isEmpty()){
if (!MmsConfig.getDataConnectEnabled()) {
MmsConfig.setDataConnectEnabled(true);
mConnMgr.setMobileDataEnabled(false);
}
}
// cancel timer for renewal of lease
mServiceHandler.removeMessages(EVENT_CONTINUE_MMS_CONNECTIVITY);
if (mConnMgr != null) {
mConnMgr.stopUsingNetworkFeature(
ConnectivityManager.TYPE_MOBILE,
Phone.FEATURE_ENABLE_MMS);
/* Add 20120823 TS-FMC-V2 start */
if (FeatureQuery.FEATURE_CT_FMC_SUPPORT) {
broadcastFmcConnectivity(WifiManager.FMC_MMS_STOP);
}
/* Add 20120823 TS-FMC-V2 end */
}
} finally {
releaseWakeLock();
}
}
这里我们贴出在MmsConfig类中保存当前数据连接状态(用来恢复数据连接状态)的代码:
private static boolean mDataConnectEnabled =true;
public static boolean getDataConnectEnabled() {
return mDataConnectEnabled;
}
public static void setDataConnectEnabled(boolean bDataEnable) {
mDataConnectEnabled = bDataEnable;
}
本文所修改的两个类分别位于源码中MMS应用下,这里修改后的两个java源码文件已经打包上传至CSDN,有需要的朋友可以下载看看:点击打开链接