高校廉洁文化建设网站,发帖推广百度首页,云南云南省城乡建设厅网站,成都php网站开发近日对安卓热点功能做了一些技术验证#xff0c;目的是想利用手机开热点给设备做初始化#xff0c;用的是安卓13#xff0c;简言之#xff1a;
热点设置功能不可用#xff0c;不可设置SSID和密码#xff0c;不可程序控制开启关闭#xff0c;网上的代码统统都过时了Loca… 近日对安卓热点功能做了一些技术验证目的是想利用手机开热点给设备做初始化用的是安卓13简言之
热点设置功能不可用不可设置SSID和密码不可程序控制开启关闭网上的代码统统都过时了LocalOnlyHotspot不可设置SSID和密码只能系统随机因为没有意义所以也没有验证wifi开关不能用程序设置只能呼出配置界面让用户去操作热点开关无法呼出热点手机获取热点IP是可用的热点手机和设备的UDP广播是可用的 下面介绍细节。以下代码基于IDEA生成的默认简单应用面向android 10测试手机为android 13。textviewFirst是默认生成的标签本代码用这个标签来显示结果。
目录
一、相关权限
二、获取wifi状态和呼出wifi设置界面
三、获取热点状态 一、相关权限 本文涉及到的权限如下可能某些是不必要的 在AndroidManifest.xml增加如下设置 uses-permission android:nameandroid.permission.ACCESS_WIFI_STATE/uses-permission android:nameandroid.permission.CHANGE_WIFI_STATE/uses-permission android:nameandroid.permission.CHANGE_WIFI_MULTICAST_STATE/uses-permission android:nameandroid.permission.ACCESS_FINE_LOCATION/uses-permission android:nameandroid.permission.ACCESS_COARSE_LOCATION/uses-permission android:nameandroid.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 ActivityResultCallbackActivityResult() {Overridepublic 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和热点的代码都是类似这样用但是现在统统都过时了手机的权限越收越紧。 这里是结束