serser Опубликовано 24 марта, 2019 Поделиться Опубликовано 24 марта, 2019 Помогите достать JPendingIntent из JIntent. Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult. Делаю так: var Parcel: JParcelable; PIntent: JPendingIntent; begin Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent')); PIntent := Parcelable ; ... end; Получается ошибка: E2010 Incompatible types: 'JPendingIntent' and 'JParcelable' Как приводить эти интерфейсы друг к другу? Цитата Ссылка на комментарий
0 mazayhin Опубликовано 24 марта, 2019 Поделиться Опубликовано 24 марта, 2019 59 минут назад, serser сказал: Помогите достать JPendingIntent из JIntent. Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult. Делаю так: var Parcel: JParcelable; PIntent: JPendingIntent; begin Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent')); PIntent := Parcelable ; ... end; Получается ошибка: E2010 Incompatible types: 'JPendingIntent' and 'JParcelable' Как приводить эти интерфейсы друг к другу? Проверить возможности нет, но скорее всего PIntent := JPendingIntent(Parcelable); Ingalime 1 Цитата Ссылка на комментарий
0 serser Опубликовано 24 марта, 2019 Автор Поделиться Опубликовано 24 марта, 2019 (изменено) 13 часов назад, mazayhin сказал: PIntent := JPendingIntent(Parcelable); Получается Segmentation fault PIntent на момент присваивания = nil И это явно не простое присваивание, потому что во время него 10 раз в логе пишется switching thread, потом появляется эксепшн. Передаю интент в сервис так: class procedure TssAndroidServiceHelper.StartService(const AServiceName: string; AIntent: JIntent); var PendingIntent: JPendingIntent; begin PendingIntent := TAndroidHelper.Activity.createPendingResult(1, AIntent, 0); AIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(AServiceName)); AIntent.putExtra(StringToJString('q'), JParcelable(PendingIntent)); TAndroidHelper.Activity.startService(AIntent); end; Получаю так: TDM = class(TAndroidService) function AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; procedure AndroidServiceCreate(Sender: TObject); private FPIntent: JPendingIntent; FStr: string; FThread: TssThread; procedure StartThread; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var ResultIntent: JIntent; Parcelable: JParcelable; begin Parcelable := Intent.getParcelableExtra(StringToJString('q')); FPIntent := JPendingIntent(Parcelable); ResultIntent := TJIntent.Create; ResultIntent.putExtra(StringToJString('res'), StringToJString('content')); FPIntent.send(TAndroidHelper.Context, 7, ResultIntent); Result := TJService.JavaClass.START_STICKY; end; Есть еще идеи как вытащить отложенное намерение? Изменено 24 марта, 2019 пользователем serser Цитата Ссылка на комментарий
0 mazayhin Опубликовано 25 марта, 2019 Поделиться Опубликовано 25 марта, 2019 13 часов назад, serser сказал: Получается Segmentation fault PIntent на момент присваивания = nil И это явно не простое присваивание, потому что во время него 10 раз в логе пишется switching thread, потом появляется эксепшн. Передаю интент в сервис так: class procedure TssAndroidServiceHelper.StartService(const AServiceName: string; AIntent: JIntent); var PendingIntent: JPendingIntent; begin PendingIntent := TAndroidHelper.Activity.createPendingResult(1, AIntent, 0); AIntent.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString(AServiceName)); AIntent.putExtra(StringToJString('q'), JParcelable(PendingIntent)); TAndroidHelper.Activity.startService(AIntent); end; Получаю так: TDM = class(TAndroidService) function AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; procedure AndroidServiceCreate(Sender: TObject); private FPIntent: JPendingIntent; FStr: string; FThread: TssThread; procedure StartThread; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var ResultIntent: JIntent; Parcelable: JParcelable; begin Parcelable := Intent.getParcelableExtra(StringToJString('q')); FPIntent := JPendingIntent(Parcelable); ResultIntent := TJIntent.Create; ResultIntent.putExtra(StringToJString('res'), StringToJString('content')); FPIntent.send(TAndroidHelper.Context, 7, ResultIntent); Result := TJService.JavaClass.START_STICKY; end; Есть еще идеи как вытащить отложенное намерение? Опять же, повторюсь, нет возможности проверить, и особо времени нет вникнуть. Только, кажется, все немного усложнили вы себе с этой посылкой. У PendingIntent есть метод readPendingIntentOrNullFromParcel(Parcel in) который как раз вычитывает его из посылки. Напрямую да, не получится привести их. Цитата Ссылка на комментарий
0 serser Опубликовано 31 марта, 2019 Автор Поделиться Опубликовано 31 марта, 2019 На самом деле нужно делать так: TJParcelable.Wrap((PendingIntent as ILocalObject).GetObjectID) и TJPendingIntent.Wrap((Parcelable as ILocalObject).GetObjectID) Но ожидаемого результата использования TAndroidHelper.Activity.createPendingResult не получилось. После TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, HandleActivityMessage); HandleActivityMessage не получает результат из сервиса с помощью PendingIntent.send. Будь неладен тот день для ider-ы, когда я решил написать приложение с сервисом на дельфи, уже два месяца я не могу получить результат от сервиса:то 1. createPendingResult приложение не получает результат. 2. для resultReceiver не хватает возможности получить результат в активити - переопределить onReceiveResult Остаются способы PendingResult.getAction и PendingResylt.getBroadcast. Первый способ ( ) - уродский, уж извините, если закрыть приложение оно опять появится после ответа сервиса. Второй, только его и остается проверить. Но идеологически он кажется неверным - использовать рассылку сообщений всей системе для своего, между мальчиками, общения тоже неверно. Получается нельзя тут взрослое приложение-то сделать , только кошечек рисовать. Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 31 марта, 2019 Поделиться Опубликовано 31 марта, 2019 6 часов назад, serser сказал: Получается нельзя тут взрослое приложение-то сделать , только кошечек рисовать. в iOS вообще нет понятия сервисов и это не мешает разрабатывать взрослые приложения. попробуйте изменить логику приложения. расскажите в двух словах, что вы хотите в принципе сделать, не технически, а какой функционал нужен? Цитата Ссылка на комментарий
Вопрос
serser
Помогите достать JPendingIntent из JIntent.
Пытаюсь из сервиса получить отложенный интент, созданный с помощью TAndroidHelper.Activity.createPendingResult.
Делаю так:
var
Parcel: JParcelable;
PIntent: JPendingIntent;
begin
Parcelable := Intent.getParcelableExtra(StringToJString('pendingintent'));
PIntent := Parcelable ;
...
end;
Получается ошибка:
E2010 Incompatible types: 'JPendingIntent' and 'JParcelable'
Как приводить эти интерфейсы друг к другу?
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.