Ingalime Опубликовано 8 февраля, 2022 Поделиться Опубликовано 8 февраля, 2022 Здравствуйте. У меня есть код музыкального плеера со службой переднего плана. Сделано в RAD 10.4.2 и все работает. При попытке откомпилировать код в RAD 11 получаю ошибку: [DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'JNotificationCompat_Builder' function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var //Android 8.1, 9 ServiceChannel: JNotificationChannel; NotificationManager: JNotificationManager; Obj: JObject; NewIntent: JIntent; ncb: JNotificationCompat_Builder;//тут ошибка ntf: JNotification; PendingIntent: JPendingIntent; //************* Подскажите, пожалуйста, как исправить. Цитата Ссылка на комментарий
0 haword Опубликовано 8 февраля, 2022 Поделиться Опубликовано 8 февраля, 2022 больше не поддерживается это. ищите как это делаться в новой версии. Цитата Ссылка на комментарий
0 Ingalime Опубликовано 14 февраля, 2022 Автор Поделиться Опубликовано 14 февраля, 2022 После изменения на TJapp_NotificationCompat_Builder ошибка ушла. Источник: https://stackoverflow.com/questions/69811459/how-do-i-use-the-new-interface-function-names-in-delphi-11s-androidapi-jni-supp Однако теперь приложение просто показывает заставку и не запускается. Висит на заставке. Код службы переднего плана теперь такой. Извините за код это солянка собранная в интернете и она без проблем работает в RAD 10.4 на всех версиях андроида, а вот в RAD 11 что упущено мною или не правильно вставила код. Может подскажите... unit Unit1; interface uses System.SysUtils, System.Classes, System.Android.Service, AndroidApi.JNI.GraphicsContentViewText, Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.JNI.Support, Androidapi.JNI.JavaTypes, Androidapi.Helpers, Androidapi.JNIBridge, Androidapi.Jni, System.Notification; type TDM = class(TAndroidService) function AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; private { Private declarations } public { Public declarations } end; var DM: TDM; implementation {%CLASSGROUP 'FMX.Controls.TControl'} {$R *.dfm} function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var //Android 8.1, 9 ... ServiceChannel: JNotificationChannel; NotificationManager: JNotificationManager; Obj: JObject; NewIntent: JIntent; ////ncb: JNotificationCompat_Builder; {$if COMPILERVERSION > 34} ncb: Japp_NotificationCompat_Builder; {$else} ncb: JNotificationCompat_Builder; {$endif} ntf: JNotification; PendingIntent: JPendingIntent; //Android 7.1 service : JService; serviceObjectId : Pointer; ntf2 : JNotification; intent2 : JIntent; PendingIntent2 : JPendingIntent; begin Result := TJService.JavaClass.START_NOT_STICKY; // can't ref .O on earlier phones, must hardcode if TJBuild_VERSION.JavaClass.SDK_INT > 26 then // JBuild_VERSION_CODES.JavaClass.O begin //Android 8.1 //new ways for SDK > 26 (won't be called when API < 26 anyways) try ServiceChannel := TJNotificationChannel.JavaClass.init( StringtoJString('com.radio.one'), //CHANNEL_ID StrToJCharSequence('Public radio Channel'), TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT ); Obj := TAndroidHelper.Context.getSystemService( TJContext.JavaClass.NOTIFICATION_SERVICE); NotificationManager := TJNotificationManager.Wrap(Obj); NotificationManager.createNotificationChannel(ServiceChannel); NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage( TAndroidHelper.Context.getPackageName()); NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN); NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER); NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); PendingIntent := TJPendingIntent.JavaClass.getActivity( TAndroidHelper.Context, 0, NewIntent, TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK ); (* ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') *) {$if COMPILERVERSION > 34} ncb := TJapp_NotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); {$else} ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); {$endif} ncb.setContentTitle(StrToJCharSequence('PublicRadio Service')); // ncb.setTicker(StrToJCharSequence('MyCommsService')); // can't remember why this is commented out to be honest ncb.setSmallIcon(JavaService.getApplicationInfo.icon); ncb.setContentIntent(PendingIntent); ncb.setOngoing(True); ntf := ncb.build; JavaService.startForeground(StartId, ntf); except exit; end; end else begin //Android 7.1 try serviceObjectId := (JavaService as ILocalObject).GetObjectID; service := TJService.Wrap(serviceObjectId); /////ntf2 := TJNotification.Create; ////ntf2.icon := service.getApplicationInfo.icon; NewIntent:= TAndroidHelper.Context.getPackageManager().getLaunchIntentForPackage( TAndroidHelper.Context.getPackageName()); NewIntent.setAction(TJIntent.JavaClass.ACTION_MAIN); NewIntent.addCategory(TJIntent.JavaClass.CATEGORY_LAUNCHER); NewIntent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK); PendingIntent2 := TJPendingIntent.JavaClass.getActivity( TAndroidHelper.Context, 0, NewIntent, TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK ); (* ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') *) {$if COMPILERVERSION > 34} ncb := TJapp_NotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); {$else} ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); {$endif} //intent2 := TJIntent.Create; //PendingIntent2 := TJPendingIntent.JavaClass.getActivity(service.getApplicationContext, 0, intent2, 0); ncb.setContentTitle(StrToJCharSequence('PublicRadio')); // ncb.setTicker(StrToJCharSequence('MyCommsService')); ncb.setSmallIcon(JavaService.getApplicationInfo.icon); ncb.setContentIntent(PendingIntent2); ncb.setOngoing(True); ntf2 := ncb.build; ntf2.setLatestEventInfo(service.getApplicationContext, StrToJCharSequence('PublicRadio'), StrToJCharSequence('PublicRadio Service'), PendingIntent2); service.startForeground(StartId, ntf2); except exit; end; end; end; end. Цитата Ссылка на комментарий
0 Ingalime Опубликовано 17 февраля, 2022 Автор Поделиться Опубликовано 17 февраля, 2022 А можно ли, в качестве решения, добавить в проект Androidapi.JNI.Support из RAD 10.4.2. Или так делать нельзя? Цитата Ссылка на комментарий
0 OnePeople Опубликовано 17 февраля, 2022 Поделиться Опубликовано 17 февраля, 2022 https://github.com/Embarcadero/RADStudio11Demos/blob/main/Object Pascal/Multi-Device Samples/Device Sensors and Services/Foreground Location Tracking Ingalime 1 Цитата Ссылка на комментарий
0 Ingalime Опубликовано 9 марта, 2022 Автор Поделиться Опубликовано 9 марта, 2022 Нет, не соображу как этот код для службы модифицировать под обычный музыкальный плеер. Цитата Ссылка на комментарий
Вопрос
Ingalime
Здравствуйте. У меня есть код музыкального плеера со службой переднего плана. Сделано в RAD 10.4.2 и все работает.
При попытке откомпилировать код в RAD 11 получаю ошибку:
[DCC Error] Unit1.pas(50): E2003 Undeclared identifier: 'JNotificationCompat_Builder'
function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; var //Android 8.1, 9 ServiceChannel: JNotificationChannel; NotificationManager: JNotificationManager; Obj: JObject; NewIntent: JIntent; ncb: JNotificationCompat_Builder;//тут ошибка ntf: JNotification; PendingIntent: JPendingIntent; //*************
Подскажите, пожалуйста, как исправить.
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.