1 问题
在三星安卓8.1版本手机上,打开热点
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
wifiManager.startLocalOnlyHotspot(new WifiManager.LocalOnlyHotspotCallback() {
@TargetApi(Build.VERSION_CODES.O)
@Override
public void onStarted(WifiManager.LocalOnlyHotspotReservation reservation) {
super.onStarted(reservation);
mReservation = reservation;
WifiConfiguration wifiConfiguration = reservation.getWifiConfiguration();
ssid = wifiConfiguration.SSID;
mHandler.obtainMessage(2018, wifiConfiguration).sendToTarget();
}
@Override
public void onStopped() {
super.onStopped();
}
@Override
public void onFailed(int reason) {
super.onFailed(reason);
}
}, mHandler);
我先判断是否有Manifest.permission.WRITE_SETTINGS权限,没有的话进行申请
val intent = Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, Uri.parse("package:$packageName"))
startActivityForResult(intent, REQUEST_CODE)
然后有了写系统权限之后,打开热点报错如下
04-23 22:27:34.804 8267 8267 E AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2000, result=0, data=null} to activity {com.appsinnova.android.keepshare/com.appsinnova.android.keepshare.invitation.WifiShareActivity}: java.lang.SecurityException: UID 10140 does not have Location permission
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:4467)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread.handleSendResult(ActivityThread.java:4511)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread.-wrap19(Unknown Source:0)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1707)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6746)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: Caused by: java.lang.SecurityException: UID 10140 does not have Location permission
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2013)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1959)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.net.wifi.IWifiManager$Stub$Proxy.startLocalOnlyHotspot(IWifiManager.java:1737)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.net.wifi.WifiManager.startLocalOnlyHotspot(WifiManager.java:2083)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.initWifiAp(WifiShareActivity.kt:286)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.onActivityResult(WifiShareActivity.kt:72)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.Activity.dispatchActivityResult(Activity.java:7291)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:4463)
04-23 22:27:34.804 8267 8267 E AndroidRuntime: ... 9 more
04-23 22:27:53.850 1804 2945 I ActivityManager: Killing 8267:com.appsinnova.android.keepshare/u0a140 (adj 0): crash
很明显这里没有does not have Location permission,没有定位权限,然后检查AndroidMinifest.xml文件,的确有如下权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
那么我们接下来就要申请这个权限,我这里用的Rxpermissios申请的
val rxPermissions = RxPermissions(this)
rxPermissions.request(
Manifest.permission.ACCESS_FINE_LOCATION
).subscribe { aBoolean ->
Log.i(TAG, "ACCESS_FINE_LOCATION aBoolean isL" + aBoolean);
if (aBoolean) { //申请的权限全部允许
Log.i(TAG, "申请ACCESS_FINE_LOCATION权限 success");
} else { //只要有一个权限被拒绝,就会执行
Log.i(TAG, "ACCESS_FINE_LOCATION do not have");
//text_no_permisson
ToastUtils.showShort(getString(R.string.text_no_permisson))
finish()
}
}
申请好了打开热点又报这个错误
04-23 22:40:30.860 11198 11198 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsinnova.android.keepshare/com.appsinnova.android.keepshare.invitation.WifiShareActivity}: java.lang.SecurityException: Location mode is not enabled.
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2961)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3039)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread.-wrap11(Unknown Source:0)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1652)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6746)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: Caused by: java.lang.SecurityException: Location mode is not enabled.
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:2013)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1959)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.net.wifi.IWifiManager$Stub$Proxy.startLocalOnlyHotspot(IWifiManager.java:1737)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.net.wifi.WifiManager.startLocalOnlyHotspot(WifiManager.java:2083)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.initWifiAp(WifiShareActivity.kt:309)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.checkWriteSettings(WifiShareActivity.kt:183)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.appsinnova.android.keepshare.invitation.WifiShareActivity.initData(WifiShareActivity.kt:99)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.skyunion.android.base.RxBaseActivity.init(RxBaseActivity.java:188)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.skyunion.android.base.RxBaseActivity.onCreate(RxBaseActivity.java:137)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at com.appsinnova.android.keepshare.base.BaseActivity.onCreate(BaseActivity.kt:25)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7024)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.Activity.performCreate(Activity.java:7015)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1215)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2914)
04-23 22:40:30.860 11198 11198 E AndroidRuntime: ... 9 more
2 解决办法
最后错误很明显的
Location mode is not enabled.
需要打开定位开关,这是三星安卓8.1手机需要打开GPS开关,还不知道其它高版本手机需不需要,待测试。