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

Rusland

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

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

  • Посещение

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

    26

Активность репутации

  1. Like
    Rusland получил реакцию от AngryOwl в Создать БД с помощью SQLite   
    Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
  2. Like
    Rusland получил реакцию от Евгений Корепов в Создать БД с помощью SQLite   
    Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
  3. Like
    Rusland отреагировална kami в как отключить это назойливое окно?   
    На кнопке "Получать в этой сессии" нажать стрелку вниз и выбрать нужный вариант, чего уж проще-то.
    Следует выбирать или "не хочу вообще никогда-никогда" или "да, хочу всё и всегда".
    Я вот получаю от этого сайта уведомления всегда. Очень удобно "уведомляться" когда меня цитируют или упоминают в переписке.
  4. Like
    Rusland отреагировална ENERGY в Одинаковые логотипы и картинки   
    Поменяйте цвет этих иконок. В любой редакторе можно сдвинуть HUE (я обычно использую Axialis Icon Workshop и Photoimpact) - смещение цветов. 
    И вам будет удобно, и не должны отказать.
    Можно также поискать Online Image\photo editor - но они как правило очень бедные по функционалу, и там может не быть изменения HUE.
  5. Like
    Rusland отреагировална ENERGY в [Статья]Как создать простой Android Broadcast Receiver. How to implement simplest Android Broadcast Receiver in Delphi   
    Как создать простейший Android Broadcast Receiver.
    Создайте класс, для приема Intent уведомлений:
     
    uses Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText; type TMyReceiver = class(TJavaLocal, JFMXBroadcastReceiverListener) public constructor Create; procedure onReceive(context: JContext; intent: JIntent); cdecl; end; uses Androidapi.Helpers, Androidapi.JNI.JavaTypes; { TMyReceiver } constructor TMyReceiver.Create; begin inherited; end; procedure TMyReceiver.onReceive(context: JContext; intent: JIntent); begin Log.d('Broadcast Received = ' + JStringToString(intent.getAction)); end;  
    Регистрируем тип уведомлений и приемник в событиях формы:
     
    type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { private } FMyListener: TMyReceiver; FBroadcastReceiver: JFMXBroadcastReceiver; public { public } end; procedure TForm1.FormCreate(Sender: TObject); var Filter: JIntentFilter; begin FMyListener := TMyReceiver.Create; FBroadcastReceiver := TJFMXBroadcastReceiver.JavaClass.init(FMyListener); Filter := TJIntentFilter.JavaClass.init; Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_OFF); Filter.addAction(TJIntent.JavaClass.ACTION_SCREEN_ON); TAndroidHelper.context.getApplicationContext.registerReceiver (FBroadcastReceiver, Filter); end; procedure TForm1.FormDestroy(Sender: TObject); begin TAndroidHelper.context.getApplicationContext.unregisterReceiver (FBroadcastReceiver); end; Все.
    Теперь когда вы запустите программу и выключите\включите экран, лог покажет :
    FMX: BroadcastSample: Broadcast Received = android.intent.action.SCREEN_OFF FMX: BroadcastSample: Broadcast Received = android.intent.action.SCREEN_ON Takashi Yamamoto
  6. Like
    Rusland отреагировална ENERGY в [Статья]Как создать простой Android Broadcast Receiver. How to implement simplest Android Broadcast Receiver in Delphi   
    Мой вариант Broadcast Receiver, на мой взгляд наиболее оптимизирован и удачен. По сравнению с известным кодом от barisatalay .
    Отличия -
    исправлена утечка,
    чуть быстрее работает, за счет того что создается один фильтр в него добавляется несколько Actions  и одна регистрация на него, 
    нет лишних конвертирований с Jstring to string и обратно,
    адаптирован под Delphi 10 (JFMXBroadcastReceiver) ,
    упрощена работа с классом (не нужно помнить о регистрации и вызывать ее заранее) ,
    и самое главное - может получать getResultCode текущего ресивера (к примеру он нужен при получении статуса смс сообщения и в других случаях.). 
    unit BroadcastReceiver; interface {$IFDEF ANDROID} uses   Androidapi.JNI.Embarcadero, Androidapi.JNI.GraphicsContentViewText, Androidapi.helpers,   Androidapi.JNIBridge, FMX.Helpers.Android, Androidapi.JNI.JavaTypes,   System.Classes, System.SysUtils; type   TBroadcastReceiver = class;   TListener = class(TJavaLocal, JFMXBroadcastReceiverListener)   private     fOwner: TBroadcastReceiver;     fReceiver: JFMXBroadcastReceiver;   public     constructor Create(aOwner: TBroadcastReceiver);     destructor Destroy; override;     procedure onReceive(context: JContext; intent: JIntent); cdecl;   end;   TOnReceive = procedure (aContext: JContext; aIntent: JIntent; aResultCode: integer) of object;   TBroadcastReceiver = class   private     fListener : TListener;     fRegistered: boolean;     fOnReceive: TOnReceive;   public     constructor Create(aOnReceiveProc: TOnReceive);     destructor Destroy; override;     procedure AddActions(const Args: array of JString);     procedure SendBroadcast(const aValue: string);   end; {$ENDIF} implementation {$IFDEF ANDROID} { TBroadcastReceiver } constructor TBroadcastReceiver.Create(aOnReceiveProc: TOnReceive); begin   inherited Create;   fListener := TListener.Create(Self);   fOnReceive := aOnReceiveProc; end; destructor TBroadcastReceiver.Destroy; begin   fListener.Free;   inherited; end; procedure TBroadcastReceiver.AddActions(const Args: array of JString); var   vFilter: JIntentFilter;   i: Integer; begin   if fRegistered then     TAndroidHelper.context.getApplicationContext.UnregisterReceiver(fListener.fReceiver);   vFilter := TJIntentFilter.JavaClass.init;   for i := 0 to High(Args) do     vFilter.addAction(Args[i]);   TAndroidHelper.context.getApplicationContext.registerReceiver(fListener.fReceiver, vFilter);   fRegistered := true; end; procedure TBroadcastReceiver.SendBroadcast(const aValue: string); var   Inx: JIntent; begin   Inx := TJIntent.Create;   Inx.setAction(StringToJString(aValue));   TAndroidHelper.Context.sendBroadcast(Inx); end; constructor TListener.Create(aOwner: TBroadcastReceiver); begin   inherited Create;   fOwner := aOwner;   fReceiver := TJFMXBroadcastReceiver.JavaClass.init(Self); end; destructor TListener.Destroy; begin   TAndroidHelper.context.getApplicationContext.unregisterReceiver(fReceiver);   inherited; end; // usually android call it from "UI thread" - it's not main Delphi thread procedure TListener.onReceive(context: JContext; intent: JIntent); begin   if Assigned(fOwner.fOnReceive) then     fOwner.fOnReceive(Context, Intent, fReceiver.getResultCode); end; {$ENDIF} end.  
    Как использовать
     
      // указывать нужно сразу все нужные вам Actions в Add через запятую, не по одной. fBroadcast := TBroadcastReceiver.Create(OnReceiveBroadcast);   fBroadcast.AddActions([StringToJString(SENT_ACTION)]); << Custom action ------------- // или например сразу несколько Actions fBroadcast.AddActions([TJIntent.JavaClass.ACTION_SCREEN_OFF, TJIntent.JavaClass.ACTION_SCREEN_ON]);  
  7. Like
    Rusland отреагировална ENERGY в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    Фух. Наконец то проспался и понял как сделать.
    Нужно просто поставить Alarm еще раз, напр. чтобы выполнился через 3 секунды.  (неудобный, есть вероятность попасть на ошибку)
    просто вызвать его в Broadcast после Activity . (не всегда работает)
    Запустить Activity и в BroadcastReceiver подождать 8 секунд, а затем там же снять WakeLock. 
    Это вариант работает прекрасно.
    Также с этим кодом Alarm срабатывает если Activity уже запущено либо в фоне. Нужно перехватывать WillBecomeForeground, BecameActive и там включать экран. Процессор включается в WakeLock, но не на долго, вам нужно включить экран при помощи функции ниже, сделать работу затем отключить экран).
    В моем случае, в отдельном потоке крутиться самописный планировщик, для других задач, который возбуждает события, по нему я и включаю\отключаю экран.
     
    Итак выстраданный бесcонными ночами Java код, обратите внимание на  TestLauncher.putExtra("StartedFromAM", true), это чтобы знать из Activity что запустились из Broadcast (предложенный Blong'гом EXTRA_ALARM_COUNT с BroadcastReceiver всегда вернет ноль, он работает только если запускать напрямую Activity!) : 
    package com.TestReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.PowerManager; import android.os.Handler; public class AlarmReceiver extends BroadcastReceiver { private static PowerManager.WakeLock mWakeLock; @Override public void onReceive(Context context, Intent intent) { if (mWakeLock == null) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Delphi"); mWakeLock.acquire(); } Intent TestLauncher = new Intent(); TestLauncher.setClassName(context, "com.embarcadero.firemonkey.FMXNativeActivity"); TestLauncher.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); // I TestLauncher.putExtra("StartedFromAM", true); context.startActivity(TestLauncher); // Handler h = new Handler(); h.postDelayed(new Runnable(){ public void run(){ mWakeLock.release(); mWakeLock = null; } }, 8000); //Toast.makeText(context, "Reelase! ("+mcounter.toString()+")", Toast.LENGTH_SHORT).show(); // For example } } PARTIAL_WAKE_LOCK означает что процессор во время выполнения этого кода, не будет уходить в спящий режим.
    Теперь в OnCreate нашей формы добавляем флаги чтобы включить экран, но при условии что  запустились мы из AlarmManager : 
    function StartedFromAlarmManager: boolean; begin {$IFDEF ANDROID}   Result := TAndroidHelper.Activity.getIntent.getBooleanExtra(StringToJString('StartedFromAM'), false);   // this will work only if using Activity instead of Broadcast - TJPendingIntent.JavaClass.getActivity:   //  Result := TAndroidHelper.Activity.getIntent.getIntExtra(TJIntent.JavaClass.EXTRA_ALARM_COUNT, 0); {$ELSE}   Result := false; {$ENDIF} end;  
    {$IFDEF ANDROID}   procedure TurnOnAndKeepScreenAndroid(aEnable: boolean);   var     vFlags: integer;   begin     vFlags := TJWindowManager_LayoutParams.JavaClass.FLAG_TURN_SCREEN_ON or         TJWindowManager_LayoutParams.JavaClass.FLAG_DISMISS_KEYGUARD or         TJWindowManager_LayoutParams.JavaClass.FLAG_SHOW_WHEN_LOCKED or         TJWindowManager_LayoutParams.JavaClass.FLAG_KEEP_SCREEN_ON;     if aEnable then     begin       CallInUIThread (   // uses FMX.Helpers.Android       procedure       begin         TAndroidHelper.Activity.getWindow.setFlags (vFlags, vFlags);       end );     end     else       CallInUIThread (       procedure       begin         TAndroidHelper.Activity.getWindow.clearFlags (vFlags);       end );   end;   {$ENDIF} И сразу же отключаем наш WakeLock устанавливая второй раз Alarmmanager на срабатывание через 3 сек (соответственно запуститься BroadcastReceiver и освободит WakeLock).   (уже отключается сам в Broadcast сразу после старта Activity)- т.к. во флагах окна, уже указан FLAG_KEEP_SCREEN - это будет держать экран и систему включенной. 
    Не забудьте  поставить разрешение WAKE LOCK = true!
     
     
     
     
  8. Like
    Rusland отреагировална Alex7wrt в Загрузка аудиофайлов в MediaPlayer   
    Добрый день.
    Для воспроизведения медиа файлов необходимо чтобы они физически находились на устройстве. Нужно их "задеплоить", то есть добавить в проект в project - options - deployment. А затем в программе подгрузить с помощью TMediaPlayer.FileName.
  9. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Загрузка аудиофайлов в MediaPlayer   
    Remote Path неправильно заполнен, должно быть assets\internal
  10. Like
    Rusland получил реакцию от Kitty в Создать БД с помощью SQLite   
    Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
  11. Like
    Rusland получил реакцию от GregGirya в Как записать видео на Андроиде?   
    Вот нашел код для записи видео (проверил - работает):
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, Androidapi.JNI.GraphicsContentViewText, System.Messaging, // TMessageManager FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation; type TForm1 = class(TForm) BtnRecord: TButton; Label1: TLabel; procedure BtnRecordClick(Sender: TObject); private { Private declarations } procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; public { Public declarations } FMessageSubscriptionID:integer; end; var Form1: TForm1; const RECORD_VIDEO = 9; implementation {$R *.fmx} uses System.IOUtils, Androidapi.JNI.Provider, Androidapi.JNI.App, Androidapi.JNI.Net, Androidapi.JNIBridge, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os; procedure TForm1.BtnRecordClick(Sender: TObject); var VideoIntent: JIntent; videoUri: Jnet_Uri; AFile: JFile; FileName: TFileName; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageResultNotification, HandleActivityMessage); VideoIntent := TJIntent.JavaClass.init( TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE ); if ( VideoIntent.resolveActivity( SharedActivityContext.getPackageManager() ) <> nil) then begin FileName := TPath.Combine( TPath.GetSharedDocumentsPath, 'recording.mp4'); // см. /storage/sdcard0/Documents AFile:=TJFile.JavaClass.init( StringToJString(FileName)); videoUri:=TJnet_Uri.JavaClass.fromFile(AFile); VideoIntent.putExtra( TJMediaStore.JavaClass.EXTRA_OUTPUT, TJParcelable.Wrap((videoUri as ILocalObject).GetObjectID)); SharedActivity.startActivityForResult(VideoIntent, RECORD_VIDEO); 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.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; begin Result := False; TMessageManager.DefaultManager.Unsubscribe( TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; if RequestCode = RECORD_VIDEO then begin if ResultCode = TJActivity.JavaClass.RESULT_OK then begin TThread.Queue(nil, procedure begin Label1.Text:='recording completed'; Invalidate; end); end; end; end; end. Пишет стандартной программой и сохраняет под названием recording.mp4
    Если нужно просто писать видео, то подойдет. 
  12. Like
    Rusland получил реакцию от Ingalime в Создать БД с помощью SQLite   
    Для работы с Sqlite можете использовать компоненты FireDAC http://docwiki.embarcadero.com/CodeExamples/Berlin/en/FireDAC.SQLite_Sample
  13. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Форма загрузки   
    дополню
    нужно в OnKeyUp главной формы (не первой) обработать vkHardwareBack и сделать Application.Terminate; чтобы при кнопке Назад, не вернуться на форму загрузки (первую форму)
  14. Like
    Rusland отреагировална krapotkin в Форма загрузки   
    первая форма - это главная форма приложения только по архитектуре, а совсем не по смыслу
    поэтому смело делайте первую форму проще некуда
    и как только загрузится, сразу можно идти с нее на логин, на основную форму, на регистрацию, рекламу показать, куда угодно....
  15. Like
    Rusland отреагировална ENERGY в Форма загрузки   
    Project > View Source - и там можете менять очередность запуска форм, или вообще создать одну, а затем подгружать нужные, если их много. Так даже экономней.
    Установите форме Visible false. А затем когда нужно меняйте на true из формы загрузки.
  16. Like
    Rusland отреагировална Евгений Корепов в Как получить версию APK-файла под Win32?   
    Вот так напрямую в память:
    function ShellExecuteMy(CommandLine: string; AWorkDir: string = 'C:\') : String; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of AnsiChar; BytesRead: Cardinal; WorkDir: string; Handle: Boolean; AOutputLine : String; begin with SA do begin nLength := SizeOf(SA); bInheritHandle := True; lpSecurityDescriptor := nil; end; CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0); try with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; // wShowWindow := SW_MINIMIZE; // wShowWindow := SW_NORMAL; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end; WorkDir := AWorkDir; // Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine), Handle := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); // Result:=PI; CloseHandle(StdOutPipeWrite); finally CloseHandle(StdOutPipeRead); end; if Handle then try repeat // WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); WasOK := ReadFile(StdOutPipeRead, Buffer, 50, BytesRead, nil); if BytesRead > 0 then begin Buffer[BytesRead] := #0; AOutputLine:=StrOemToAnsi(Buffer); Result :=Result + AOutputLine; end; until not WasOK or (BytesRead = 0); WaitForSingleObject(PI.hProcess, INFINITE); finally CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally CloseHandle(StdOutPipeRead); end; end; Функция читает пайп вывода и помещает в строку. 
    P.S. uses Winapi.Windows;
  17. Like
    Rusland отреагировална dante333 в [Статья] Настройка пуш уведомлении через сервис Firebase для ANDROID и IOS [Часть 2]   
    Это количество запросов к сервису.если 200 пользователей сделают по 5 запросов,все,лимит исчерпан.Например запрос авторизации.
  18. Like
    Rusland отреагировална Andrey Efimov в [Статья][Android] AlarmManager - Автозапуск приложения в назначенное время   
    Евгений, внимательнее читайте статью, там есть раздел теории, а конкретно такие строчки:
    это половина ответа на ваш вопрос.
    Вторую половину можно найти например в этой статье [Android Service+BroadcastReceiver] Автозапуск службы после рестарта ОС. В ней говорится, какое имя будет у сервиса после создания:
     
  19. Like
    Rusland отреагировална ENERGY в Не дать изменить значение Tswitch   
    Кривая реализация TSwitch, тоже столкнулся с этим. Тут проблема в том, что компонент после вызова своих событий (OnSwitch напр) продолжает анимацию, и даже если поменять в OnSwitch на Switch1.IsChecked := false;  ничего не измениться, т.к. еще не закончилась анимация на предыдущий статус True.
    Чтобы изменить значение  в OnSwitch или в OnClick - на нужное:
    TThread.CreateAnonymousThread ( procedure     begin       TThread.Queue( nil , procedure       begin           Switch1.IsChecked := false;       end );     end ).Start;  
    Админ почему то закрыл такую же тему, хотя вопрос не был решен.
  20. Like
    Rusland отреагировална ENERGY в Кнопка с картинкой   
    Чтобы картинка была на всю кнопку - вообще картинки должны быть фиксированного размера, когда одна больше, другая меньше - это смотрится криво. Но если очень нужно тогда так (это для Firemonkey, не для VCL): 
    Бросайте рядом TGlyph - затем в инспекторе объектов мышкой перемещаете его на кнопку. В результате TGlyph должен быть внутри кнопки (TSpeedButton или TButton). Далее настраиваете TGlyph - указываете там ImageList, ImageIndex (можно картинку и без ImageList указать отдельно, там есть соответствующее поле), далее  свойство Stretch  и Align = Client.
     
  21. Like
    Rusland отреагировална Andrey Efimov в [Статья][Android] Как получить информацию о потреблении ОЗУ?   
    Так, ситуация такая. Приложение я отлаживал в Android Studio, не в RAD Studio, поэтому данную ошибку не встречал.
    Если хочется запускать с отладчиком RAD, то закомментируйте строчку
    Process._Release; Но, тогда будет происходить утечка памяти, которую можно будет увидеть в Android Studio и про которую я говорил в статье.
    Ошибка появляется только во время дебага через RAD Studio. Во время обычной работы приложения всё нормально.
    К сожалению, других решений для устранения утечки я не нашёл, а QC Embarcadero молчит...
    Более подробно, про утечку расскажу в след. статье.
    Исходники на гитхабе верные.
     
    p.s. Тему почистил. Спасибо, что сообщили об этом поведении.
    p.s.2. В статью добавил информацию по этому поводу.
  22. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в [Windows] Сворачивание приложение   
    кто-то в чатике просил сделать подобное, вот что получилось
    FMX.AppMinimized.zip
    сворачивание/разворачивание делается, только после разворота не делается активация формы (не было времени с этим разбираться у меня)
  23. Like
    Rusland отреагировална Andrey Efimov в [Windows] Сворачивание приложение   
    Есть вот такая темка Как свернуть форму, находящуюся в режиме FullScreen?
    А вообще, да, была недавно тема, но что-то не найду её...
    Вот ещё тема Форма не сворачивается при клике на иконке в панели задач. Напишите в личку автору, может он нашёл решение и поделится им с обществом.
    И вот такая тема Скрытие приложения с панели задач. Там ближе к концу обсуждали сворачивание.
  24. Like
    Rusland получил реакцию от Aleksandr в Звук и вибра при нажатии на кнопку   
    uses AndroidApi.JNI.Media; procedure MakeSound(ADuration: Integer); var Volume: Integer; StreamType: Integer; ToneType: Integer; ToneGenerator: JToneGenerator; begin Volume := TJToneGenerator.JavaClass.MAX_VOLUME; // задаем громкость StreamType := TJAudioManager.JavaClass.STREAM_ALARM; ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; // тип звука ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, Volume); ToneGenerator.startTone(ToneType, ADuration); end; Типы звука можно посмотреть здесь 
  25. Like
    Rusland получил реакцию от Mazzay в Звук и вибра при нажатии на кнопку   
    uses AndroidApi.JNI.Media; procedure MakeSound(ADuration: Integer); var Volume: Integer; StreamType: Integer; ToneType: Integer; ToneGenerator: JToneGenerator; begin Volume := TJToneGenerator.JavaClass.MAX_VOLUME; // задаем громкость StreamType := TJAudioManager.JavaClass.STREAM_ALARM; ToneType := TJToneGenerator.JavaClass.TONE_DTMF_0; // тип звука ToneGenerator := TJToneGenerator.JavaClass.init(StreamType, Volume); ToneGenerator.startTone(ToneType, ADuration); end; Типы звука можно посмотреть здесь 
×
×
  • Создать...