【问题标题】:android lollipop wifi and 3g active at same timeandroid棒棒糖wifi和3g同时激活
【发布时间】:2015-07-30 14:17:54
【问题描述】:

我正在开发一个应用程序,该应用程序必须从本地 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;
}

【问题讨论】:

    标签: android wifi 3g


    【解决方案1】:

    这是我一直在使用的代码,它使用 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
      }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多