You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过WifiManager.LocalOnlyHotspotCallback开启热点?适配安卓8/12求助

问题修复方案

核心问题分析

你的代码存在几个关键问题导致闪退:

  1. WifiManager未初始化:直接调用wifiManager.startLocalOnlyHotspot会触发空指针异常
  2. 权限请求逻辑错误:请求权限后立即检查权限,此时用户还没来得及授权,会直接返回,且未处理权限授权后的回调
  3. Android 12权限适配缺失:Android 12(API 31)及以上需要NEARBY_WIFI_DEVICES权限替代ACCESS_FINE_LOCATION用于热点操作
  4. 生命周期时机不当:在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();
        }
    }
}

额外配置说明

  1. 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" />
  1. 关键修复点说明:
  • 初始化WifiManager:在onCreate中通过系统服务获取实例,彻底避免空指针异常
  • 权限版本适配:针对Android 12+替换为专门的热点权限,符合系统权限规范
  • 权限回调处理:实现onRequestPermissionsResult,确保用户授权后再执行热点操作
  • 生命周期优化:在onResume中触发权限检查,保证页面就绪后执行操作
  • 资源清理:在onDestroy中关闭热点,防止内存泄漏

内容的提问来源于stack exchange,提问作者user6781

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:05:06