hotspotReservation = reservation;
WifiConfiguration currentConfig = hotspotReservation.getWifiConfiguration();
printCurrentConfig(currentConfig);
需要复制后调用 不然就
java.lang.NoSuchMethodError: No virtual method getSoftApConfiguration()Landroid/net/wifi/SoftApConfiguration; in class Landroid/net/wifi/WifiManager$LocalOnlyHotspotReservation; or its super classes (declaration of 'android.net.wifi.WifiManager$LocalOnlyHotspotReservation' appears in /system/framework/framework.jar!classes2.dex)
startLocalOnlyHotspot
在API 级别 26 中添加
public void startLocalOnlyHotspot (WifiManager.LocalOnlyHotspotCallback callback,
Handler handler)
请求一个仅限本地的热点,应用程序可以使用该热点在连接到创建的 WiFi 热点的共置设备之间进行通信。此方法创建的网络将无法访问 Internet。每个应用程序可以对热点发出单个请求,但多个应用程序可以同时请求热点。当多个应用程序同时成功注册时,它们将共享底层热点。LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)当热点准备好供应用程序使用时调用。
每个应用程序都可以对该方法进行一次主动调用。该WifiManager.LocalOnlyHotspotCallback.onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation)回调用品与请求者LocalOnlyHotspotReservation包含 SoftApConfiguration有连接到该热点所需要的SSID,安全类型和凭据。传达此信息取决于应用程序。
如果无法创建 LocalOnlyHotspot,LocalOnlyHotspotCallback#onFailed(int) 则将调用该方法。示例故障包括网络错误或操作模式不兼容。例如,如果用户当前正在使用 Wifi Tethering 向另一台设备提供上游,则 LocalOnlyHotspot 将不会由于不兼容的模式而启动。可能的错误代码包括: LocalOnlyHotspotCallback#ERROR_NO_CHANNEL, LocalOnlyHotspotCallback#ERROR_GENERIC, LocalOnlyHotspotCallback#ERROR_INCOMPATIBLE_MODE和 LocalOnlyHotspotCallback#ERROR_TETHERING_DISALLOWED。
在内部,将跟踪请求以防止热点在应用程序仍在使用时被拆除。当不再需要使用 LocalOnlyHotspot 时,应关闭调用中LocalOnlyHotspotReservation传递的对象 。由于热点可能会被多个应用程序共享,删除最终注册的应用程序请求将触发热点拆卸。这意味着应用程序不应通过侦听包含 wifi 状态的广播来确定热点在使用完毕后是否已停止。此外,一旦被调用,应用程序将不会收到任何类型的回调。 WifiManager.LocalOnlyHotspotCallback.onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation)LocalOnlyHotspotReservation#close()LocalOnlyHotspotReservation#close()
应用程序应该知道用户也可以通过设置 UI 停止 LocalOnlyHotspot;只要有请求的应用程序,它就不能保证熬夜。将通过 将这种情况通知请求者 LocalOnlyHotspotCallback#onStopped()。其他情况可能会出现热点被拆除(紧急模式等)。应用程序开发人员应该知道它可能会意外停止,但如果他们正确注册,他们会收到通知。
应用程序还应该知道这个网络将与其他应用程序共享。应用程序负责保护其在此网络上的数据(例如 TLS)。
package com.fotric.iriatool.utils;
import android.annotation.SuppressLint;
import android.content.Context;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import androidx.annotation.RequiresApi;
/**
* WifiHotstopManager class makes use of the Android's WifiManager and WifiConfiguration class
* to implement the wifi hotspot feature.
* Created by zhubinsheng on 11/8/2021.
*/
@SuppressLint("MissingPermission")
public class WifiHotspotManager {
private static final String TAG = "WifiHotspotManager";
private WifiManager wifiManager;
private WifiManager.LocalOnlyHotspotReservation hotspotReservation;
public WifiHotspotManager(Context context) {
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}
//Workaround to turn on hotspot for Oreo versions
@RequiresApi(api = Build.VERSION_CODES.O)
public void turnOnHotspot() {
wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {
@Override
public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
super.onStarted(reservation);
hotspotReservation = reservation;
WifiConfiguration currentConfig = hotspotReservation.getWifiConfiguration();
printCurrentConfig(currentConfig);
Log.v(TAG, "Local Hotspot Started");
}
@Override
public void onStopped() {
super.onStopped();
Log.v(TAG, "Local Hotspot Stopped");
}
@Override
public void onFailed(int reason) {
super.onFailed(reason);
Log.v(TAG, "Local Hotspot failed to start");
}
}, new Handler());
}
//Workaround to turn off hotspot for Oreo versions
@RequiresApi(api = Build.VERSION_CODES.O)
public void turnOffHotspot() {
if (hotspotReservation != null) {
hotspotReservation.close();
hotspotReservation = null;
Log.v(TAG, "Turned off hotspot");
}
}
//This method checks the state of the hostpot for devices>=Oreo
@RequiresApi(api = Build.VERSION_CODES.O)
public boolean isHotspotStarted() {
return hotspotReservation != null;
}
private void printCurrentConfig(WifiConfiguration wifiConfiguration) {
Log.v(TAG, "THE PASSWORD IS: "
+ wifiConfiguration.preSharedKey
+ " \n SSID is : "
+ wifiConfiguration.SSID);
}
}