目录

开发步骤

绑定服务

获取NetworkQoeClient对象。利用getNetworkQoeServiceIntent接口获取intent,并绑定IQoeService服务。若intent获取失败,App无法使用IQoeService服务。错误码及解决方法请参见错误码和HMS Core SDK框架错误码。

如下示例代码里NetworkPredictActivity在网络QoE信息注册回调和应用业务质量反馈业务中,分别替换为NetworkQoeActivity和ReportAppQualityActivity。

// 根据需要添加Android相关类
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hms.common.ApiException;
import com.huawei.hms.wireless.IQoeService;
import com.huawei.hms.wireless.NetworkQoeClient;
import com.huawei.hms.wireless.WirelessClient;
import com.huawei.hms.wireless.WirelessResult;
public class NetworkPredictActivity extends AppCompatActivity {
    private NetworkQoeClient networkQoeClient;
    private IQoeService qoeService;
    private ServiceConnection mSrcConn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 服务连接,绑定IQoeService服务
            qoeService = IQoeService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // 服务断开,qoeService置为null
            qoeService = null; 
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        networkQoeClient = WirelessClient.getNetworkQoeClient(NetworkPredictActivity.this);
        if (networkQoeClient != null) {
            networkQoeClient.getNetworkQoeServiceIntent()
                .addOnSuccessListener(new OnSuccessListener<WirelessResult>() {
                    @Override            
                    public void onSuccess(WirelessResult wirelessResult) {
                        Intent intent = wirelessResult.getIntent();
                        // intent获取失败, App无法使用IQoeService服务
                        if (intent == null) {
                            return; 
                        }
                        NetworkPredictActivity.this.bindService(intent, mSrcConn, Context.BIND_AUTO_CREATE); 
                    }        
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override 
                    public void onFailure(Exception e) {
                        if (e instanceof ApiException) {
                            ApiException ex = (ApiException) e;
                            int errCode = ex.getStatusCode();
                        }            
                    }
                 });
         }
    }
}

使用IQoeService提供的服务

[h2]弱信号预测

  1. 注册弱信号接收广播。

    当应用程序处于前台时,可通过BroadcastReceiver动态注册弱信号预测广播事件,注册后便可以接收到Wireless Kit发出的弱信号预测广播消息。

    // NetworkPredictActivity类和onCreate()函数展示,为了准确描述变量和函数实现的逻辑
    public class NetworkPredictActivity extends AppCompatActivity {
        private static final String NETWORK_PREDICTION_ACTION = "com.huawei.hms.action.ACTION_NETWORK_PREDICTION";
        private BroadcastReceiver receiver;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            startListener();
        }
    
        private void startListener() {
            receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    // 如下几个变量值,可以通过EditText显示在用户界面
                    int enteringTime = intent.getIntExtra("enteringTime", 0);
                    int leavingTime = intent.getIntExtra("leavingTime", 0);
                    int type =intent.getIntExtra("type",0);
                }
            };
    
            final IntentFilter filter = new IntentFilter();
            filter.addAction(NETWORK_PREDICTION_ACTION);
            registerReceiver(receiver, filter);
        }
    }
  2. 广播事件处理。

    弱信号预测广播主要包含三个参数:

    • 即将进入弱信号区域的时间enteringTime
    • 即将离开弱信号区域的时间leavingTime
    • 通知标识type
      • 当type为1时:enteringTime表示经过enteringTime时间后,移动终端将进入弱信号区域,应用可以提前进行视频缓存等操作;当enteringTime到时后,再经过leavingTime的时间,移动终端会离开弱信号区域,应用可以恢复正常操作。
      • 当type为0时:取消上次消息的执行且忽略本次消息中的enteringTime和leavingTime。
  3. 去注册弱信号处理广播。
    当应用程序处于后台或退出时,可通过调用unregisterReceiver去注册弱信号预测广播接收。
    // NetworkPredictActivity类和onDestroy()函数展示,为了准确描述变量和函数实现的逻辑
    public class NetworkPredictActivity extends AppCompatActivity {
        @Override
        protected void onDestroy() {
            unregisterReceiver(receiver);
            super.onDestroy();
        }
    }

[h2]网络QoE信息注册回调

  1. 注册网络QoE信息回调,callBack里包含对网络QoE关键数据解析。
    // 根据需要添加Android相关类
    import com.huawei.hmf.tasks.OnFailureListener;
    import com.huawei.hmf.tasks.OnSuccessListener;
    import com.huawei.hms.common.ApiException;
    import com.huawei.hms.wireless.IQoeCallBack;
    import com.huawei.hms.wireless.IQoeService;
    import com.huawei.hms.wireless.NetworkQoeClient;
    import com.huawei.hms.wireless.WirelessClient;
    import com.huawei.hms.wireless.WirelessResult;
    public class NetworkQoeActivity extends AppCompatActivity {
        private int[] channelIndex = new int[4];
        private int[] uLRtt = new int[4];
        private int[] dLRtt = new int[4];
        private int[] uLBandwidth = new int[4];
        private int[] dLBandwidth = new int[4];
        private int[] uLRate = new int[4];
        private int[] dLRate = new int[4];
        private int[] netQoeLevel = new int[4];
        private int[] uLPkgLossRate = new int[4];
        private IQoeService qoeService;
        private IQoeCallBack callBack = new IQoeCallBack.Stub() {
            @Override
            public void callBack(int type, Bundle qoeInfo) throws RemoteException {
                if (qoeInfo == null || type != 0) {
                    return;
                }
    
                int channelNum = 0;
                if (qoeInfo.containsKey("channelNum")) {
                    channelNum = qoeInfo.getInt("channelNum");
                }
    
                String channelQoe = String.valueOf(channelNum);
                for (int i = 0; i < channelNum; i++) {
                    uLRtt[i] = qoeInfo.getInt("uLRtt" + i);
                    dLRtt[i] = qoeInfo.getInt("dLRtt" + i);
                    uLBandwidth[i] = qoeInfo.getInt("uLBandwidth" + i);
                    dLBandwidth[i] = qoeInfo.getInt("dLBandwidth" + i);
                    uLRate[i] = qoeInfo.getInt("uLRate" + i);
                    dLRate[i] = qoeInfo.getInt("dLRate" + i);
                    netQoeLevel[i] = qoeInfo.getInt("netQoeLevel" + i);
                    uLPkgLossRate[i] = qoeInfo.getInt("uLPkgLossRate" + i);
                    channelIndex[i] = qoeInfo.getInt("channelIndex" + i);
                    // channelQoe可以通过EditText显示在用户界面
                    channelQoe += "," + channelIndex[i] + "," + uLRtt[i] + "," + dLRtt[i] + "," + uLBandwidth[i] + "," 
                        + dLBandwidth[i] + "," + uLRate[i] + "," + dLRate[i] + "," + netQoeLevel[i] + ","
                        + uLPkgLossRate[i];
                }
      
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (qoeService != null) {
                try {
                    int ret = qoeService.registerNetQoeCallBack("com.huawei.hms.wirelessdemo",callBack);
                } catch (RemoteException ex) {
                    // 这里可以添加打印
                }
            }
        }
    }
  2. 去注册网络QoE信息回调,callBack需要和注册时一致。去注册后,App的callBack流程不再执行。
    public class NetworkQoeActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            int ret = 0;
            if (qoeService != null) {
                try {
                    ret = qoeService.unRegisterNetQoeCallBack("com.huawei.hms.wirelessdemo", callBack);
                } catch (RemoteException ex) {
                    // 这里可以添加打印
                }
            }
        }
    }
  3. 获取实时QoE信息。
    public class NetworkQoeActivity extends AppCompatActivity {
        private int[] channelIndex = new int[4];
        private int[] uLRtt = new int[4];
        private int[] dLRtt = new int[4];
        private int[] uLBandwidth = new int[4];
        private int[] dLBandwidth = new int[4];
        private int[] uLRate = new int[4];
        private int[] dLRate = new int[4];
        private int[] netQoeLevel = new int[4];
        private int[] uLPkgLossRate = new int[4];
        private IQoeService qoeService;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (qoeService != null) {
                try {
                    Bundle qoeInfo = qoeService.queryRealTimeQoe("com.huawei.hms.wirelessdemo"); 
                    if (qoeInfo == null) {
                        return;
                    }
    
                    int channelNum = qoeInfo.getInt("channelNum");
                    for (int i = 0; i < channelNum; i++) {
                        uLRtt[i] = qoeInfo.getInt("uLRtt" + i);
                        dLRtt[i] = qoeInfo.getInt("dLRtt" + i);
                        uLBandwidth[i] = qoeInfo.getInt("uLBandwidth" + i);
                        dLBandwidth[i] = qoeInfo.getInt("dLBandwidth" + i);
                        uLRate[i] = qoeInfo.getInt("uLRate" + i);
                        dLRate[i] = qoeInfo.getInt("dLRate" + i);
                        netQoeLevel[i] = qoeInfo.getInt("netQoeLevel" + i);
                        uLPkgLossRate[i] = qoeInfo.getInt("uLPkgLossRate" + i);
                    }
                } catch (RemoteException ex) {
                    // 这里可以添加打印
                }
            }
        }
    }

[h2]应用业务质量反馈

应用在遇到播放卡顿、网络异常和视频上传慢等问题时,可以将异常信息反馈给Wireless Kit;或者播放体验的统计信息反馈给Wireless Kit。各Key值含义,请参见reportAppQuality。

// 根据需要添加Android相关类
import com.huawei.hmf.tasks.OnFailureListener;
import com.huawei.hmf.tasks.OnSuccessListener;
import com.huawei.hms.common.ApiException;
import com.huawei.hms.wireless.IQoeService;
import com.huawei.hms.wireless.NetworkQoeClient;
import com.huawei.hms.wireless.WirelessClient;
import com.huawei.hms.wireless.WirelessResult;
public class ReportAppQualityActivity extends AppCompatActivity {
    private IQoeService qoeService;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Bundle data = new Bundle();
        data.putInt("eventId", 1);
        data.putString("netReason", "2");
        data.putString("pkgName", "com.huawei.hms.wirelessdemo");
        data.putInt("direction", 1);
        data.putString("version", "5.0.1.300");
        long currentTime = System.currentTimeMillis();
        String timeNow = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(currentTime);
        data.putString("errorTime", timeNow);
        if (qoeService != null) {
            try {
                int ret = qoeService.reportAppQuality(data);
            } catch (RemoteException ex) {
                // 这里可以添加打印
            }
        }
    }
}

解绑服务

使用Android服务机制,App解绑IQoeService。

如下示例代码里NetworkPredictActivity在网络QoE信息注册回调和应用业务质量反馈业务中,分别替换为NetworkQoeActivity和ReportAppQualityActivity。

//mSrvConn要与绑定时的ServiceConnection对象保持一致。在onCreate函数或者onDestroy函数中调用。
NetworkPredictActivity.this.unbindService(mSrcConn);