1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-17 22:11:35 +02:00

check for new Bluetooth permissions in Android version >= 31, see #779

This commit is contained in:
oliexdev
2021-11-05 08:49:19 +01:00
parent 8fe1a58a60
commit 0abf478602
5 changed files with 42 additions and 16 deletions

View File

@@ -2,12 +2,12 @@ apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
android {
compileSdkVersion 29
compileSdkVersion 31
defaultConfig {
applicationId "com.health.openscale"
testApplicationId "com.health.openscale.test"
minSdkVersion 21
targetSdkVersion 29 // TODO target higher 31 needs different Bluetooth permissions, see https://developer.android.com/guide/topics/connectivity/bluetooth/permissions
targetSdkVersion 31
versionCode 56
versionName "2.4.1"
@@ -132,7 +132,7 @@ android {
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
implementation 'com.google.android.material:material:1.5.0-alpha02'
implementation 'com.google.android.material:material:1.5.0-alpha05'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.recyclerview:recyclerview:1.2.1'
@@ -148,7 +148,7 @@ dependencies {
// Simple CSV
implementation 'com.j256.simplecsv:simplecsv:2.6'
// Blessed Android
implementation 'com.github.weliem:blessed-android:2.0.11'
implementation 'com.github.weliem:blessed-android:2.1.2'
// CustomActivityOnCrash
implementation 'cat.ereza:customactivityoncrash:2.3.0'
// AppIntro

View File

@@ -2,12 +2,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.health.openscale" >
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- Permission to allow read of data from the database through a ContentProvider.
Marked "dangerous" so that explicit user approval is required to read this data, not

View File

@@ -533,9 +533,10 @@ public abstract class BluetoothCommunication {
// Otherwise the connection almost never succeeds.
LocationManager locationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE);
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED && (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
|| locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
if ((ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) ||
(ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED ) &&
(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)))
) {
Timber.d("Do LE scan before connecting to device");
central.scanForPeripheralsWithAddresses(new String[]{macAddress});

View File

@@ -391,8 +391,16 @@ public class BluetoothSettingsFragment extends Fragment {
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
case PermissionHelper.PERMISSIONS_REQUEST_ACCESS_BLUETOOTH: {
boolean allGranted = true;
for (int result : grantResults) {
if (result != PackageManager.PERMISSION_GRANTED) {
allGranted = false;
break;
}
}
if (allGranted) {
if (PermissionHelper.requestLocationServicePermission(this)) {
startBluetoothDiscovery();
}

View File

@@ -15,6 +15,8 @@
*/
package com.health.openscale.gui.utils;
import static android.content.Context.LOCATION_SERVICE;
import android.Manifest;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -33,10 +35,8 @@ import androidx.fragment.app.Fragment;
import com.health.openscale.R;
import static android.content.Context.LOCATION_SERVICE;
public class PermissionHelper {
public final static int PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;
public final static int PERMISSIONS_REQUEST_ACCESS_BLUETOOTH = 1;
public final static int PERMISSIONS_REQUEST_ACCESS_READ_STORAGE = 2;
public final static int PERMISSIONS_REQUEST_ACCESS_WRITE_STORAGE = 3;
@@ -62,6 +62,21 @@ public class PermissionHelper {
return false;
}
int targetSdkVersion = fragment.getActivity().getApplicationInfo().targetSdkVersion;
String[] requiredPermissions;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && targetSdkVersion >= Build.VERSION_CODES.S) {
requiredPermissions = new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT};
fragment.requestPermissions(requiredPermissions, PERMISSIONS_REQUEST_ACCESS_BLUETOOTH);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && targetSdkVersion >= Build.VERSION_CODES.Q) {
return requestLocationPermission(fragment, new String[]{Manifest.permission.ACCESS_FINE_LOCATION});
} else return requestLocationPermission(fragment, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION});
return true;
}
private static boolean requestLocationPermission(final Fragment fragment, String[] requiredPermissions) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (fragment.getContext().checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
AlertDialog.Builder builder = new AlertDialog.Builder(fragment.getActivity());
@@ -72,7 +87,7 @@ public class PermissionHelper {
.setPositiveButton(R.string.label_ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.dismiss();
fragment.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
fragment.requestPermissions(requiredPermissions, PERMISSIONS_REQUEST_ACCESS_BLUETOOTH);
}
});