DELPHI安卓動態權限申請
安卓8.0以前的版本,只需要給靜態權限就可以了,但安卓8.0及以后的版本,還需要運行期用代碼動態申請權限。
下面以《藍牙權限》為例,其他權限類似。
Delphi 10.3 社區版,提供的 Sample 里面有一個例子程序在:
C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\Bluetooth\BLEScanner
這個例子程序提供了打開 BLE 的時候的動態權限驗證的例子代碼。
首先,在 IDE 的 Project - Options 菜單彈出來的窗口里面,找到左邊樹結構的: Application -- Uses Permissions 項目,則右邊會出來一堆權限讓你打勾。這里要勾選上 Bluetooth 和 Bluetooth admin 兩項。
老的安卓版本,勾選這兩項就可以了。
新的安卓版本,還需要運行期用代碼動態申請權限。
代碼里面:
首先要實現一個函數:
procedure RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
這個函數是一個動態申請權限的結果的回調函數。
在啟動 BLE 的時候,通過以下代碼申請權限:
PermissionsService.RequestPermissions([FLocationPermission], RequestPermissionsResult, DisplayRationale);
上述的代碼的 PermissionsService 是聲明在 System.Permissions 里面的。
上述代碼里面的 RequestPermissionsResult 就是前面的那個回調函數。它在這里被調用,而且還被填入參數。
上述代碼里面的 FLocationPermission: string; 它來自:
procedure TForm6.FormCreate(Sender: TObject);
begin
{$IFDEF ANDROID}
FLocationPermission := JStringToString(TJManifest_permission.JavaClass.ACCESS_COARSE_LOCATION);
{$ENDIF}
end;
上述代碼里面用到的 JStringToString 要 Uses Androidapi.Helpers;
上述代碼中還有一個 DisplayRationale 也是一個函數:
procedure TForm6.DisplayRationale(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc);
begin
TDialogService.ShowMessage('We need to be given permission to discover BLE devices',
procedure(const AResult: TModalResult)
begin
APostRationaleProc;
end)
end;
在 RequestPermissionsResult 這個函數里面,判斷是否通過權限,如果通過,才去調用藍牙的方法。
procedure TForm6.RequestPermissionsResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>);
begin
// 1 permissions involved: ACCESS_COARSE_LOCATION
if (Length(AGrantResults) = 1) and (AGrantResults[0] = TPermissionStatus.Granted) then
StartBLEDiscovery
else
TDialogService.ShowMessage('Cannot start BLE scan as the permission has not been granted');
end;