获取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(); } } }); } } }
当应用程序处于前台时,可通过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); } }
// 根据需要添加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) { // 这里可以添加打印 } } } }
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) { // 这里可以添加打印 } } } }
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) { // 这里可以添加打印 } } } }
应用在遇到播放卡顿、网络异常和视频上传慢等问题时,可以将异常信息反馈给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);