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

OnePeople

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

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

  • Посещение

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

    55

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

  1. procedure TForm1.Timer2Timer(Sender: TObject); var FileIndex, FileName : String; I : Integer; begin Timer2.Enabled := False; randomize; FileIndex := IntToStr(random(5000)); for I := 0 to ListBox1.Items.Count-1 do begin FileIndex := IntToStr(StrToInt(FileIndex) + 1); FileName := FileIndex + Exp; TFile.Copy(ListBox1.Items[I], FileName); end; end; А так?
  2. А в deployment для android 32 release пути прописаны?
  3. Последний параметр ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK И этот флаг должен совпадать с манифестом
  4. Ну так в 29 public final void startForeground (int id, Notification notification, int foregroundServiceType)
  5. Да нормально сервисы работают, другое дело что инфы именно для rad studio очень мало, вот эта тема для вас Тут в теме есть все действия чтобы сервис работал вечно;)
  6. Да вроде не должно, тут по идее нужно только расширение файла: SHGetFileInfo(PChar(Extension), FILE_ATTRIBUTE_NORMAL, FileInfo, SizeOf(FileInfo), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES );
  7. И добавить ncb.setsound
  8. Не знаю как правильно ни когда не задумывался, всегда делал по старинке, тут надо ещё проверить чтобы последний символ не был равен "/". If path[length(path)]='/' then // или if pos('/',path)=length(path) then Copy(path,0, lastDelimiter ('/',copy(path,0,length(path)-1)-1) else Copy(path,0,lastDelimiter('/',path)-1); Или допустим copy(path, 0, lastDelimiter ( tpath.getfilename, path)-1; Или
  9. 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')); // Текст для служб специальных возможностей // Начиная с выпуска L, этот текст больше не отображается на экране, но он по-прежнему полезен для служб специальных возможностей (где он служит звуковым объявлением о появлении уведомления). // 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; Как то так
  10. Ну так вы смотрите сразу справку гуугл CHANNEL_ID - The id of the channel. Must be unique per package. The value may be truncated if it is too long. Идентификатор канала. Должно быть уникальным для каждого пакета. Значение может быть усечено, если оно слишком длинное. Допустим пусть это будет имя пакета + '_id_1' Смысл в том что приложение может создать несколько уведомлений, и что если вам нужно удалить уведомление вы NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // The id of the channel. String id = имя пакета + '_id_1'; notificationManager.deleteNotificationChannel(id);
  11. Тут немного занялся радио у себя, не забудьте добавить ещё эти файлы http://www.un4seen.com/stuff/bass_ssl-android.zip иначе ссылки начинающие с https могут не играть)
  12. OnePeople

    1 nov 2020

    Так там вроде о подписочной модели распространения приложений, в частности о новых возможностях!?
  13. OnePeople

    Android Services

    И нужно внимательно читать справку гууууугл
  14. OnePeople

    Android Services

    Попробуйте еще сделать так <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> jpn:=TAndroidHelper.Context.getPackageName; ps:=TAndroidHelper.Context.getSystemService(TJContext.JavaClass.POWER_SERVICE); if ps <> nil then begin pm := TJPowerManager.Wrap((ps as ILocalObject).GetObjectID); end; if pm.isIgnoringBatteryOptimizations(jpn)=false then begin Intent := TJIntent.Create; Intent.setAction(TJSettings.JavaClass.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(TJnet_Uri.JavaClass.parse(StringToJString('package:').concat(jpn))); TAndroidHelper.Context.startActivity(Intent); end;
  15. Можете посмотреть какие файлы там есть: var files: TStringDynArray; files := TDirectory.GetFiles(TPath.GetHomePath); TArray.Sort<string>(files, TComparer<string>.Construct(CompareLowerStr)); for i := 0 to Length( files) - 1 do begin Memo1.lines.add(files); end;
  16. assets\internal - TPath.GetHomePath Именно так, только всё это делать вы должны из вашего приложения, так как только оно имеет доступ к этой папке!
  17. Ну приложение имеет доступ к этой папке и может делать что хочешь с этим файлом, но только твое приложение, все легко реализуется!
  18. С радостью бы помог, и скорее всего если не сможете сделать то помогу, но только ближе к ноябрю((( Только закончил с поисками и реализацией отловки AudioFocus, наконец то))))))))) У самого музыка пока не в сервисе, но я думаю как то так, без AndroidServiceUnBind function TCronysDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; Var Action: string; begin Action := JStringToString(Intent.getAction); if Action = 'StartService' then begin BASS_Init(-1, 44100, 0, nil, nil); //инициализация bass BASS_StreamFree(str); str := BASS_StreamCreateURL(PChar('http://91.199.194.34:8000'), 0, BASS_UNICODE, nil, nil); //ShowMessage(IntToStr(BASS_ErrorGetCode)); If BASS_ErrorGetCode = 0 Then Begin BASS_ChannelPlay(str, True); //начать воспроизведение End; end; if Action = 'StopService' then begin BASS_ChannelStop(str); //остановить воспроизведение BASS_StreamFree(str); JavaService.stopSelf; result := TJService.JavaClass.START_NOT_STICKY; // don't reload service exit; end; result := TJService.JavaClass.START_STICKY; // rerun service if host app stops end; запуск сервиса FService := TJIntent.Create; FService.setClassName(TAndroidHelper.Context.getPackageName(), TAndroidHelper.StringToJString('com.embarcadero.services.cronysrv')); FService.setAction(StringToJString('StartService')); TAndroidHelper.Activity.startService(FService); По вышему коду при убийстве приложения, убивается и сервис???? Это вопрос
  19. Создайте сервис в нем код из вашего приложения по запуску воспроизведения А в приложении, делайте отправку broadcast сообщений о старте или остановки проигрывания В этом радио так и сделано! И нотификейшен с кнопками тоже можно на делфи сделать!
  20. В данном случае имя файла в responseHeader Location:https://updates.tdesktop.com/tsetup/tsetup.2.4.2.exe
  21. Либо выдергивают из url или уже из самого файла( у мультимедиа например из тэгов)
  22. Делал тут темы для своего приложения (лаунчера) и встал вопрос об открытии файла темы из проводника. И конечно же уперся в то что intent возвращает всегда один и тот же как при открытии программы. Итого поздно)), но может кому пригодится <intent-filter> <action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.EDIT"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="file" /> <data android:scheme="content" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="*" /> <data android:pathPattern=".*\\.caskin" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <action android:name="android.intent.action.EDIT"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="file" /> <data android:scheme="content" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="*" /> <data android:mimeType="*/*" /> <data android:pathPattern=".*\\.caskin" /> </intent-filter> private var IMessageSubscriptionID: Integer; procedure HandleIntentMessage(const Sender: TObject; const M: TMessage); function OnNewIntent(Intent: JIntent): Boolean; procedure TForm1.FormCreate(Sender: TObject); var aFMXApplicationEventService: IFMXApplicationEventService; begin if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); MainActivity.registerIntentAction(TJIntent.JavaClass.ACTION_VIEW); IMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageReceivedNotification, HandleIntentMessage); end; function TForm1.OnNewIntent(Intent: JIntent): Boolean; var fPath: String; begin Result := False; if Intent <> nil then begin fPath:= Intent.getData.getEncodedPath; end; end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageResultNotification then OnActivityResult(TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode, TMessageResultNotification(M).Value); end; function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; var myIntent: JIntent; insSkinPath: String; begin case AAppEvent of TApplicationEvent.FinishedLaunching: begin try myIntent := MainActivity.getIntent; if myIntent <> nil then OnNewIntent(myIntent); except end; end; end; Result := True; end;
×
×
  • Создать...