android棒棒糖wifi和3g同时活跃

时间:2015-07-30 14:17:54

标签: android wifi 3g

我正在开发一个必须从本地wifi网络中获取udp数据包并通过3g将它们发送到服务器的应用程序。我有一个难以解决的Android 4.4解决方案。但是对于5.0和更新的我找不到解决方案。

这是4.4的解决方案。它经常掉落,所以它也需要修复。

  public static boolean forceMobileConnectionForAddress(Context context, String address) {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (null == connectivityManager) {
        Log.d(TAG_LOG, "ConnectivityManager is null, cannot try to force a mobile connection");
        return false;
    }

    //check if mobile connection is available and connected
    State state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
    //Log.d(TAG_LOG, "TYPE_MOBILE_HIPRI network state: " + state);
    if (0 == state.compareTo(State.CONNECTED) || 0 == state.compareTo(State.CONNECTING)) {
        return true;
    }

    //activate mobile connection in addition to other connection already activated
    int resultInt = connectivityManager.startUsingNetworkFeature(ConnectivityManager.TYPE_MOBILE, "enableWIFI");
    //Log.d(TAG_LOG, "startUsingNetworkFeature for enableHIPRI result: " + resultInt);

    //-1 means errors
    // 0 means already enabled
    // 1 means enabled
    // other values can be returned, because this method is vendor specific
    if (-1 == resultInt) {
        Log.e(TAG_LOG, "Wrong result of startUsingNetworkFeature, maybe problems");
        return false;
    }
    if (0 == resultInt) {
        Log.d(TAG_LOG, "No need to perform additional network settings");
        return true;
    }

    //find the host name to route
    String hostName = extractAddressFromUrl(address);
    //Log.d(TAG_LOG, "Source address: " + address);
    //Log.d(TAG_LOG, "Destination host address to route: " + hostName);
    if (TextUtils.isEmpty(hostName)) hostName = address;

    //create a route for the specified address
    int hostAddress = lookupHost(hostName);
    if (-1 == hostAddress) {
        Log.e(TAG_LOG, "Wrong host address transformation, result was -1");
        return false;
    }
    //wait some time needed to connection manager for waking up
    try {
        for (int counter=0; counter<30; counter++) {
            State checkState = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
            if (0 == checkState.compareTo(State.CONNECTED))
                break;
            Thread.sleep(1000);
        }
    } catch (InterruptedException e) {
        //nothing to do
    }
    boolean resultBool = connectivityManager.requestRouteToHost(ConnectivityManager.TYPE_MOBILE_HIPRI, hostAddress);
    //Log.d(TAG_LOG, "requestRouteToHost result: " + resultBool);
    if (!resultBool)
        Log.e(TAG_LOG, "Wrong requestRouteToHost result: expected true, but was false");

    state = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE_HIPRI).getState();
    //Log.d(TAG_LOG, "TYPE_MOBILE_HIPRI network state after routing: " + state);

    return resultBool;
}

1 个答案:

答案 0 :(得分:0)

以下是我一直在使用的代码,该代码使用ConnectivityManager的requestNetwork()代替startUsingNetworkFeature()requestRouteToHost()

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder req = new NetworkRequest.Builder();
req.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
req.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);

cm.requestNetwork(req.build(), new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(Network network) {
    network.openConnection(new URL(someUrlAddress));
    // do other stuff here
  }
});