Перейти к содержанию
Fire Monkey от А до Я
  • 0

NotificationCenter в сервисе


Rusland

Вопрос

Пытаюсь из сервиса выдать уведомление: 

procedure TAndroidServiceDM.SendNotify(AlertName,AlertBody:String);
var
  Notification: TNotification;
begin
  Notification := NotificationC.CreateNotification;
  try
    Notification.Name := AlertName;
    Notification.AlertBody := AlertBody;
    Notification.FireDate := Now;

    NotificationC.ScheduleNotification(Notification);
  finally
    Notification.DisposeOf;
  end;
end;
...
// пытаюсь вызвать
SendNotify('Attention','Тревога');

Вроде не UI использую, но получаю ошибку Segmentation fault 11.

Ошибка происходит в System.Android.Notification в строке 208-209

  LaunchIntent := TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage(TAndroidHelper.Context.getPackageName());
  AIntent.putExtra(TJNotificationInfo.JavaClass.EXTRA_ACTIVITY_CLASS_NAME, LaunchIntent.getComponent().getClassName());

Снова похоже на обращение к Activity (а может что-то другое).

 

Есть решение как обойти эту проблему?

 

 

PS. Delphi RX

Изменено пользователем Rusland
Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы

через интент передать основной и там вызвать, в демо-проекте вроде четко показано как нужно делать

Ссылка на комментарий
  • 0

Cтандартный пример \Object Pascal\Multi-Device Samples\Device Sensors and Services\AndroidNotificationServiceDemo\NotificationServiceDemo.groupproj

не содержит никаких интент (ZuBy, где вы их там увидели?), здесь простейший код:

 
function TNotificationServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags,
  StartId: Integer): Integer;
begin
  LaunchNotification;
  JavaService.stopSelf;
  Result := TJService.JavaClass.START_STICKY;
end;

procedure TNotificationServiceDM.LaunchNotification;
var
  MyNotification: TNotification;
begin
  MyNotification := NotificationCenter1.CreateNotification;
  try
    MyNotification.Name := 'ServiceNotification';
    MyNotification.Title := 'Android Service Notification';
    MyNotification.AlertBody := 'RAD Studio 10 Seattle';
    MyNotification.FireDate := IncSecond(Now, 8);
    NotificationCenter1.ScheduleNotification(MyNotification); // Segmentation Fault 11
  finally
    MyNotification.Free;
  end;
end; 

и он у меня РАБОТАЕТ.

 

Но как только я переношу процедуру в свой проект, то на строке NotificationCenter1.ScheduleNotification(MyNotification);

вылетает Segmentation Fault 11.

 

Сейчас пересоздам пустой проект, начну наполнять его тем же что есть в моем изначальном проекте и постараюсь воспроизвести ошибку.

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

 

Cтандартный пример \Object Pascal\Multi-Device Samples\Device Sensors and Services\AndroidNotificationServiceDemo\NotificationServiceDemo.groupproj

не содержит никаких интент (ZuBy, где вы их там увидели?), здесь простейший код:

 
function TNotificationServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags,
  StartId: Integer): Integer;
begin
  LaunchNotification;
  JavaService.stopSelf;
  Result := TJService.JavaClass.START_STICKY;
end;

procedure TNotificationServiceDM.LaunchNotification;
var
  MyNotification: TNotification;
begin
  MyNotification := NotificationCenter1.CreateNotification;
  try
    MyNotification.Name := 'ServiceNotification';
    MyNotification.Title := 'Android Service Notification';
    MyNotification.AlertBody := 'RAD Studio 10 Seattle';
    MyNotification.FireDate := IncSecond(Now, 8);
    NotificationCenter1.ScheduleNotification(MyNotification); // Segmentation Fault 11
  finally
    MyNotification.Free;
  end;
end; 

и он у меня РАБОТАЕТ.

 

Но как только я переношу процедуру в свой проект, то на строке NotificationCenter1.ScheduleNotification(MyNotification);

вылетает Segmentation Fault 11.

 

Сейчас пересоздам пустой проект, начну наполнять его тем же что есть в моем изначальном проекте и постараюсь воспроизвести ошибку.

 

 

Я попытался использовать Ваш пример вызова приложения из сервиса, и столкнулся именно с такой же ситуацией, если из манифеста убрать лишние фильтры, то работает центр нотификации, но перестает работать вызов, если добавить обратно то перестает работать центр нотификации но работает вызов. Как исправить не знаю, но у меня было такое наблюдение.

Изменено пользователем YuraProff
Ссылка на комментарий
  • 0

Кстати, в последнее время у меня не работает стандартный пример DownloadServiceDemo (а может и никогда не работал). Возможно эти два случая как-то связаны.

Ссылка на комментарий
  • 0

Кстати, в последнее время у меня не работает стандартный пример DownloadServiceDemo (а может и никогда не работал). Возможно эти два случая как-то связаны.

 

 

У меня и до не работала, хотя просто подозреваю что в примере не корректная ссылка на изображение

Ссылка на комментарий
  • 0

У меня и до не работала, хотя просто подозреваю что в примере не корректная ссылка на изображение

Я менял ссылку, на проверенную, все равно отказывается скачивать.

 

Так, создал проект с нуля, подцепил ту же процедуру и она работает, уведомление в шторку приходит... видимо в старом проекте что-то используется что мешает работе... воспроизвести ошибку не удается.

 

Стоп, опять проявилась болезнь...

 

В общем это происходит после того как я добавляю в программе в AndroidManifest.template.xml:

 

                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:mimeType="text/pas" />

для общения через Intent.

Проект приложил, проверьте пожалуйста.

NotificationAppService.zip

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

Подозреваю что проблема в использовании Andropidapi.Helpers в сервисе. (Багрепорт)

Можно как-то от нее избавиться?

Сейчас она нужна для функции StringToJString.

Intent.setType(StringToJString('text/pas'));

Можно ли чем-то заменить?

 

PS. Изменения в Andropidapi.Helpers согласно багрепорту не помогли

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

В стандартном примере "NotificationServiceDemo" в приложении и в сервисе два TNotificationCenter.

Не могу понять, как они связаны друг с другом?

1. Сервис выполняет отправку нотификации у себя в процедуре "procedure TNotificationServiceDM.LaunchNotification;"

2. Появляется вверху уведомление.

3. Я по нему делаю тап.

4. В главном приложении выполняется приём сообщения.

Но связи в исходниках я не вижу. Кто-то может пояснить чуть подробнее?

Ссылка на комментарий
  • 0

Всё делаю, как в примере. Но в итоге при нажатии на кнопку старта сервиса приложение падает.

Проект приложил к письму.

Может кто сможет найти проблему, что не так?

Спасибо.

FMXService.rar

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...