android通过代码连接wifi

这篇具有很好参考价值的文章主要介绍了android通过代码连接wifi。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android SDK API 29(对应Android 10)以下,可以在app之中通过代码直接设置wifi名称和密码进行连接。

API 29及其以上版本,增加了动态管理权限功能,弃用了之前的接口,同时app连接wifi时必须通过用户同意,具体方式是弹出一个页面显示要连接的wifi,用户点击连接之后再返回app。

1. API < 29

a. 首先初始化,检查权限,若无则申请权限

//检查wifi权限
if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    //若无则申请
    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
else
{
    //初始化
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
}

 b. 扫描wifi,以供后续操作,若不执行这一步直接连接则会出错:

//扫描并列出wifi,以供后续操作
wifiScanReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        boolean success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false);
        if (success) {
            scanResults = wifiManager.getScanResults();

            for (ScanResult scanResult : scanResults) {
                String SSID = scanResult.SSID;
                String BSSID = scanResult.BSSID;
                String capabilities = scanResult.capabilities;
                int level = scanResult.level;

                Log.d("WIFISCAN", "SSID: " + SSID + ", BSSID: " + BSSID);
            }
        }
    }
};

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(wifiScanReceiver, intentFilter);
wifiManager.startScan();

c. 连接指定wifi,此处为了演示直接填写ssid和密码,实际情况之中可以从上一步的wifi列表之中选取,并由用户输入(api>=29时这一步是可以运行,但无连接wifi的效果):

WifiConfiguration wifiConfiguration = new WifiConfiguration();
//注意,密码和SSID两边必须再加一对双引号!!!
wifiConfiguration.SSID = "\"wifi SSID\"";  
wifiConfiguration.preSharedKey = "\"password\"";

int networkId = wifiManager.addNetwork(wifiConfiguration);
//wifiManager.disconnect();  //断开链接
wifiManager.enableNetwork(networkId, true);
wifiManager.reconnect();
Log.d("ConnectWifi", "reconnect ok!");

2. API < 29的另一个解决方案,使用WifiUtils库:

GitHub - ThanosFisherman/WifiUtils: Easily Connect to WiFi Networks

更加简单,适用于api小于29的android,api>29时无法正常搜索到wifi:

//开启wifi
WifiUtils.withContext(getApplicationContext()).enableWifi();        
//搜索wifi
WifiUtils.withContext(getApplicationContext()).scanWifi(this::getScanResults).start();

处理搜索结果:

private void getScanResults(@NonNull final List<ScanResult> results)
{
    if (results.isEmpty())
    {
        Log.i(TAG, "SCAN RESULTS IT'S EMPTY");
        return;
    }
    Log.i(TAG, "GOT SCAN RESULTS " + results);
}

若不为空,则连接指定wifi:

//连接wifi
WifiUtils.withContext(getApplicationContext())
  .connectWith("wifi SSID", "password")
  .setTimeout(40000)
  .onConnectionResult(new ConnectionSuccessListener() {
      @Override
      public void success() {
          Toast.makeText(MainActivity.this, "SUCCESS!", Toast.LENGTH_SHORT).show();
      }

      @Override
      public void failed(@NonNull ConnectionErrorCode errorCode) {
          Toast.makeText(MainActivity.this, "EPIC FAIL!" + errorCode.toString(), Toast.LENGTH_SHORT).show();
      }
  })
  .start();

 3. API >= 29

API大于29时,弃用了WifiConfiguration这个更加底层可以直接操作的类。但是初始化和搜索wifi列表的代码与API<29的a和b部分代码相同,只是连接wifi的部分做了修改,调用下面代码时,将会出现一个页面显示要连接的wifi,用户点击连接之后再返回app:

WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
  .setSsid("wifi SSID")
  .setWpa2Passphrase("password")
  .build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .setNetworkSpecifier(wifiNetworkSpecifier)
  .build();
ConnectivityManager connectivityManager = (ConnectivityManager)this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback());

将下面代码替换上面最后一句来重写回调函数,以获取更详细的信息:文章来源地址https://www.toymoban.com/news/detail-830166.html

networkCallback = new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(@NonNull Network network) {
      super.onAvailable(network);
      Log.i("ConnectWifi", "onAvailable 切换到指定wifi成功"+network);
      connectivityManager.bindProcessToNetwork(network);
      connectivityManager.getNetworkInfo(network);
      NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
      boolean connected = networkInfo.isConnected();
      boolean available = networkInfo.isAvailable();
      NetworkInfo.DetailedState detailedState = networkInfo.getDetailedState();
      Log.i("ConnectWifi", "onAvailable connected= "+connected);
      Log.i("ConnectWifi", "onAvailable available= "+available);
      Log.i("ConnectWifi", "onAvailable detailedState= "+detailedState);
  }

  @Override
  public void onUnavailable() {
      super.onUnavailable();
      Log.i("ConnectWifi", "onUnavailable 切换到指定wifi失败");
      connectivityManager.unregisterNetworkCallback(networkCallback);
  }
};
connectivityManager.requestNetwork(networkRequest, networkCallback);

到了这里,关于android通过代码连接wifi的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android连接指定wifi

    在Android设备上,我们可以通过代码连接到特定的WiFi网络。这在许多应用中都是非常有用的,例如自动连接到家庭WiFi网络,或者在商家的应用中连接到特定店铺的WiFi网络。 本文将教您如何使用Android代码连接到指定的WiFi网络,并提供示例代码来帮助您实现此功能。 前提条件

    2024年01月16日
    浏览(31)
  • Android 12 Wifi 开发(获取列表、连接、断开连接)

    获取Wifi列表: 扫描(这个方法早在Android 9.0 就被弃用), 不过如果不调用的话是没法及时获取Wifi列表的广播的。 (不需要也能正常获取,没有延迟,经实验毫无区别) 创建广播并接收: 配置并连接( 无系统签名 ): 配置并连接( 有系统签名 ): 断开连接(无系统签名

    2024年02月03日
    浏览(25)
  • Android扫码连接WIFI实现

    0,目标         APP中实现扫WIFI分享码自动连接WIFI功能 1,前提条件         设备需要有个扫码器(摄像头拍照识别也行),APP调用扫码器读取WIFI连接分享码。 2,增加权限         在AndroidManifest.xml中增加权限 3,参数检查         扫码成功后,对内容进行一个

    2024年02月09日
    浏览(24)
  • uni-app通过wifi连接设备并进行命令交互

    前段时间公司让做一个通过手机连接硬件设备上的wifi,实现手机app和硬件设备的数据通讯。当时做的时候查相关资料比较少,担心以后遇到相似需求忘记具体细节,在这写一下记录一下。 一、具体情况 1. 手机连接设备wifi功能没有通过app重新开发,需要手动连接wifi。 2. 采用

    2024年02月12日
    浏览(40)
  • Android11 Wifi开启、扫描和连接

    开启Wifi开关,Wifi开关是 WifiEnabler , WifiEnabler 实现了 SwitchWidgetController.OnSwitchChangeListener 监听,打开/关闭开关会回调至 mWifiManager.setWifiEnabled(isChecked) 用于根据Switch控件的当前状态关闭或打开Wi-Fi。 在 onCheckedChanged 方法的开始部分使用了一个 mStateMachineEvent 变量,当该变量为

    2024年02月07日
    浏览(35)
  • STM32通过esp8266连接WiFi接入MQTT服务器

    上文我们讲到如何搭建本地MQTT服务器http://t.csdn.cn/aHNcO,现在介绍如何通过stm32连接MQTT 一.首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 二.通过数据间隔时间来判断是否是一串数据如果间隔时间大于30ms则判定为不是一串数据,接收缓冲器清零。 代码如下!

    2024年02月07日
    浏览(37)
  • Android app应用连接WiFi的方法(兼容Android10)

    Android应用开发有时候会有应用直连app的需求,由于Android系统 api会时常变动,wifi连接api亦如此,Android10以下直接使用: Android 10以上则可以使用 或是WifiNetworkSuggestion 方式 最后分享工具类

    2024年02月04日
    浏览(71)
  • Android的WIFI和以太网连接状态

    在一些 Android 设备上同时具有以太网和Wifi网络连接 我们可以使用 ConnectivityManager 类来判断设备的网络状态。以下是一个 Kotlin 示例,说明了如何检查网络连接状态以及连接类型(例如 Wi-Fi 或移动数据):

    2024年02月16日
    浏览(46)
  • 树莓派通过网线连接笔记本实现笔记本电脑Wifi的网络共享

    基于windows电脑连接树莓派进行设置:通过通过一根网线,连接树莓派和电脑,使电脑和树莓派构成一个局域网,然后树莓派接收来自笔记本电脑wifi网络的共享网络。操作方法类似台式机通过网线共享笔记本电脑无线网络的步骤 1、 保证笔记本通过“无线网络连接”可以正常

    2024年02月09日
    浏览(55)
  • Android 9.0以上 连接wifi失败 解决方案

    Android9开始,WIFI那块的API发生了改变: addNetwork(WifiConfiguration config) 此方法在API级别Q中已弃用) 见addNetworkSuggestions(java.util.List), removeNetworkSuggestions(java.util.List)新的API添加Wi-Fi网络进行审议时,自动连接到无线网络。 兼容性注意:对于目标Build.VERSION_CODES.Q或更高的应用程序

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包