我正在使用文件共享应用程序。我需要通过调用WifiManager.startLocalOnlyHotspot()以编程方式打开设备的仅本地热点。
应用程序需要具有以下权限才能启动LocalOnlyHotspot:Manifest.permission.CHANGE_WIFI_STATE和ACCESS_FINE_LOCATION。没有权限的调用者将触发SecurityException。
我已经在清单中添加了这些权限,还在运行时授予了ACCESS_FINE_LOCATION(因为这是运行时权限(危险权限))。
但是在某些设备中调用startLocalOnlyHotspot()仍会引发SecurityException。
引发SecurityException的设备:Samsung Galaxy J7 Max(j7maxlte),Android 8.1
运行正常且不会引发异常的设备:Redmi Note 7 Pro,Android 9 PKQ1.181203.001
我想念什么?
答案 0 :(得分:1)
您需要使用GPS启用位置。
首先,添加gms的依赖项。
implementation 'com.google.android.gms:play-services-location:16.0.0'
然后,设置位置服务
private void setupLocationServices() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10);
mLocationRequest.setSmallestDisplacement(10);
mLocationRequest.setFastestInterval(10);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationSettingsRequest.Builder builder = new
LocationSettingsRequest.Builder();
builder.addLocationRequest(mLocationRequest);
task = LocationServices.getSettingsClient(this).checkLocationSettings(builder.build());
locationSettingsResponseBuilder();
}
LocationSettingsResponseBuilder:
private void locationSettingsResponseBuilder() {
task.addOnCompleteListener(task -> {
try {
LocationSettingsResponse response = task.getResult(ApiException.class);
// All location settings are satisfied. The client can initialize location
// requests here.
//Everything is good. You can turn on hotspot here.
//}
} catch (ApiException exception) {
switch (exception.getStatusCode()) {
case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
// Location settings are not satisfied. But could be fixed by showing the
// user a dialog.
try {
// Cast to a resolvable exception.
ResolvableApiException resolvable = (ResolvableApiException) exception;
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
resolvable.startResolutionForResult(
MainActivity.this,
101);
} catch (IntentSender.SendIntentException e) {
// Ignore the error.
} catch (ClassCastException e) {
// Ignore, should be an impossible error.
}
break;
case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
// Location settings are not satisfied. However, we have no way to fix the
// settings so we won't show the dialog.
break;
}
}
});
}
将此案例添加到 onActivityResult 方法。
case 101:
final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
switch (resultCode) {
case Activity.RESULT_OK:
// All required changes were successfully made
Log.v("case 101", states.isLocationPresent() + "");
//Everything is good. You can turn on hotspot here.
break;
case Activity.RESULT_CANCELED:
// The user was asked to change settings, but chose not to
Log.v("case 101", "Canceled");
break;
default:
break;
}
break;
我最近创建了一个名为Spotserve的演示应用程序。这会为所有API> = 15的设备打开wifi热点,并在该热点上托管一个演示服务器。您可以检查更多细节。希望这会有所帮助!