【前置条件】关闭数据业务
【操作步骤】发送彩信,或者接收彩信
【測试结果】无法发送彩信;收到彩信后无法下载内容
【预期结果】能够正常收发彩信
经过分析我们发现。因为发送彩信须要数据业务打开进行支持,数据业务关闭后,则无法发送彩信,因此我们为了不影响彩信业务,在彩信发送前对数据网络是否打开进行检測,假设数据业务设置为关闭状态,我们则打开数据业务进行彩信的发送。当彩信发送结束后我们在对关闭数据业务,保持数据业务原始的状态。
依据代码定位。彩信发送的业务逻辑主要集中在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。有须要的朋友能够下载看看:点击打开链接