如何通过WifiManager.LocalOnlyHotspotCallback开启热点?适配安卓8/12求助
问题修复方案
核心问题分析
你的代码存在几个关键问题导致闪退:
- WifiManager未初始化:直接调用
wifiManager.startLocalOnlyHotspot会触发空指针异常 - 权限请求逻辑错误:请求权限后立即检查权限,此时用户还没来得及授权,会直接返回,且未处理权限授权后的回调
- Android 12权限适配缺失:Android 12(API 31)及以上需要
NEARBY_WIFI_DEVICES权限替代ACCESS_FINE_LOCATION用于热点操作 - 生命周期时机不当:在
onStart中直接调用开启热点,可能导致页面未完全就绪就执行操作
修复后的完整代码
package io.ionic.starter; import android.Manifest; import android.content.pm.PackageManager; import android.net.wifi.WifiManager; import android.os.Build; import android.os.Bundle; import android.os.Handler; import androidx.core.app.ActivityCompat; import com.getcapacitor.BridgeActivity; public class MainActivity extends BridgeActivity { private static final int HOTSPOT_PERMISSION_REQUEST_CODE = 1001; private WifiManager wifiManager; private WifiManager.LocalOnlyHotspotReservation hotspotReservation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化WifiManager实例 wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); } @Override protected void onResume() { super.onResume(); checkPermissionsAndStartHotspot(); } private void checkPermissionsAndStartHotspot() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { // Android 12+ 适配NEARBY_WIFI_DEVICES权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.NEARBY_WIFI_DEVICES) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.NEARBY_WIFI_DEVICES}, HOTSPOT_PERMISSION_REQUEST_CODE ); return; } } else { // Android 11及以下适配ACCESS_FINE_LOCATION权限 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, HOTSPOT_PERMISSION_REQUEST_CODE ); return; } } // 权限已授权,启动热点 startLocalHotspot(); } private void startLocalHotspot() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && wifiManager != null) { wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() { @Override public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) { super.onStarted(reservation); hotspotReservation = reservation; String key = reservation.getWifiConfiguration().preSharedKey; String ssid = reservation.getWifiConfiguration().SSID; System.out.println("热点密码: " + key); System.out.println("热点名称: " + ssid); System.out.println("热点已启动"); } @Override public void onStopped() { super.onStopped(); System.out.println("热点已停止"); } @Override public void onFailed(int reason) { super.onFailed(reason); System.out.println("热点启动失败,错误码: " + reason); } }, new Handler()); } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == HOTSPOT_PERMISSION_REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户授权后重新启动热点 startLocalHotspot(); } else { System.out.println("权限被拒绝,无法开启热点"); } } } @Override protected void onDestroy() { super.onDestroy(); // 页面销毁时关闭热点,避免资源泄漏 if (hotspotReservation != null) { hotspotReservation.close(); } } }
额外配置说明
- AndroidManifest.xml 添加权限声明:
<!-- Android 11及以下所需权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 12+ 所需权限,无需位置权限关联 --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" android:usesPermissionFlags="neverForLocation" /> <!-- 声明应用依赖Wifi硬件 --> <uses-feature android:name="android.hardware.wifi" android:required="true" />
- 关键修复点说明:
- 初始化
WifiManager:在onCreate中通过系统服务获取实例,彻底避免空指针异常 - 权限版本适配:针对Android 12+替换为专门的热点权限,符合系统权限规范
- 权限回调处理:实现
onRequestPermissionsResult,确保用户授权后再执行热点操作 - 生命周期优化:在
onResume中触发权限检查,保证页面就绪后执行操作 - 资源清理:在
onDestroy中关闭热点,防止内存泄漏
内容的提问来源于stack exchange,提问作者user6781
相关产品推荐
相关产品推荐

