標籤:影響 detail net ret 步驟 blank hone res ons
【前置條件】關閉資料業務
【操作步驟】發送多媒體訊息,或者接收多媒體訊息
【測試結果】無法發送多媒體訊息;收到多媒體訊息後無法下載內容
【預期結果】能夠正常收發多媒體訊息
經過分析我們發現。因為發送多媒體訊息須要資料業務開啟進行支援,資料業務關閉後,則無法發送多媒體訊息,因此我們為了不影響多媒體訊息業務,在多媒體訊息發送前對資料網路是否開啟進行檢測,假設資料業務設定為關閉狀態,我們則開啟資料業務進行多媒體訊息的發送。當多媒體訊息發送結束後我們在對關閉資料業務,保持資料業務原始的狀態。
依據代碼定位。多媒體訊息發送的商務邏輯主要集中在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。有須要的朋友能夠下載看看:點擊開啟連結
解決:關閉移動資料,接收多媒體訊息,不能成功接收下載多媒體訊息