Android 通知許可權

耗喜天涯發表於2024-12-08

>> 在 AndroID 13 中引入了通知許可權: android.permission.POST_NOTIFICATIONS

在 AndroID 13 之前,可以直接透過 NotificationCenter 控制元件來傳送訊息;

在 AndroID 13 之後,需要動態申請此許可權,才可以傳送通知;

>> 動態許可權申請

procedure TForm1.Button1Click(Sender: TObject);
var
  tmpPermissions: TArray<string>;
begin
  // 從AndroID 13 開始,通知許可權需要申請
  if TJBuild_Version.JavaClass.SDK_INT > 32 then
  begin
    tmpPermissions :=
      [JStringToString(TJManifest_permission.JavaClass.POST_NOTIFICATIONS)];
    // 申請許可權
    Permissionsservice.RequestPermissions(tmpPermissions,
      RequestPermissionsResult, DisplayRationale);
  end
  else  //低於此版本的,直接傳送通知
    SendNotification;
end;

  *** 若只是動態 申請,經測試,在AndroID14手機上,還是無法彈出授權彈窗;

  *** 經查,需要在 AndroidManifest.xml 文件中,要申請通知許可權,之後在程式碼中動態申請許可權,才會彈窗;

<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

>> 通知傳送

procedure TForm1.SendNotification;
var
  tmpNotification: TNotification;
  tmpDelay: Integer;
begin
  // tmpNotification := TNotification.Create;
  tmpNotification := NotificationCenter1.CreateNotification;
  try
    tmpNotification.Name := edt_Name.Text; // 唯一
    tmpNotification.Title := edt_Title.Text; // 標題
    tmpNotification.AlertBody := edt_Body.Text; // 名稱

    tmpNotification.Number := 66; //數量

    tmpNotification.AlertAction := '檢視來源';
    tmpNotification.HasAction := True;

    tmpDelay := StrToIntDef(edt_Delay.Text, 0);
    if tmpDelay > 0 then
    begin
      tmpNotification.FireDate := IncSecond(Now, tmpDelay);
      NotificationCenter1.ScheduleNotification(tmpNotification)
    end
    else
      NotificationCenter1.PresentNotification(tmpNotification);
  finally
    tmpNotification.Free;
  end;
end;

相關文章