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


    初级代码游戏的专栏介绍与文章目录-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里面):

        private ActivityResultLauncher launcher;

            onCreateView增加:

    1. launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback() {
    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和热点的代码都是类似这样用,但是现在统统都过时了,手机的权限越收越紧。


    (这里是结束)

  • 相关阅读:
    SVN的基本使用
    K8S kube-scheduler-master CreateContainerError 问题解决及思路
    python+人脸识别+opencv实现真实人脸驱动的阿凡达(上)
    字符函数和字符串函数详解
    Jackson 代码示例
    不允许你还不了解指针的那些事(二)(从入门到精通看这一篇就够了)(数组传参的本质+冒泡排序+数组指针+指针数组)
    C++二义性、多态、纯虚函数、模板函数
    强烈推荐!史上最有深度的Java学习视频,Mybatis、Javaweb、SSM框架项目
    初始化列表
    利用FastReport传递图片参数,在报表上展示签名信息
  • 原文地址:https://blog.csdn.net/2301_77171572/article/details/134658579