解决:关闭移动数据,接收彩信,不能成功接收下载彩信

摘要:
[前提条件]关闭数据服务[操作步骤]发送彩信,因为发送彩信需要打开数据服务以获得支持。在发送彩信之前,请检查数据网络是否已打开。privatepoolenisNetworkAvailable(){NetworkInfoni=mConnMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_MMS);
【前置条件】关闭数据业务
【操作步骤】发送彩信,或者接收彩信
【測试结果】无法发送彩信;收到彩信后无法下载内容

【预期结果】能够正常收发彩信

经过分析我们发现。因为发送彩信须要数据业务打开进行支持,数据业务关闭后,则无法发送彩信,因此我们为了不影响彩信业务,在彩信发送前对数据网络是否打开进行检測,假设数据业务设置为关闭状态,我们则打开数据业务进行彩信的发送。当彩信发送结束后我们在对关闭数据业务,保持数据业务原始的状态。

依据代码定位。彩信发送的业务逻辑主要集中在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。有须要的朋友能够下载看看:点击打开链接

免责声明:文章转载自《解决:关闭移动数据,接收彩信,不能成功接收下载彩信》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇在iOS开发过程中你遇到这个问题了么?活动目录的信任关系下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

QOS-CBQ概述

 QOS-CBQ概述    2018年7月7日    19:56 CBQ(基于类的对列)是一种基于QOS policy实现的拥塞管理技术。 CBQ中包含一个LLQ(低延迟队列),用来支撑EF(快速转发)类业务被绝对优先发送,保证延迟。 CBQ中最大包含64个BQ(带宽保证队列),用来支撑AF(确保转发)类业务,保证每一个队列的带宽及可控的延迟。 CBQ...

PHP大批量更新数据,大批量插入数据,mysql批量更新与插入多种方法

在工作中遇到了需要大批量的更新同步数据,首先用了个笨方法测试,那就是for循环插入与更新。由于数据是从另外一个大型网站的接口中获取的,我本地需要进行处理后,再进行更新与判断,程序执行完成之后,发现耗时太长,仅仅五千条数据就耗时了五个小时左右,非常耗时间。 在进行更新与插入的操作的时候,我们首先必须考虑到文件执行时间的问题。当php文件执行时间过长时,服务器...

WebService客户端调用常见5种方式

之前系统中使用到了webservice进行第三方通信,这里总结一下常见的5种客户端调用方式。 在此之前我们先简单搭建一个webservice服务端项目,发布一个webservice服务。我这里使用springboot快速搭建一个,项目结构如下: 创建一个springboot项目,导入maven依赖: <dependency> <...

vue 之 ESLint学习(格式化操作)

  在vscode 的右下角 有一个eslint 可以控制 在vscode保存时对代码格式化存在的因素: 第一个因素:存在vscode插件的原因 第二个因素: 查看代码是否符合standar规范: https://standardjs.com/rules-zhcn.html 查看具体细则:https://cn.eslint.org/docs/rules/...

Spring Boot @Component注解下的类 @Autowired 为null

Spring Boot @Component注解下的类 @Autowired 为null【原文】 @Component public class ComponentClass { @Autowired private JedisClient jedisClient; public static Co...

从深处去掌握数据校验@Valid的作用(级联校验)

每篇一句 NBA里有两大笑话:一是科比没天赋,二是詹姆斯没技术 相关阅读 【小家Java】深入了解数据校验:Java Bean Validation 2.0(JSR303、JSR349、JSR380)Hibernate-Validation 6.x使用案例【小家Spring】让Controller支持对平铺参数执行数据校验(默认Spring MVC使用@V...