【操作步驟】發送彩信,或者接收彩信
【測試結果】無法發送彩信;收到彩信后無法下載內容
【預期結果】能夠正常收發彩信
經過分析我們發現。因為發送彩信須要數據業務打開進行支持,數據業務關閉后,則無法發送彩信,因此我們為了不影響彩信業務,在彩信發送前對數據網絡是否打開進行檢測,假設數據業務設置為關閉狀態,我們則打開數據業務進行彩信的發送。當彩信發送結束后我們在對關閉數據業務,保持數據業務原始的狀態。
依據代碼定位。彩信發送的業務邏輯主要集中在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。有須要的朋友能夠下載看看:點擊打開鏈接