1 问题
在Android8.0手机开启了热点,关闭页面再次打开热点,
/**
* 开启Android8.0版本手机以上的热点,热点名字和密码都是随机的。
*/
fun initWifiApGreaterThanEight(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
var wifiManager:WifiManager = getApplicationContext().getSystemService(Context.WIFI_SERVICE) as WifiManager
try {
wifiManager.startLocalOnlyHotspot(object : WifiManager.LocalOnlyHotspotCallback(){
override fun onStarted(reservation: WifiManager.LocalOnlyHotspotReservation?) {
super.onStarted(reservation)
Log.i(TAG, "uild.VERSION.SDK_INT >= Build.VERSION_CODES.O initWifiAp onStarted");
reserva = reservation
var wifiConfiguration = reservation!!.wifiConfiguration
var ssid = wifiConfiguration.SSID;
var password = wifiConfiguration.preSharedKey
Log.i(TAG, "ssid is:" + ssid + "password is:" + password);
//创建成功,然后开辟线程,启动服务
Thread(HttpServerThread(context)).start()
setViewWifiApName(ssid)
setViewWifiApPassword(password)
// connectWifiQRCode(ssid, password);
}
override fun onStopped() {
super.onStopped()
Log.i(TAG, "uild.VERSION.SDK_INT >= Build.VERSION_CODES.O initWifiAp onStopped");
}
override fun onFailed(reason: Int) {
super.onFailed(reason)
Log.i(TAG, "uild.VERSION.SDK_INT >= Build.VERSION_CODES.O initWifiAp onFailed and reason isL" + reason);
openWifiAPFail()
}
}, handler)
} catch (e: Exception) {
e.printStackTrace();
Log.i(TAG, "open wifi Ap fail")
openWifiAPFail()
}
}
}
提示错误如下
04-24 13:31:17.521 5570 5570 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsinnova.android.keepshare/com.appsinnova.android.keepshare.invitation.WifiShareActivity}: java.lang.IllegalStateException: Caller already has an active LocalOnlyHotspot request
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3187)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3324)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:113)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:71)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2050)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.os.Looper.loop(Looper.java:226)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7223)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:576)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:961)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: Caused by: java.lang.IllegalStateException: Caller already has an active LocalOnlyHotspot request
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.os.Parcel.createException(Parcel.java:1974)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1934)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1884)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.net.wifi.IWifiManager$Stub$Proxy.startLocalOnlyHotspot(IWifiManager.java:1968)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.net.wifi.WifiManager.startLocalOnlyHotspot(WifiManager.java:2228)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.initWifiAp(WifiShareActivity.kt:308)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.checkWriteSettings(WifiShareActivity.kt:182)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.initData(WifiShareActivity.kt:98)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.skyunion.android.base.RxBaseActivity.init(RxBaseActivity.java:188)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.skyunion.android.base.RxBaseActivity.onCreate(RxBaseActivity.java:137)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at com.appsinnova.android.keepshare.base.BaseActivity.onCreate(BaseActivity.kt:25)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7378)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7369)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3167)
04-24 13:31:17.521 5570 5570 E AndroidRuntime: ... 11 more
04-24 13:31:17.524 603 634 I [email protected]: notifyAppState_2_1 pack:com.appsinnova.android.keepshare, act:com.appsinnova.android.keepshare, pid:5570, uid:10296, state:3
04-24 13:31:17.555 5570 5570 I Process : Sending signal. PID: 5570 SIG: 9
2 解决办法
在这个activity的destroy方法里面添加关闭就可以
reserva!!.close();
override fun onDestroy() {
super.onDestroy()
if (handler != null && counter != null) {
handler!!.removeCallbacks(counter)
}
//关闭socket
if (serverSocket != null) {
Log.i(TAG, "serverSocket != null and close")
serverSocket!!.close()
}
run = false
//关闭8.0以上的热点
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
if (reserva != null){
reserva!!.close();
}
} else {
//关闭7.1热点的关闭
WifiApUtil.closeWifiAp(this);
}
//打开wifi
var result = wifiApAdmin!!.openWifi()
Log.i(TAG, "result is :" + result);
}