I am using Delphi 10.3.2 build 6593 to compile an app that works fine in 10.2.3 build 2631. It has it's own Service. Since the SDK API level is now 28, I must specifically code for the permissions I need, but I don't know how to request for ForeGroundService permission.
There's no correlation here with any Android Java documentation I could find on this issue. This is a specific Delphi implementation for Android.
The constant I need is absent from Androidapi.JNI.Os
. As a result, the Android Pie phone reports
Foreground Service permission was not granted
I'm going to imagine that Embarcadero has some catching up to do, and this problem will be resolved in 10.3.3 when it's released. Can anyone confirm this, or provide comments or a solution. Thanks.
private
FPermittoVibrate: Boolean;
FVibratePermission: String;
FPermitAccessFineLocation: Boolean;
FAccessFineLocation: String;
FPermitNetworkState: Boolean;
FNetworkStatePermission: String;
FPermitWifiState: Boolean;
FWifiStatePermission: String;
FPermitPhoneState: Boolean;
FPhoneStatePermission: String;
FPermitForeGroundService: Boolean;
FForegroundServicePermission: String;
procedure TfrmTabbed.FormCreate(Sender: TObject);
begin
FPermittoVibrate := False;
FVibratePermission := JStringToString(TJManifest_permission.JavaClass.VIBRATE);
FPermitAccessFineLocation := False;
FAccessFineLocation := JStringToString(TJManifest_permission.JavaClass.ACCESS_FINE_LOCATION);
FPermitNetworkState := False;
FNetworkStatePermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_NETWORK_STATE);
FPermitWifistate := False;
FWifiStatePermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_WIFI_STATE);
FPermitPhoneState := False;
FPhoneStatePermission := JStringToString(TJManifest_permission.JavaClass.READ_PHONE_STATE);
FPermitForeGroundService := False;
FForegroundServicePermission := JStringToString(TJManifest_permission.JavaClass.??? // <====
procedure TfrmTabbed.FormShow(Sender: TObject);
begin
PermissionsService.RequestPermissions([
FVibratePermission
, FAccessFineLocation
, FNetworkStatePermission
, FWifiStatePermission
, FPhoneStatePermission
, FForeGroundServicePermission
],
PermissionResult, PermissionRequest
);
procedure TfrmTabbed.PermissionResult(Sender: TObject;
const APermissions: TArray<string>;
const AGrantResults: TArray<TPermissionStatus>);
var
Permission: String;
i: Integer;
begin
for i := 0 to High(APermissions) do
begin
Permission := APermissions[i];
if Permission = FVibratePermission then
FPermitToVibrate := AGrantResults[i] = TPermissionStatus.Granted
else if Permission = FAccessFineLocation then
FPermitAccessFineLocation := AGrantResults[i] = TPermissionStatus.Granted
else if Permission = FNetworkStatePermission then
FPermitNetworkState := AGrantResults[i] = TPermissionStatus.Granted
else if Permission = FWifiStatepermission then
FPermitWifiState := AGrantResults[i] = TPermissionStatus.Granted
else if Permission = FPhoneStatePermission then
FPermitPhoneState := AGrantResults[i] = TPermissionStatus.Granted
else if Permission = FForeGroundServicePermission then
FPermitForeGroundService := AGrantResults[i] = TPermissionStatus.Granted
;
end;
if FPermitForeGroundService then
// START(ing)_NOT_STICKY
StartService;
In case you're wondering, the other permissions I requested, are indeed granted using this code, so that's alright. It's only the ForegroundService permission that isn't granted (at runtime).
Addendum