IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 9.0 wifi 热点 汇总 -> 正文阅读

[移动开发]Android 9.0 wifi 热点 汇总

最近调研需要开发Android 9.0的WiFi 热点,要求能够打开和关闭热点,及获取热点信息(名称和密码)。
但是热点模块属于系统级api,第三方应用无法直接获取,还好app可以为系统级应用,可以直接获取api来执行,
但是如果不是系统级应用,需要通过反射来处理。

1.打开wifi热点

 private void startTethering(){
        ConnectivityManager connectivityManager=((ConnectivityManager)context.getSystemService(CONNECTIVITY_SERVICE));
            try{
                Class classOnStartTetheringCallback=Class.forName("android.net.ConnectivityManager$OnStartTetheringCallback");
                Method startTethering=connectivityManager.getClass().getDeclaredMethod("startTethering",int.class,boolean.class,classOnStartTetheringCallback);
                Object proxy=ProxyBuilder.forClass(classOnStartTetheringCallback).handler(new InvocationHandler(){
                @Override
                public Object invoke(Object o,Method method,Object[]objects)throws Throwable{
                                return null;
                            }
                        }).build();
                startTethering.invoke(connectivityManager,0,false,proxy);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

该逻辑有个 OnStartTetheringCallback,需要实例化class 对象,这里借助三分框架来做的。
implementation ‘com.linkedin.dexmaker:dexmaker-mockito:2.12.1’

2.关闭wifi热点

  private void stopTethering(){
        ConnectivityManager connectivityManager=((ConnectivityManager)context.getSystemService(CONNECTIVITY_SERVICE));
            try{
                Method stopTethering=connectivityManager.getClass().getDeclaredMethod("stopTethering",int.class);
                stopTethering.invoke(connectivityManager,0);
            }catch(Exception e){
                e.printStackTrace();
            }
        }

3.wifi热点 是否打开

   public boolean isWifiApEnabled(){
        WifiManager wifiManager=(WifiManager)App.getContext().getApplicationContext().getSystemService(
        Context.WIFI_SERVICE);
            try{
                Method method=wifiManager.getClass().getMethod("isWifiApEnabled");
                method.setAccessible(true);
                return(Boolean)method.invoke(wifiManager);
            }catch(NoSuchMethodException e){
                e.printStackTrace();
            }catch(Exception e){
                e.printStackTrace();
            }
            return false;
        }

4.获取wifi热点信息

 public String getApInfo(){
        WifiManager wifiManager=(WifiManager)App.getContext().getApplicationContext().getSystemService(
        Context.WIFI_SERVICE);
            try{
                Method localMethod=wifiManager.getClass().getDeclaredMethod("getWifiApConfiguration",new Class[0]);
                WifiApConfiguration config = localMethod.invoke(wifiManager);
                String ssid = config.SSID;
                String key = config.preSharedKey;
            }catch(Exception localException){
                localException.printStackTrace();
            }
            return null;
        }

在获取getWifiApConfiguration的方法的时候,会提示下面错误,需要添加系统权限
android.Manifest.permission.ACCESS_WIFI_STATE
android.Manifest.permission.OVERRIDE_WIFI_CONFIG

java.lang.SecurityException:App not allowed to read or update stored WiFi Ap config

java.lang.SecurityException:App not allowed to read or update stored WiFi Ap config(uid=1000)
        at android.os.Parcel.readException(Parcel.java:2004)
        at android.os.Parcel.readException(Parcel.java:1950)
        at android.net.wifi.IWifiManager$Stub$Proxy.getWifiApConfiguration(IWifiManager.java:1769)
        at android.net.wifi.WifiManager.getWifiApConfiguration(WifiManager.java:2221)
        at com.android.settings.TetherSettings.initWifiTethering(TetherSettings.java:205)
        at com.android.settings.TetherSettings.onCreate(TetherSettings.java:171)

5.注册热点的监听器

context.registerReceiver(
        wifiApBroadcastReceiver,IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION),
        null,handler
        )

6.关于如何把普通应用改为系统应用

之前也以为在清单文件里设置android:sharedUserId=“android.uid.system” 就可以改为系统应用,其实不是这样的。
系统app和普通app最大的区别在于签名,系统应用使用rom的签名

7. 修改系统权限设置

    Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
    intent.setData(Uri.parse("package:" + getPackageName()));
    startActivityForResult(intent, REQUEST_CODE_WRITE_SETTINGS );
    
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)   {
        super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == REQUEST_CODE_WRITE_SETTINGS)
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                {
                //Settings.System.canWrite方法检测授权结果
                    if (Settings.System.canWrite(getApplicationContext()))
                    {
                    T.show("获取了权限");
                    } 
                }
            }
        }
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:46:08  更:2022-10-17 12:46:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 21:21:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码