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

Ingalime

Пользователи
  • Постов

    354
  • Зарегистрирован

  • Посещение

  • Победитель дней

    5

Весь контент Ingalime

  1. Код найден в Интернете и он работает отлично на моем Андроид 8.1 Зачем у автора эта строка, непонятно... if TJBuild_VERSION.JavaClass.SDK_INT > TJBuild_VERSION_CODES.JavaClass.O Что-то связанно с открытием канала...
  2. Ingalime

    Aндроид падение службы

    Здравствуйте. Есть код службы переднего фона которая прекрасно работает на Андроид 8.1 Послала арк человеку у которого Андроид 7. Приложение падает после сплеш скрина. Я думаю что ошибка в последнем begin end. Телефона с Андроид 7 у меня нет. Не подскажите что там исправить? RAD 10.3 Спасибо. 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; 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 ServiceChannel: JNotificationChannel; NotificationManager: JNotificationManager; Obj: JObject; NewIntent: JIntent; ncb: JNotificationCompat_Builder; ntf: JNotification; PendingIntent: JPendingIntent; begin Result := TJService.JavaClass.START_NOT_STICKY; if TJBuild_VERSION.JavaClass.SDK_INT > TJBuild_VERSION_CODES.JavaClass.O then begin // 28 > 26 ServiceChannel := TJNotificationChannel.JavaClass.init( StringtoJString('com.radio.one'), StrToJCharSequence('Public radio Channel'), TJNotificationManager.JavaClass.IMPORTANCE_DEFAULT ); Obj := TAndroidHelper.Context.getSystemService( TJContext.JavaClass.NOTIFICATION_SERVICE); NotificationManager := TJNotificationManager.Wrap(Obj); NotificationManager.createNotificationChannel(ServiceChannel); PendingIntent := TJPendingIntent.JavaClass.getActivity( JavaService.getApplicationContext, 0, Intent, 0 ); ncb := TJNotificationCompat_Builder.JavaClass.init( TAndroidHelper.Context, StringToJString('com.radio.one') ); ncb.setContentTitle(StrToJCharSequence('PublicRadio')); // ncb.setTicker(StrToJCharSequence('Communications Service')); ncb.setSmallIcon(JavaService.getApplicationInfo.icon); ncb.setContentIntent(PendingIntent); ncb.setOngoing(True); ntf := ncb.build; end else begin // earlier notification code (worked under 10.2.3, targetting API 14) PendingIntent := TJPendingIntent.JavaClass.getActivity( JavaService.getApplicationContext, 0, Intent, 0 ); ntf := TJNotification.Create; ntf.icon := JavaService.getApplicationInfo.icon; ntf.setLatestEventInfo( JavaService.getApplicationContext, StrToJCharSequence('PublicRadio'), StrToJCharSequence('PublicRadioService'), PendingIntent); end; JavaService.startForeground(StartId, ntf); end; end.
  3. Я так поняла что в Androidapi.JNI.App надо метод переписать так: procedure startForeground(id: Integer; notification: JNotification; foregroundServiceType: Integer); cdecl; А какие следующие шаги чтобы код службы увидел это обновление? Спасибо.
  4. Может как то по другому можно вызвать службу в RAD10.4.1 для API29? Мне просто надо запустить Foreground службу. Больше от нее ничего не требуется...
  5. Спасибо. Подскажите как правильно добавить третий параметр в код запуска службы? JavaService.startForeground(StartId, ntf, 2);//too many actual parametrs В выпадающем списке нет варианта с тремя параметрами. Рис. В манифесте <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />
  6. Короче не работает. Служба стартует, но она не foreground. Если свернуть приложение, служба перестает работать через пару минут. Предложенное выше решение устарело и не подходит т.к. оно работает для sdk 28. Гугл маркет требует с августа sdk 29. Таким образом как создать простую foreground службу в 10.4.1 остаётся не решенным вопросом.
  7. Слетела галочка в разрешениях в опциях проекта foreground service. Однако установка ее не помогла - нет значка службы в трее... P.S. Странно значка нет, а в запущенных приложениях служба есть. В 10.3.3 был значок в трее...
  8. После компиляции проекта в 10.4.1 служба перестала запускаться, хотя сам проект запускается без проблем и работает. Дебаггер с моим телефоном Readme 5A Андроид 8.1 не работает. Нет значка службы вверху в трее. Может кто из специалистов глянет и поправит код службы чтобы запускалась... 1. Тут проект. Прошу прощения за размер. SO файлы большие. Скачать: BASS плеер 2. Папка delphi82 копируется сюда: C:\Users\Lena\Documents\Embarcadero\Studio\Projects Соответственно пути в опциях проекта для BASS: C:\Users\Lena\Documents\Embarcadero\Studio\Projects\delphi82\bass-android-test\arm64-v8a; C:\Users\Lena\Documents\Embarcadero\Studio\Projects\delphi82\bass-android-test\armeabi; C:\Users\Lena\Documents\Embarcadero\Studio\Projects\delphi82\bass-android-test\armeabi-v7a 3. Открыть ProjectGroupPublicRadio.groupproj Run PublicRadio Спасибо.
  9. Ingalime

    [Android]RAD10.4.1

    После установки любой студии в папке, например: C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\tools можно было запустить окно как на прилагаемом рисунке. После установки RAD10.4.1 папки PlatformSDKs нет. Хотя при инсталляции было указано, чтобы Андроид был установлен. Как вызвать это окно для 10.4.1? Спасибо.
  10. Ingalime

    Android Services 64 бит

    Здравствуйте. Такой вопрос: Создаю Андроид сервис выбор платформы -> 64 бит. Делаю Build. В хост приложение Андроид 64 бит добавляю этот сервис. Согласно описанию должен добавиться jar файл: The Java archive, <project_name>.jar file. The jar file is added to the Libraries node on the Project Manager, under the Android target platform. Да, этот файл <project_name>.jar добавляется в Libraries. Однако он почему-то попадает в Libraries хост приложения где таргет Андроид 32. В таргете Libraries Андроид 64 его нет. Это так и должно быть?
  11. Подскажите, пожалуйста, ответы на такие вопросы: 1. Для публикации в маркете SDK должен быть равен 29 не ниже? 2. В приложении присутствует пункт меню Donate (Помощь проекту). При переходе в этот пункт меню просто открывается форма с номером банковской карты на которую можно перевести пожертвование и есть ссылка на сайт банка этой банковской карты. Не является и это каким то нарушением для гугул маркета? Спасибо.
  12. Так и планируется. На сайте уже работающего интернет радио, просто будет дополнительно ссылка для скачивания арк, для тех кто захочет иметь это радио на телефоне в удобном интерфейсе... Поэтому гугл плей с его всякого рода ограничениями особо и не нужен. Можно и напрямую выложить арк на сервере радио, но врядли подьзователя порадуют при установки сообщения типа: Внимание опасно! Включите установку из неизвестных источников! И т.п.
  13. А на Амазон сложно опубликовать?
  14. Если получаешь бан на аккаунт, то из маркета проподут все приложения аккаунта? P.S. У Амазона тоже можно публиковать включая и 32 битные приложения. Есть у кого опыт?
  15. Проблемка. На Андроид 8.1 все нормально. Запускается приложение и значок службы вверху присутствует. На Андроид 7 служба не запускается и не работает. Андроид останавливает приложение через пару минут при заблокированном экране на телефоне с Андроид 7. Подскажите куда смотреть? Может кто посмотрит на своем телефоне, может и на других версиях служба не работает... Ссылка на apk: PublicRadio Спасибо. //запуск службы procedure TForm1.FormCreate(Sender: TObject); Begin if not BASS_Init(-1, 44100, 0, nil, nil) Then Begin ShowMessage('Failed to initialize audio!' + sLineBreak + 'Не удалось инициализировать audio!'); Exit; end; if FService = Nil Then Begin FService := TLocalServiceConnection.Create; FService.StartService('serPublic'); end; End;
  16. Спасибо. Код: MainActivity.finish; Закрывает приложение и выгружает сервис. Все как положено. А не надо ли каких-то дополнительных действий для закрытия и остановки сервиса или этой строки кода достаточно?
  17. Добавила сервис в проект с BASS. Все работает как надо. Уже час музыка играет при свернутом приложении и заблокированном экране. P.S. А как можно службу остановить?
  18. Было бы замечательно иметь нормальный Foreground service. Многим бы пригодился.
  19. Просто добавить комментарии к строкам. Например зачем там ExtraData := TAndroidHelper.JStringToString и т.д.
  20. Создано тест приложение и сервис с кодом выше. Запустилось. Появился в шторке значок приложения. Свертываем приложение с экрана и блокируем экран. Минут через 20 будим телефон. Значок в шторке на месте. Похоже работает... P.S. Просьба кто знает java и имеет время, "разбавить" код сервиса подробными комментариями, а то не совсем понятно что там и как. Спасибо.
  21. Теперь Build нормально проходит. 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; 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 ExtraData: String; {$ifdef VER330} ServiceChannel: JNotificationChannel; NotificationManager: JNotificationManager; Obj: JObject; {$endif} NewIntent: JIntent; ncb: JNotificationCompat_Builder; ntf: JNotification; PendingIntent: 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 {$ifdef VER330} // new ways for SDK > 26 (won't be called when API < 26 anyways) 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') ); ncb.setContentTitle(StrToJCharSequence('PublicRadio')); // 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; {$endif VER330} end else begin {$ifdef ORDINARY_NOTIFICATION} PendingIntent := TJPendingIntent.JavaClass.getActivity( JavaService.getApplicationContext, 0, Intent, 0 ); ntf := TJNotification.Create; ntf.icon := JavaService.getApplicationInfo.icon; ntf.setLatestEventInfo( JavaService.getApplicationContext, StrToJCharSequence('PublicRadio'), StrToJCharSequence('PublicRadioService'), PendingIntent); //MyCommsService {$endif} {$ifdef CLICKABLE_NOTIFICATION} 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); ncb.setContentTitle(StrToJCharSequence('PublicRadio')); ncb.setTicker(StrToJCharSequence('PublicRadioService')); //MyCommsService ncb.setSmallIcon(JavaService.getApplicationInfo.icon); ncb.setContentIntent(PendingIntent); ncb.setOngoing(True); ntf := ncb.build; {$endif} end; JavaService.startForeground(StartId, ntf); if Intent <> nil then begin ExtraData := TAndroidHelper.JStringToString( Intent.getStringExtra(TAndroidHelper.StringToJString('ExtraData'))); end; end; end. Потом иду у этой службы в Uses Permissions и ставлю Foreground service=true. Верно? Почему-то не сразу удалось поставить Foreground service=true ругалось, что не верный Version Code. Но все же установилась галочка Foreground service=true. А теперь, что у приложения вызывающего службу просто написать так? private { Private declarations } FService: TLocalServiceConnection; //-------------------------------------------- procedure TForm1.Button1Click(Sender: TObject); begin if FService = Nil Then Begin FService := TLocalServiceConnection.Create; FService.StartService('serPublic');//имя службы libserPublic.so end; end; Все ли правильно и возможно какие шаги упущены?
  22. Ingalime

    Обновление ProgressBar

    Здравствуйте. Не получается увидеть обновление шкалы ProgressBar при загрузки аудио потока: //TForm1.Button1Click progress := 0; repeat len := BASS_StreamGetFilePosition(str, BASS_FILEPOS_END); if (len = DW_Error) then break; //something's gone wrong! (eg. BASS_Free called) progress := BASS_StreamGetFilePosition(str, BASS_FILEPOS_BUFFER) * 100 div len; ProgressBar1.Value := progress; //Application.ProcessMessages(); //не помогает //ProgressBar1.Repaint(); //не помогает until (progress > 75) or (BASS_StreamGetFilePosition(str, BASS_FILEPOS_CONNECTED) = 0); // over 75% full (or end of download) //test ShowMessage(IntToStr(Trunc(ProgressBar1.Value))); //75 OК! Подскажите как правильно убрать код цикла в отдельный поток из него обновлять ProgressBar или надо по другому? Спасибо.
  23. Здравствуйте. Создано приложение Андроид 64 бит c библиотекой аудио BASS. В опциях проекта установлена галочка Generate Android App Bundle file (arm + arm64) Если запустить APK на Андроид 4.4, то пишет что приложение должно запускаться только на 64 битной системе. На Андроид 8.1 и 7 все ОК. Вопросы: 1. Нужна ли мне установленной галочка Generate Android App Bundle file (arm + arm64) для публикации в маркете если планируеться поддержка только устройств 64 бит? 2. Что правильно должно быть в манифесте? Сейчас там так: <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="28" /> Спасибо.
  24. Я прощу прощения, я не до конца понимаю... Мною создан плеер интернет радио который читает поток с нужного мне url адреса. Все работает как надо. Взяты нужные SO файлы с сайта BASS. Песни играют, вижу название этих песен. Все как говориться - картина маслом. Приложение полностью отвечает поставленной задаче. Осталось только заставить приложение работать если пользователь заблокировал экран телефона или свернул приложение. В этом случае Андроид прибивает приложение минуты через две. Для музыкального плеера это не подходит. Необходима служба Foreground. Тут, и в сети предложено много вариантов чего попробовать. Я уже запуталась... Тут есть пример: Start Foreground service in Delphi 10.3 и тут, тот же автор на китайском сайте приводит этот же код (внизу страницы): https://mlog.club/article/3507628 Вот мои uses для этого примера. 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; Нет у меня понимания Java. Ибо чтобы откомпилировать этот код, надо понимать, например, что такое CHANNEL_ID в его коде? Вопрос такой: какой же все же окончательно правильный путь для много-мучительного музыкального плеера в Дельфи 10.3.3, чтобы было как у плееров из маркета без проблем - музыка в фоне?
  25. Ingalime

    Android Services

    Да, дополнительные настройки в телефоне для приложения, позволяют, чтобы приложение работало при заблокированном экране. При свернутом состоянии и заблокированном состоянии и эти настройки не помогут. FMX не пригодна для создания музыки в фоне. Берем хороший плеер из маркета и все работает как надо на любом телефоне без дополнительных извращений со стороны пользователя...
×
×
  • Создать...