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

Android 12中LocalOnlyHotspot无法正常开启热点的问题求助

问题

参考Stack Overflow上Android 8.0的热点开启方案,我成功在Android 8设备上实现热点开启,但相同代码在Android 12设备上无法生效。

我的代码(MainActivity.java)

package io.ionic.starter;
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler; 
import androidx.annotation.RequiresApi;
import androidx.core.app.ActivityCompat;
import com.getcapacitor.BridgeActivity;

public class MainActivity extends BridgeActivity {
  private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
  private WifiManager.LocalOnlyHotspotReservation mReservation;
  @Override
  public void onStart() { 
    super.onStart();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      turnOnHotspot();     
    }
  }

  @RequiresApi(api = Build.VERSION_CODES.O)
  private void turnOnHotspot() {
    WifiManager manager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
      ActivityCompat.requestPermissions(this, 
        new String[]{(Manifest.permission.ACCESS_FINE_LOCATION)},
        MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
      return;
    }
    manager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {

      @Override
      public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
        System.out.println("-------I'm going to run onStarted(reservation)-------");
        super.onStarted(reservation);
        mReservation = reservation;
        System.out.println("------OnStarted(reservation) has been run -------");
      }

      @Override
      public void onStopped() {
        super.onStopped();
      }

      @Override
      public void onFailed(int reason) {
        super.onFailed(reason);
      }
    }, new Handler());
  }  
}

根据WifiManager官方文档,LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)回调触发时热点应已就绪,但运行代码后日志显示该回调已执行,实际热点并未开启。我已授予ACCESS_FINE_LOCATION和CHANGE_WIFI_STATE权限,设备位置功能也处于开启状态。Android 8设备日志会显示热点相关信息,但Android 12设备无该日志输出。


原因与解决方案

问题原因

Android 12(API 31)对LocalOnlyHotspot的行为和权限要求做了两处关键变更:

  1. 私有热点隐藏显示:startLocalOnlyHotspot创建的本地热点变为应用私有热点,系统状态栏、设置页面不再显示该热点的开启状态,仅允许创建它的应用通过特定方式使用。
  2. 权限要求补充:除原有ACCESS_FINE_LOCATION和CHANGE_WIFI_STATE外,Android 12新增了ACCESS_WIFI_STATE的权限要求,缺失该权限可能导致热点无法正常初始化。

解决步骤

  1. 补充缺失权限
    在AndroidManifest.xml中添加ACCESS_WIFI_STATE权限,同时确保已有必要权限声明:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  1. 验证热点实际状态
    由于系统UI不再显示热点,需通过代码获取热点参数确认是否成功创建。修改onStarted回调:
@Override
public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
    super.onStarted(reservation);
    mReservation = reservation;
    // 获取并打印热点配置信息
    WifiManager.LocalOnlyHotspotConfiguration config = reservation.getConfiguration();
    System.out.println("热点SSID: " + config.getSsid());
    System.out.println("热点密码: " + config.getPassphrase());
    System.out.println("热点频段: " + config.getBand());
}

若能正常输出上述信息,说明热点已成功创建,只是系统未对外显示。

  1. 适配应用内网络使用
    如需让其他设备连接热点并与应用通信,需将应用的网络服务绑定到热点网络。示例代码如下:
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
// 构建本地热点的网络请求
NetworkRequest request = new NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .addCapability(NetworkCapabilities.NET_CAPABILITY_LOCAL_ONLY)
        .build();
// 获取热点对应的网络对象
connectivityManager.requestNetwork(request, new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        super.onAvailable(network);
        // 将当前进程绑定到热点网络
        connectivityManager.bindProcessToNetwork(network);
        // 或为特定网络请求绑定该网络
        try {
            URLConnection connection = new URL("http://your-service-url").openConnection();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                connection.setNetwork(network);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:42:17