解决:关闭移动数据,接收彩信,不能成功接收下载彩信
2017-04-28 21:19
531 查看
【前置条件】关闭数据业务
【操作步骤】发送彩信,或者接收彩信
【測试结果】无法发送彩信;收到彩信后无法下载内容
【预期结果】能够正常收发彩信
经过分析我们发现。因为发送彩信须要数据业务打开进行支持,数据业务关闭后,则无法发送彩信,因此我们为了不影响彩信业务,在彩信发送前对数据网络是否打开进行检測,假设数据业务设置为关闭状态,我们则打开数据业务进行彩信的发送。当彩信发送结束后我们在对关闭数据业务,保持数据业务原始的状态。
依据代码定位。彩信发送的业务逻辑主要集中在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。有须要的朋友能够下载看看:点击打开链接
【操作步骤】发送彩信,或者接收彩信
【測试结果】无法发送彩信;收到彩信后无法下载内容
【预期结果】能够正常收发彩信
经过分析我们发现。因为发送彩信须要数据业务打开进行支持,数据业务关闭后,则无法发送彩信,因此我们为了不影响彩信业务,在彩信发送前对数据网络是否打开进行检測,假设数据业务设置为关闭状态,我们则打开数据业务进行彩信的发送。当彩信发送结束后我们在对关闭数据业务,保持数据业务原始的状态。
依据代码定位。彩信发送的业务逻辑主要集中在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。有须要的朋友能够下载看看:点击打开链接
相关文章推荐
- 解决:关闭移动数据,接收彩信,不能成功接收下载彩信
- 解决:关闭移动数据,接收彩信,不能成功接收下载彩信
- ubuntu下载软件包下载中断,并弹出“下载额外数据不成功”的通知。解决办法
- Android—Socket中关闭IO流后导致Socket关闭不能再收发数据的解决办法
- 双卡发送和接收彩信的解决方法 mms 主要还是看数据连接的建立
- C# 导入excel数据,解决关闭excel后不能释放资源的问题
- 解决下载下来的flexgrid.js下载下来直接使用数据不能显示的问题
- Linux图形桌面窗口没有标题栏,不能移动,关闭,最小化的解决方法
- 已解决问题:从Excel中读数据到数据库,本地VS运行都成功,网站发布后不能读取数据
- IIS6.0下ISO 、GHO等文件不能下载问题的解决方法
- 成功解决卡巴斯基6莫名其妙自动关闭的问题
- 下载文件关闭窗体之解决方法
- 解决IE在客户端使用ADODB.Stream不能创建对象成功的方法
- [MySQLMigrationTool] 从MSSQL导数据到MySql的错误解决 Network error IOException: Connection Refused [INNODB不能创建][max_allowed_packet][Data too long] 的解决
- windows2003里面不能自动为U盘或移动硬盘等移动存储设备分配盘符的解决办法
- 解决Windows2003不能自动分配移动存储设备及硬盘盘符
- 下载文件关闭窗体之解决方法
- 不能完成下载的原因及解决办法
- [图文]IIS6不能下载未注册的文件解决方法
- 解决SERVER 2003不能上传大附件无法下载超过4M的附件的问题