为了改进@AndreasGobs的答案,以下是测试与设备连接是否可行的代码,基于当前可用的权限。在清单文件中,我设置了COARSE和FINE位置权限必须限制在最大API 30以下。在Android 6、8.1、11和12设备上进行了测试。希望这对你有用。
private boolean canConnect(){
Timber.d("canConnect called");
List<String> deniedPermissions = new ArrayList<>();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
if (!checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION))
deniedPermissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
if (!checkPermission(Manifest.permission.ACCESS_FINE_LOCATION))
deniedPermissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
if(deniedPermissions.isEmpty()){
if (!MmcDeviceCapabilities.hasLocationGps()
|| Build.VERSION.SDK_INT < Build.VERSION_CODES.O
|| MmcDeviceCapabilities.isGpsEnabled()){
if(MmcDeviceCapabilities.bluetoothEnabled())
return true;
else {
requestEnableBluetooth();
return false;
}
}
else {
Timber.d("Request enable GPS");
requestEnableGps();
return false;
}
}
else {
Timber.d("Request GPS permissions");
requestRuntimePermissions(
"Bluetooth GPS request",
"GPS permissions request rationale",
GPS_PERMISSIONS_CODE,
deniedPermissions.toArray(new String[0]));
return false;
}
}
else {
if(!checkPermission(Manifest.permission.BLUETOOTH_SCAN))
deniedPermissions.add(Manifest.permission.BLUETOOTH_SCAN);
if(!checkPermission(Manifest.permission.BLUETOOTH_CONNECT))
deniedPermissions.add(Manifest.permission.BLUETOOTH_CONNECT);
if(deniedPermissions.isEmpty())
if(MmcDeviceCapabilities.bluetoothEnabled())
return true;
else {
requestEnableBluetooth();
return false;
}
else {
Timber.d("Request bluetooth permissions");
requestRuntimePermissions(
"Bluetooth permissions request",
"Bluetooth permissions request rationale",
CONNECT_PERMISSIONS_CODE,
deniedPermissions.toArray(new String[0]));
return false;
}
}
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
private boolean checkPermission(@NonNull String permission){
return ActivityCompat.checkSelfPermission(this, permission)
== PackageManager.PERMISSION_GRANTED;
}
private void requestRuntimePermissions(@NonNull String title, @NonNull String description, int requestCode, @NonNull String... permissions){
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder
.setTitle(title)
.setMessage(description)
.setCancelable(false)
.setNegativeButton(android.R.string.no, (dialog, id) -> {
})
.setPositiveButton(android.R.string.ok, (dialog, id) -> ActivityCompat.requestPermissions(this, permissions, requestCode));
showDialog(builder);
}
else ActivityCompat.requestPermissions(this, permissions, requestCode);
}