使用Delphi开发Android应用:GPS仅首次自动激活,需触发用户开启提示
解决方案
你的代码仅处理了位置权限的申请,但未检查GPS服务是否实际启用,也没有引导用户开启的逻辑。要实现引导用户手动开启GPS的功能,需要在权限授予后,先判断GPS状态,若未开启则弹出提示并引导至系统设置界面。
步骤说明
- 权限申请通过后,调用Android原生API检查GPS服务是否启用
- 若GPS未启用,弹出对话框提示用户,点击确认后跳转至系统位置设置界面
- 用户开启GPS返回后,再激活LocationSensor
修改后的代码
uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Sensors, FMX.Sensors.Android, FMX.Permissions, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Location, Androidapi.JNI.Net, Androidapi.JNI.App, Androidapi.JNI.OS, Androidapi.Helpers; procedure TForm3.Button1Click(Sender: TObject); const permAccess = 'android.permission.ACCESS_FINE_LOCATION'; permCoarse = 'android.permission.ACCESS_COARSE_LOCATION'; // 检查GPS服务是否启用 function IsGPSEnabled: Boolean; var LocationManager: JLocationManager; begin LocationManager := TJLocationManager.Wrap(TAndroidHelper.Context.getSystemService(TJContext.JavaClass.LOCATION_SERVICE)); Result := LocationManager.isProviderEnabled(TJLocationManager.JavaClass.GPS_PROVIDER); end; // 跳转到系统位置设置界面 procedure OpenLocationSettings; var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJSettings.JavaClass.ACTION_LOCATION_SOURCE_SETTINGS); TAndroidHelper.Activity.startActivity(Intent); end; begin {$IFDEF ANDROID} PermissionsService.RequestPermissions([permAccess], procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray) begin if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then begin if IsGPSEnabled then // GPS已开启,激活传感器 LocationSensor1.Active := True else begin // GPS未开启,提示用户并引导至设置 if MessageDlg('需要开启GPS定位服务', TMsgDlgType.mtInformation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0) = mrYes then OpenLocationSettings; end; end else begin ShowMessage('定位权限未授予,无法使用定位功能'); end; end); {$ENDIF} end;
补充说明
IsGPSEnabled函数通过Android原生的LocationManager判断GPS服务的启用状态OpenLocationSettings函数创建系统跳转Intent,直接打开位置源设置界面- 若需要在用户从设置返回后自动检测GPS状态,可在Form的
OnActivate事件中添加GPS状态检查逻辑,自动激活LocationSensor
内容的提问来源于stack exchange,提问作者Olaf
相关产品推荐
相关产品推荐

