Я использую Delphi 10.3.2 build 6593 для компиляции приложения, которое отлично работает в 10.2.3 build 2631. У него есть собственный сервис. Поскольку уровень API SDK теперь равен 28, я должен специально кодировать необходимые мне разрешения, но я не знаю, как запросить разрешение ForeGroundService.
Здесь нет корреляции с какой-либо документацией по Android Java, которую я мог найти по этой проблеме. Это конкретная реализация Delphi для Android.
Необходимая мне константа отсутствует в Androidapi.JNI.Os
. В результате телефон Android Pie сообщает
Разрешение службы Foreground Service не было предоставлено
Я собираюсь представить, что Embarcadero нужно кое-что наверстать, и этопроблема будет решена в 10.3.3, когда она будет выпущена. Может кто-нибудь подтвердить это, или предоставить комментарии или решение. Спасибо.
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;
Если вам интересно, остальные запрошенные мной разрешения действительно предоставляются с использованием этого кода, так что все в порядке. Только разрешение ForegroundService не предоставляется (во время выполнения).
Приложение