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

Ingalime

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

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

  • Посещение

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

    5

Сообщения, опубликованные Ingalime

  1. Код найден в Интернете и он работает отлично на моем Андроид 8.1

    Зачем у автора эта строка, непонятно...

    if TJBuild_VERSION.JavaClass.SDK_INT > TJBuild_VERSION_CODES.JavaClass.O

    Что-то связанно с открытием канала... 

  2. Здравствуйте.

    Есть код службы переднего фона которая прекрасно работает на Андроид 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. Спасибо. Подскажите как правильно добавить третий параметр в код запуска службы?

    JavaService.startForeground(StartId,  ntf,  2);//too many actual parametrs

    В выпадающем списке нет варианта с тремя параметрами. Рис.

    В манифесте <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="29" />

     

    serv.jpg

  4. Короче не работает. Служба стартует, но она не foreground. Если свернуть приложение, служба перестает работать через пару минут.

    Предложенное выше решение устарело и не подходит т.к. оно работает для sdk 28. Гугл маркет требует с августа sdk 29.

    Таким образом как создать простую foreground службу в 10.4.1 остаётся не решенным вопросом.

  5. Слетела галочка в разрешениях в опциях проекта foreground service. Однако установка ее не помогла - нет значка службы в трее...

    P.S.

    Странно значка нет, а в запущенных приложениях служба есть. В 10.3.3 был значок в трее...

  6. После компиляции проекта в 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

    Спасибо.

  7. После установки любой студии в папке, например: C:\Users\Public\Documents\Embarcadero\Studio\20.0\PlatformSDKs\android-sdk-windows\tools можно было запустить окно как на прилагаемом рисунке.

    После установки RAD10.4.1 папки PlatformSDKs нет. Хотя при инсталляции было указано, чтобы Андроид был установлен. Как вызвать это окно для 10.4.1? Спасибо.

    an.JPG

  8. Здравствуйте.

    Такой вопрос:
    Создаю Андроид сервис выбор платформы -> 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 его нет.

    Это так и должно быть? 

  9. Подскажите, пожалуйста, ответы на такие вопросы:

    1. Для публикации в маркете SDK должен быть равен 29 не ниже?

    2. В приложении присутствует пункт меню Donate (Помощь проекту). При переходе в этот пункт меню просто открывается форма с номером банковской карты на которую можно перевести пожертвование и есть ссылка на сайт банка этой банковской карты. Не является и это каким то нарушением для гугул маркета?

    Спасибо.

  10. Так и планируется. На сайте уже работающего интернет радио, просто будет дополнительно ссылка для скачивания арк, для тех кто захочет иметь это радио на телефоне в удобном интерфейсе...

    Поэтому гугл плей с его всякого рода ограничениями особо и не нужен.

    Можно и напрямую выложить арк на сервере радио, но врядли подьзователя порадуют при установки сообщения типа: Внимание опасно! Включите установку из неизвестных источников! И т.п.

     

  11. Если получаешь бан на аккаунт, то из маркета проподут все приложения аккаунта?

    P.S.

    У Амазона тоже можно публиковать включая и 32 битные приложения. Есть у кого опыт? 

  12. Проблемка. На Андроид 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;

     

  13. Создано тест приложение и сервис с кодом выше. Запустилось. Появился в шторке значок приложения. Свертываем приложение с экрана и блокируем экран. Минут через 20 будим телефон. Значок в шторке на месте. Похоже работает...

    P.S.

    Просьба кто знает java и имеет время, "разбавить" код сервиса подробными комментариями, а то не совсем понятно что там и как. Спасибо.

  14. Теперь 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;

    Все ли правильно и возможно какие шаги упущены?

  15. Здравствуйте.

    Не получается увидеть обновление шкалы 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 или надо по другому?

    Спасибо.

  16. Здравствуйте.

    Создано приложение Андроид 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" />

    Спасибо.

     

  17. Я прощу прощения, я не до конца понимаю...

    Мною создан плеер интернет радио который читает поток с нужного мне 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, чтобы было как у плееров из маркета без проблем - музыка в фоне? :)

  18.  

    Да, дополнительные настройки в телефоне для приложения, позволяют, чтобы приложение работало при заблокированном экране. При свернутом состоянии и заблокированном состоянии и эти настройки не помогут.

    FMX не пригодна для создания музыки в фоне. Берем хороший плеер из маркета и все работает как надо на любом телефоне без дополнительных извращений со стороны пользователя...

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