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的行为和权限要求做了两处关键变更:
- 私有热点隐藏显示:
startLocalOnlyHotspot创建的本地热点变为应用私有热点,系统状态栏、设置页面不再显示该热点的开启状态,仅允许创建它的应用通过特定方式使用。 - 权限要求补充:除原有
ACCESS_FINE_LOCATION和CHANGE_WIFI_STATE外,Android 12新增了ACCESS_WIFI_STATE的权限要求,缺失该权限可能导致热点无法正常初始化。
解决步骤
- 补充缺失权限
在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" />
- 验证热点实际状态
由于系统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()); }
若能正常输出上述信息,说明热点已成功创建,只是系统未对外显示。
- 适配应用内网络使用
如需让其他设备连接热点并与应用通信,需将应用的网络服务绑定到热点网络。示例代码如下:
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
相关产品推荐
相关产品推荐

