相关疑难解决方法(0)

Android 10 / API 29:如何将手机连接到配置的网络?

我正在开发一个应用程序,用户必须在其中执行以下步骤:

  1. 将手机连接到wifi;
  2. 将手机从连接的对象连接到专用热点。

当用户连接到所连接对象的专用热点时,应用程序会执行一些 HTTP 请求以对其进行配置。然后,我想将应用程序自动重新连接到步骤 1 的全局 wifi。

从 API 21 到 API 28,此功能非常容易实现,因为我知道 SSID,我也想重新连接手机。它可以通过几行代码完成:

private fun changeCurrentWifiNetworkLegacy(ssidToConnect: String) {
    val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager

    var ssidIdentifier: Int? = null

    wifiManager.configuredNetworks?.forEach { config ->
        Log.d("SSID", config.SSID)

        if (config.SSID == "\"${ssidToConnect}\"") {
            ssidIdentifier = config.networkId
        }
    }

    ssidIdentifier?.let { id ->
        wifiManager.enableNetwork(id, true)
    }
}
Run Code Online (Sandbox Code Playgroud)

在 API 29 上,根据这篇文章,这个简单的代码不再起作用:https : //developer.android.com/about/versions/10/privacy/changes#configure-wifi

根据文章,现在,我应该使用 2 个类:WifiNetworkSpecifier和/或WifiNetworkSuggestion.

不幸的是,我找不到使用这些类的工作示例来将用户连接到以前配置的 SSID。

有人已经做到了吗?

预先感谢您的帮助。

android android-wifi android-connectivitymanager

15
推荐指数
2
解决办法
8329
查看次数

Android Q,WifiNetworkSpecifier 在建立连接后立即失去 Wifi

  @RequiresApi(api = Build.VERSION_CODES.Q)
public void openSystemDialogToConnectToWifi(String ssid, ConnectivityManager.NetworkCallback callback) {
    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
    builder.setSsid(ssid);
    builder.setWpa2Passphrase("secret");


    WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();

    NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder();
    networkRequestBuilder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
    networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
    networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED);
    networkRequestBuilder.setNetworkSpecifier(wifiNetworkSpecifier);

    NetworkRequest networkRequest = networkRequestBuilder.build();
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    cm.requestNetwork(networkRequest, callback);
}
Run Code Online (Sandbox Code Playgroud)

这是我用来从我的应用程序连接到新 Wifi 的代码。我得到了一个 IP 地址,wifi 符号在状态栏中非常短暂地可见。下一刻,Wifi-Symbol 消失,系统对话框再次可见,连接到 wifi。

当我调试回调时,它会按照以下顺序执行方法:

  1. 可用
  2. onCapabilitiesChanged
  3. onBlockedStatusChanged(阻止:false)
  4. onCapabilitiesChanged
  5. 失联

所有方法什么都不做(只需调用 super.method())

硬件:一加 6 与 Android Q

android android-10.0

10
推荐指数
1
解决办法
1316
查看次数

Android Instrumentation测试脱机案例

对于我的仪器测试我正在使用Robotium.大多数情况下,除了离线情况,我能够测试一切.

只要我禁用数据(使用adb,模拟器中的F8快捷键等等),测试就会断开连接.它继续在设备/模拟器中,但没有报告结果.

所以,我有一个想法,只将应用程序放在离线模式而不是整个设备.问题是我不知道怎么样......

使用iptablesApi我需要root我的设备.我已经读过,Mobiwol应用程序使用某种VPN来限制应用程序的互联网访问,而无需生根设备.

问题Mobiwol应用程序 如何阻止每个应用程序的互联网连接?或者还有其他方法可以离线测试apks吗?

编辑12/30/2014

我忘了说我可以脱机运行测试,但是当设备处于脱机状态时我必须开始测试.目前,我将测试分为OFFLINE和ONLINE.运行ONLINEs后,我执行着名的adb kill-serveradb start-server.之后我执行OFFLINEs.

android android-testing

8
推荐指数
3
解决办法
3384
查看次数

建立连接后,通过 WifiNetworkSpecifier 的 Android Q Wifi 连接立即断开连接

我目前正在尝试连接到 wifi 网络。我使用了下面的代码。

        WifiNetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
                .setSsid(ssid)
                .setBssid(MacAddress.fromString(bssid))
                .setWpa2Passphrase(password)
                .build();

        NetworkRequest request = new NetworkRequest.Builder()
                .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                .setNetworkSpecifier(specifier)
                .build();

        ConnectivityManager manager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

        manager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {

            @Override
            public void onAvailable(@NonNull Network network) {
                ConnectivityManager.setProcessDefaultNetwork(network);
                super.onAvailable(network);
                NetworkInfo info = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (info != null && info.isConnectedOrConnecting()) {
                    if (!emitter.isDisposed()) {
                        emitter.onSuccess(true);
                    }
                } else {
                    if (!emitter.isDisposed()) {
                        emitter.onError(new RuntimeException("OS Disconnected"));
                    }
                }

            }

            @Override
            public void onUnavailable() {
                super.onUnavailable();
                if (!emitter.isDisposed()) {
                    emitter.onError(new RuntimeException("Could not connect Wifi")); …
Run Code Online (Sandbox Code Playgroud)

android wifi android-connectivitymanager android-10.0

6
推荐指数
1
解决办法
1906
查看次数