我正在使用Delphi 10.3.2 build 6593来编译在10.2.3 build 2631中可以正常运行的应用程序。它具有自己的Service。由于SDK API的级别现在为28,因此我必须为所需的权限专门编码,但是我不知道如何请求ForeGroundService权限。
这里与我在这个问题上可以找到的任何Android Java文档都没有关联。这是Android的特定Delphi实现。
Androidapi.JNI.Os
中缺少我需要的常数。结果,Android Pie手机报告
未授予前台服务权限
我将想象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权限。
附录
请在JIRA票证(https://quality.embarcadero.com/browse/RSP-26485?focusedCommentId=71801&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-71801)中给您提供其他信息。请告诉我们是否有帮助。
非常感谢,
HorácioFilho