当前位置: 首页 > article >正文

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

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

  • 热点设置功能不可用,不可设置SSID和密码,不可程序控制开启关闭,网上的代码统统都过时了
  • LocalOnlyHotspot不可设置SSID和密码,只能系统随机(因为没有意义,所以也没有验证)
  • wifi开关不能用程序设置,只能呼出配置界面让用户去操作
  • 热点开关无法呼出
  • 热点手机获取热点IP是可用的
  • 热点手机和设备的UDP广播是可用的

        下面介绍细节。以下代码基于IDEA生成的默认简单应用,面向android 10,测试手机为android 13。textviewFirst是默认生成的标签,本代码用这个标签来显示结果。

目录

一、相关权限

二、获取wifi状态和呼出wifi设置界面

三、获取热点状态


一、相关权限

        本文涉及到的权限如下(可能某些是不必要的):

        在AndroidManifest.xml增加如下设置:

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>

        实测一下应该能去掉几个权限。这里增加了权限之后还需要在程序里检查,如果没有权限就向用户提出授权申请。

         启动代码的变量增加:

    private static String[] PERMISSION_STORAGE = {"android.permission.ACCESS_WIFI_STATE"
            ,         "android.permission.CHANGE_WIFI_STATE"
            ,         "android.permission.CHANGE_WIFI_MULTICAST_STATE"
            ,         "android.permission.ACCESS_FINE_LOCATION"
            ,         "android.permission.ACCESS_COARSE_LOCATION"
            ,         "android.permission.INTERNET"
    };
    private static int REQUEST_CODE_PERMISSION_STORAGE = 100;

        onCreate增加:

    if (Build.VERSION.SDK_INT >= 23) {
            for (String str : PERMISSION_STORAGE) {
                if (this.checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
                    this.requestPermissions(PERMISSION_STORAGE, REQUEST_CODE_PERMISSION_STORAGE);
                 }
            }
        }

         这段代码用于如果缺少权限就向用户申请。

二、获取wifi状态和呼出wifi设置界面

        呼出设置界面需要使用ActivityResultLauncher。

        增加变量(比如在FirstFragment里面):

    private ActivityResultLauncher launcher;

        onCreateView增加:

        launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
            @Override
            public void onActivityResult(ActivityResult result) {
                binding.textviewFirst.append("设置界面返回"+result.getResultCode()+"\n");
            }
        });

        要先注册ActivityResultLauncher。设置界面并不返回有意义的值。后面仍需检查wifi状态。

        在需要的时候呼出设置界面:

public void callWifiConfig(boolean wantClose) {
        //获取wifi管理服务
        WifiManager wifiManager = (WifiManager) this.getContext().getSystemService(Context.WIFI_SERVICE);
        if(null!=wifiManager)binding.textviewFirst.append("wifiManager获取成功\n");

        if (wantClose && wifiManager.isWifiEnabled() || !wantClose && !wifiManager.isWifiEnabled()) {
            binding.textviewFirst.append("wifi开启状态:"+wifiManager.isWifiEnabled()+"\n");
            Intent panelIntent = new Intent(Settings.Panel.ACTION_WIFI);
            //startActivityForResult(panelIntent);已过时
            launcher.launch(panelIntent);
        }
        return;
}

        这个代码同时演示了获取wifi状态和呼出设置界面。调用此代码即可。

        wifiManager.isWifiEnabled()获取wifi状态。

        Settings.Panel.ACTION_WIFI 仅打开设置wifi,还有几个不同选项,但是没有针对热点的。

        运行效果(界面的下方):

三、获取热点状态

        代码如下:

    public boolean getWifiApState() {
        WifiManager wifiManager = (WifiManager) this.getContext().getSystemService(Context.WIFI_SERVICE);
        if (wifiManager.isWifiEnabled()) {
            binding.textviewFirst.append("wifi处于开启状态\n");
            return false;
        } else binding.textviewFirst.append("wifi处于关闭状态\n");

        try {
            Method method = wifiManager.getClass().getMethod("getWifiApState");
            int i = (Integer) method.invoke(wifiManager);
            binding.textviewFirst.append("热点状态"+i+"\n");
            return true;
        } catch (Exception e) {
            binding.textviewFirst.append(e.toString());
            return false;
        }
    }

         由于getWifiApState()无法直接调用,所以用了invoke。以前的很多设置wifi和热点的代码都是类似这样用,但是现在统统都过时了,手机的权限越收越紧。

(这里是结束)


http://www.kler.cn/a/149816.html

相关文章:

  • Stored procedures in PostgreSQL
  • 【leetcode练习·二叉树】用「分解问题」思维解题 II
  • JavaScript数组去重的实用方法汇总
  • 从0开始学docker (每日更新 24-11-7)
  • 【Python特征工程系列】利用SHAP进行特征重要性分析-XGB模型为例(案例+源码)
  • 中兴光猫修改SN,MAC,修改地区,异地注册,改桥接,路由拨号
  • 【Java Spring】SpringBoot 五大类注解
  • 使用elasticsearch-head插件修改elasticsearch数据
  • [UGUI]Unity背包系统制作详细步骤
  • 【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统
  • 王者农药小游戏
  • MySQL 索引类型
  • html实现计算器源码
  • linux 账号管理实例一,stdin,passwd复习
  • 力扣105. 从前序与中序遍历序列构造二叉树
  • 虹科方案 | 如何破解CAN与车载以太网之间数据传输和协议转换的难题?
  • 树与二叉树堆:链式二叉树的实现
  • 手机 IOS 软件 IPA 签名下载安装详情图文教程
  • 第七节HarmonyOS UIAbility生命周期以及启动模式
  • 基于SpringBoot的图书管理系统
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 7》(11)
  • AI算法中的模型量化岗是做什么的
  • 制作心理咨询小程序的详细指南
  • 开发定制化抖音票务小程序的技术解析
  • 技术分享| anyRTC之RTN网络
  • 解决苹果手机iphone手机强制重启