1
0
mirror of https://github.com/oliexdev/openScale.git synced 2025-08-18 14:31:23 +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" apply plugin: "androidx.navigation.safeargs"
android { android {
compileSdkVersion 29 compileSdkVersion 31
defaultConfig { defaultConfig {
applicationId "com.health.openscale" applicationId "com.health.openscale"
testApplicationId "com.health.openscale.test" testApplicationId "com.health.openscale.test"
minSdkVersion 21 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 versionCode 56
versionName "2.4.1" versionName "2.4.1"
@@ -132,7 +132,7 @@ android {
dependencies { dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' 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.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'androidx.recyclerview:recyclerview:1.2.1' implementation 'androidx.recyclerview:recyclerview:1.2.1'
@@ -148,7 +148,7 @@ dependencies {
// Simple CSV // Simple CSV
implementation 'com.j256.simplecsv:simplecsv:2.6' implementation 'com.j256.simplecsv:simplecsv:2.6'
// Blessed Android // Blessed Android
implementation 'com.github.weliem:blessed-android:2.0.11' implementation 'com.github.weliem:blessed-android:2.1.2'
// CustomActivityOnCrash // CustomActivityOnCrash
implementation 'cat.ereza:customactivityoncrash:2.3.0' implementation 'cat.ereza:customactivityoncrash:2.3.0'
// AppIntro // AppIntro

View File

@@ -2,12 +2,14 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.health.openscale" > package="com.health.openscale" >
<uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/> <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.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_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.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!-- Permission to allow read of data from the database through a ContentProvider. <!-- 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 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. // Otherwise the connection almost never succeeds.
LocationManager locationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE); LocationManager locationManager = (LocationManager)context.getSystemService(LOCATION_SERVICE);
if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) if ((ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) ||
== PackageManager.PERMISSION_GRANTED && (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) (ContextCompat.checkSelfPermission(context, Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_GRANTED ) &&
|| locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) ||
(locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)))
) { ) {
Timber.d("Do LE scan before connecting to device"); Timber.d("Do LE scan before connecting to device");
central.scanForPeripheralsWithAddresses(new String[]{macAddress}); central.scanForPeripheralsWithAddresses(new String[]{macAddress});

View File

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

View File

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