近日对安卓热点功能做了一些技术验证,目的是想利用手机开热点给设备做初始化,用的是安卓13,简言之:
- 热点设置功能不可用,不可设置SSID和密码,不可程序控制开启关闭,网上的代码统统都过时了
- LocalOnlyHotspot不可设置SSID和密码,只能系统随机(因为没有意义,所以也没有验证)
- wifi开关不能用程序设置,只能呼出配置界面让用户去操作
- 热点开关无法呼出
- 热点手机获取热点IP是可用的
- 热点手机和设备的UDP广播是可用的
下面介绍细节。以下代码基于IDEA生成的默认简单应用,面向android 10,测试手机为android 13。textviewFirst是默认生成的标签,本代码用这个标签来显示结果。
一、相关权限
<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。
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和热点的代码都是类似这样用,但是现在统统都过时了,手机的权限越收越紧。
(这里是结束)
原文地址:https://blog.csdn.net/2301_77171572/article/details/134658579
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_5441.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!