当前位置:  开发笔记 > 后端 > 正文

如何使用NetworkRequest.Builder()指定wifi网络.setNetworkSpecifier(string)

如何解决《如何使用NetworkRequest.Builder()指定wifi网络.setNetworkSpecifier(string)》经验,为你挑选了1个好方法。

我正在寻找一种让Android 5.0平板电脑连接到内部网的方法,出于安全考虑,该内部网没有互联网连接.

问题是谷歌自4.4/5.0以来在Android中构建的强制门户保护.对android connectivitycheck进行调用以检查互联网连接,当此呼叫失败时,wifi网络被标记为不工作并避免.很蹩脚.

其他人遇到了同样的问题,有些人建议使用android 5中引入的新API,请参阅: Android 5.0 Lollipop和4.4 KitKat忽略了我的WiFi网络,enableNetwork()无用

关于此的文件非常含糊:

NetworkRequest.Builder.setNetworkSpecifier(String  networkSpecifier)

"对此字符串的解释是特定于承载的,使用它的承载者应记录其详细信息.例如,蓝牙可能使用某种设备ID,而WiFi可能使用ssid和/或bssid.蜂窝可能使用载波spn"

我试过这个并没有用.主要问题是,一旦我使用 setNetworkSpecifier()没有网络被发现.我尝试使用bssid(mac)和ssidAP.

看起来过滤器正在工作,但不清楚它应该如何工作.如果我省略了setNetworkSpecifier()呼叫1网络,但无法确定哪个.至少它显示我的代码有效.

那么如果ssid和bssid不起作用,我应该在这里放什么?

这是我的代码.

 private void connect(String ssid, Context context) {
    Log.i(TAG, "try connect to! " + ssid);
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).
                removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED).
                removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET

                setNetworkSpecifier(ssid). //<--- here is the problem
                build();
        ConnectivityManager.NetworkCallback callback 
             = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onAvailable " + network.toString() + " " + network.getClass().getName());
                }
            }

            @Override
            public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onCapabilitiesChanged " + networkCapabilities.getLinkDownstreamBandwidthKbps());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
                try {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                        Log.i(TAG, "onLinkPropertiesChanged " + linkProperties.getInterfaceName());
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        Log.i(TAG, "requestNetwork ");
        // cm.requestNetwork(nr, callback);
        cm.registerNetworkCallback(nr, callback);
    }
}

EricRobertBr.. 5

我调试了以下代码,这些代码在Android Studio的API 23(6.0.1)的Samsung S5(SM-G900V)上运行。

void inspectNetworks() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        Network[] ns = connectivity.getAllNetworks();
        for (Network n : ns) {
            NetworkCapabilities c = connectivity.getNetworkCapabilities(n);
            Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint
        }
    }
}

我发现Wi-Fi网络根本没有任何网络networkSpecifier

也许networkSpecifierS对于WIFI-transport网络将在未来实施......为了记录在案,我发现,networkSpecifier 设置为1这个特殊的电话上为现有CELLULAR-transport网络。

就目前而言,addCapability在请求Wi-Fi网络时,似乎最好的呼叫方是最佳选择。



1> EricRobertBr..:

我调试了以下代码,这些代码在Android Studio的API 23(6.0.1)的Samsung S5(SM-G900V)上运行。

void inspectNetworks() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        Network[] ns = connectivity.getAllNetworks();
        for (Network n : ns) {
            NetworkCapabilities c = connectivity.getNetworkCapabilities(n);
            Log.i(TAG, "inspectNetworks: network="+n+" capabilities="+c); // <- breakpoint
        }
    }
}

我发现Wi-Fi网络根本没有任何网络networkSpecifier

也许networkSpecifierS对于WIFI-transport网络将在未来实施......为了记录在案,我发现,networkSpecifier 设置为1这个特殊的电话上为现有CELLULAR-transport网络。

就目前而言,addCapability在请求Wi-Fi网络时,似乎最好的呼叫方是最佳选择。

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有