android开发:安卓13Wifi和热点查看与设置功能

火影  金牌会员 | 2024-8-11 23:51:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 850|帖子 850|积分 2550

初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目的但部分代码是纯C++的,可以在任何平台上使用。

        克日对安卓热点功能做了一些技术验证,目的是想利用手机开热点给装备做初始化,用的是安卓13,简言之:


  • 热点设置功能不可用,不可设置SSID和暗码,不可步伐控制开启关闭,网上的代码齐备都过时了
  • LocalOnlyHotspot不可设置SSID和暗码,只能系统随机(因为没故意义,以是也没有验证)
  • wifi开关不能用步伐设置,只能呼出配置界面让用户去操作
  • 热点开关无法呼出
  • 热点手机获取热点IP是可用的
  • 热点手机和装备的UDP广播是可用的
        下面介绍细节。以下代码基于IDEA生成的默认简单应用,面向android 10,测试手机为android 13。textviewFirst是默认生成的标签,本代码用这个标签来显示效果。
目录
一、相干权限
二、获取wifi状态和呼出wifi设置界面
三、获取热点状态


一、相干权限

        本文涉及到的权限如下(大概某些是不必要的):
        在AndroidManifest.xml增加如下设置:
  1.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  2.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  3.     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
  4.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  5.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  6.     <uses-permission android:name="android.permission.INTERNET"/>
复制代码
        实测一下应该能去掉几个权限。这里增加了权限之后还需要在步伐里检查,如果没有权限就向用户提出授权申请。
         启动代码的变量增加:
  1.     private static String[] PERMISSION_STORAGE = {"android.permission.ACCESS_WIFI_STATE"
  2.             ,         "android.permission.CHANGE_WIFI_STATE"
  3.             ,         "android.permission.CHANGE_WIFI_MULTICAST_STATE"
  4.             ,         "android.permission.ACCESS_FINE_LOCATION"
  5.             ,         "android.permission.ACCESS_COARSE_LOCATION"
  6.             ,         "android.permission.INTERNET"
  7.     };
  8.     private static int REQUEST_CODE_PERMISSION_STORAGE = 100;
复制代码
        onCreate增加:
  1.     if (Build.VERSION.SDK_INT >= 23) {
  2.             for (String str : PERMISSION_STORAGE) {
  3.                 if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
  4.                     this.requestPermissions(PERMISSION_STORAGE, REQUEST_CODE_PERMISSION_STORAGE);
  5.                  }
  6.             }
  7.         }
复制代码
         这段代码用于如果缺少权限就向用户申请。
二、获取wifi状态和呼出wifi设置界面

        呼出设置界面需要使用ActivityResultLauncher。
        增加变量(好比在FirstFragment里面):
  1.     private ActivityResultLauncher launcher;
复制代码
        onCreateView增加:
  1.         launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
  2.             @Override
  3.             public void onActivityResult(ActivityResult result) {
  4.                 binding.textviewFirst.append("设置界面返回"+result.getResultCode()+"\n");
  5.             }
  6.         });
复制代码
        要先注册ActivityResultLauncher。设置界面并不返回故意义的值。背面仍需检查wifi状态。
        在需要的时候呼出设置界面:
  1. public void callWifiConfig(boolean wantClose) {
  2.         //获取wifi管理服务
  3.         WifiManager wifiManager = (WifiManager) this.getContext().getSystemService(Context.WIFI_SERVICE);
  4.         if(null!=wifiManager)binding.textviewFirst.append("wifiManager获取成功\n");
  5.         if (wantClose && wifiManager.isWifiEnabled() || !wantClose && !wifiManager.isWifiEnabled()) {
  6.             binding.textviewFirst.append("wifi开启状态:"+wifiManager.isWifiEnabled()+"\n");
  7.             Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
  8.             //startActivityForResult(panelIntent);已过时
  9.             launcher.launch(panelIntent);
  10.         }
  11.         return;
  12. }
复制代码
        这个代码同时演示了获取wifi状态和呼出设置界面。调用此代码即可。
        wifiManager.isWifiEnabled()获取wifi状态。
        Settings.Panel.ACTION_WIFI 仅打开设置wifi,还有几个不同选项,但是没有针对热点的。
        运行效果(界面的下方):

三、获取热点状态

        代码如下:
  1.     public boolean getWifiApState() {
  2.         WifiManager wifiManager = (WifiManager) this.getContext().getSystemService(Context.WIFI_SERVICE);
  3.         if (wifiManager.isWifiEnabled()) {
  4.             binding.textviewFirst.append("wifi处于开启状态\n");
  5.             return false;
  6.         } else binding.textviewFirst.append("wifi处于关闭状态\n");
  7.         try {
  8.             Method method = wifiManager.getClass().getMethod("getWifiApState");
  9.             int i = (Integer) method.invoke(wifiManager);
  10.             binding.textviewFirst.append("热点状态"+i+"\n");
  11.             return true;
  12.         } catch (Exception e) {
  13.             binding.textviewFirst.append(e.toString());
  14.             return false;
  15.         }
  16.     }
复制代码
         由于getWifiApState()无法直接调用,以是用了invoke。从前的很多设置wifi和热点的代码都是雷同这样用,但是现在齐备都过时了,手机的权限越收越紧。


(这里是竣事)


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表