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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. 9 часов назад, krapotkin сказал:

    на Xiaomi Redmi Note 3 pro норм. на 5А - тоже. до 5-ки пока не добрался

    На этих телефонах экран 16/9, а не 18/9. Как раз в Redmi 5 и есть мой вопрос. Если получится посмотреть, буду очень благодарен

  2. 2 часа назад, krapotkin сказал:

    в силу отсутствия рамок на андроиде нет смысла Borderstyle выставлять. сбросил в sizable

    на Xiaomi Redmi Note 3 pro норм. на 5А - тоже. до 5-ки пока не добрался

    Этот параметр остался из единого кода с iOS, где он скрывает статусбар.

  3. Все-таки сделал пример. Прикрепил архив с проектом

    app.zip

    Вот весь код:

    procedure TForm1.FormCreate(Sender: TObject);
    var i: byte;
    begin
        Container:=TRectangle.Create(Form1);
        with Container do begin
            Parent:=Form1;
            Align:=TAlignLayout.Contents;
            Stroke.Kind:=TBrushKind.None;
            Fill.Color:=TAlphaColors.Black;
        end;
    
        for i:= 1 to 4 do
            with TRectangle.Create(Container) do begin
                Parent:=Container;
                Stroke.Kind:=TBrushKind.None;
                Fill.Color:=TAlphaColors.White;
            end;
    end;
    
    procedure TForm1.FormResize(Sender: TObject);
    var i: byte;
    begin
        w:=screen.Width; h:=screen.Height;
        for i:= 1 to 4 do begin
            with TRectangle(Container.Children[i-1]) do begin
                Height:=min(w,h)*(0.35+0.1*byte(w>h));
                Width:=Height*1.33;
                if h>w then begin
                    Position.X:=(w - 2*Width-0.1*width)*0.5 + ((i+1) mod 2)*(Width+0.1*width);
                    Position.Y:=(h - 2*Height-0.6*width)*0.5 + (i div 3)*(Height+0.1*width);
                end
                else begin
                    Position.X:=(w - Width-0.03*h)*((i+1) mod 2)+0.015*h;
                    Position.Y:=(h - Height-0.03*h)*max((round(i*0.5)-1),0)+0.015*h;
                end;
            end;
        end;
    end;

    В альбомной ориентации на "обычных" устройствах интерфейс имеет следующий вид:

    Screenshot_2018-07-02-21-42-18-242_com.embarcadero.Project1.thumb.png.0b1512bcc5306aef873815e73125aa24.png

    Но на Redmi 5 рамка справа намного шире, из-за чего картинка теряет симметрию. Скорее всего это из-за некорректного определения размера экрана

  4. Да вот с этим проблема

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

    А сам Redmi 5 мне на данный момент не доступен, поэтому сомневаюсь, что сделаю адекватный пример. Вчера на нем тестировал. Если бы был при мне, может быстрее нашел бы решение.

    Но Redmi 3S у меня есть, на нем как и на абсолютно всех других телефонах с соотношением 16 на 9 и меньше, и с аппаратными кнопками, все работает норм.

    Думаю сама концепция тестового примера сводится к следующему

    В свойствах формы FullScreen = true; BorderStyle = bsNone;

    Помещаем 2 кнопки, и для их горизонтальных координат указываем то, что я писал в посте выше

    X:=20; 

    X:=Screen.Width - W - 20;

  5. Добрый день

    Есть приложение, которое работает в полноэкранном режиме.

    Первый раз тестил его на экране с соотношением сторон 18:9 (Xiaomi Redmi 5). 

    По умолчанию приложение открывается с черными полосами сверху/снизу либо слева/справа (смотря какая ориентация)

    В недрах настроек телефона есть опция "полноэкранный режим", где любому приложению можно разрешить/запретить работу на весь экран.

    При активации этой опции для моего приложения, размер экрана все равно определяется неверно (должно быть 1440*720, а получаю 1344*720), и из-за этого при отрисовке элементов интерфейса вблизи границ экрана получаю не то, что должно быть. 

    Например,  есть элемент шириной W, тогда при отрисовке элемента в точке с горизонтальным значением Point.X:=20 и в точке с Point.X:=Screen.Width - W - 20, получаю разные расстояния от элемента до левой и правой стороны экрана соответственно (альбомная ориентация).

    При этом для "обычных" экранов все работает отлично.Подозреваю, что это как-то связано с наэкранными кнопками меню, но не знаю, это особенность Xiaomi или вообще всех таких современных экранов.

    Кто в теме, подскажите.

  6. Добрый день.

    Столкнулся со следующей задачей: не получается использовать микрофон под iOS. В документации Apple нашел следующее: ссылка. Судя по этой информации,  начиная с iOS 10 нужно выполнять запросы на разрешение использования тех или иных функций.

    Кто-нибудь знает как добавить запрос на разрешение использования микрофона в iOS?

    На тестируемом устройстве установлена iOS 11.4. Среда 10.1.2.

  7. Можно еще поиграться с размером буфера в Bass, который измеряется в миллисекундах и по умолчанию равен 500. Чем он больше, тем меньше вероятность потерь, но больше задержка звука при стримминге.

  8. Может быть. Не могу подтвердить или опровергнуть ваше предположение, но в моем случае передача звука происходит в локальной сети, не в интернете. Через все роутеры, включая точку доступа со смартфона, все работало хорошо, без потерь. 

  9. 2 часа назад, Martifan сказал:

    все хорошо спасибо большое
    это все еще через Opus прогнать и будет просто супер

    Методом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе).

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

  10. 3 часа назад, Martifan сказал:

    спасибо за ответ но на Android как делать этого и без использывание Bass знаю мне интересует как это сделать на iOS

    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.

    4 часа назад, Виталий Иванов сказал:

    Эх примерчик бы того как вы захватываете потом и отправляете его клиентуи как принимаете. Уже нескольок недель гуглю в этом направлении и инфы ноль. А бы ло бы интересно посмотреть как это работает. И да находил инфу что через bass.dll это делают захватывают поток с устройсва (микрофона) в событии захвата потока добавляют заголовк для куска (заголовок кодека) и передают его на клиента, но инфы о том как клиент должен это получить и воспроизвести нету да и вообще не будет ли случаем прерывании мезжу полученными кусками и как с памятью обстоят дела ? я так понимаю что для этого мазахизма выделяется какойто буфер и внесго складывается или дописываетс и наверное передача идет попакетно а не потоком (record package). (и это толкьо малая часть вопросов :()

     

    Вообщем если не сложно можете поделится примером :) а то вопросов больше чем ответов

    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  

    uses FMX.Radio.Bass;
    
    var 
      BLoaded: boolean;
      chanPlay, ChanMic: Dword;
      avail, freq: word;
      buffer: TIDBytes;
    
    
    procedure TForm1.OnCreate(Sender: TObject);
    begin
        //Создаем UDP сервер 
        UDP_Rec:=TIDUDPServer.Create;
        with UDP_Rec do begin
            DefaultPort:=UDP_RecPort;
            BufferSize:=1600;
            BroadcastEnabled:=true;
            Active:=true;
        end;
        
        freq:=16000; //Частота дискретизации
        setlength(buffer,UDP_Rec.BufferSize);
    
        BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку
        BASS_RecordInit(-1); //Инициализируем запись
    end;
    
    //Захват звука с микрофона
    procedure TForm1.Recording(Sender: TObject; const Point: TPointF);
    begin
        isrecording:=not isrecording;
        if isrecording then begin
            UDP_Rec.OnUDPRead:=nil;
            chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil);
            VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP
        end
    end;
    
    //Передача буффера в потоке
    procedure TVoiceThread.Execute;
    begin
        while isrecording do begin
            try
                avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE);
                if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем
                    try
                        BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize);
                        UDP_Rec.Broadcast(Buffer,UDP_RecPort);
                    except
                    end;
                end;
            finally
                sleep(20);
            end;
        end;
        BASS_ChannelStop(chanmic);
        BASS_StreamFree(chanmic);
    end;
    
    
    //Создание канала для воспроизведения звука из буффера:
    procedure TForm1.receiving(Sender: TObject);
    begin
        chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil);
        UDP_Rec.OnUDPRead:=UDP_RecRead;
        BASS_ChannelPlay(chanPlay, false);
    end;
    
    //Получаем буффер из UDP
    procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
    begin
        try
            BASS_StreamPutData(chanPlay, AData,length(AData))
        except
        end;
    end;

    Bass.zip

  11. Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.

  12. uses VCD: TVideoCaptureDevice;
         ABitmap: TBitmap;
         bd: TBitmapData;

    -----------------------

    В событии OnVideoBufferReady добавляете: 

    VCD.SampleBufferToBitmap(ABitmap,true);
        with ABitmap do begin
            if Map(TMapAccess.ReadWrite, bd) then
            try
                // Здесь делаете преобразования пикселей битмапа с помощью функций bd.GetPixel и bd.SetPixel
            finally
                Unmap(bd);
            end;
            SaveToFile('Сохраняем ABitmap');
            Free;
        end;
    end;

     

  13. 2 часа назад, Barbanel сказал:

    Не могу сказать. По моим личным наблюдениям, такое окно выводят очень редко.
    Вернее, я ни разу не видел (пока еще ни разу) чтобы свежая версия программы (т.е. она была ранее установлена и просто обновилась через гугл плей) показывала мне такое окно.

    Сразу после установки программы - да, было пару раз.

    А в тех приложениях, где вы видели подобное окно, была информация о том, что личные данные собирает Google для рекламы или же о том, что сам разработчик приложения собирает данные для своих целей?

  14. Спасибо за подробный ответ. 

    Но дело в том, что лично я никаких данных пользователя не собираю. Насколько я понял, данные собирает Google для отображения рекламы в баннере, который есть в приложении. Какие именно данные собирает Google, я тоже не знаю.

    Поэтому я не понимаю, как реализовать те пункты, которые вы указали.

    На странице Admob есть ссылка на инструкцию (https://developers.google.com/admob/android/eu-consent) как отобразить диалоговое окно в Android Studio. Но как это сделать в FMX не понятно.

    И, кстати, также интересует вопрос, что будет, если не выводить диалоговое окно, если ничего не предпринять? Приложение перестанет быть доступным для стран ЕС или последуют какие-нибудь иные ограничения?

  15. 26 минут назад, chellas88 сказал:

    Получается что и TPanel никак не изменить цвет?

    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.

  16. 22 минуты назад, wamaco сказал:

    Ничего делать не надо. Обновление политики обработки персональных данных по рекламе головная боль Google, а не Ваша. 

    Хорошо, если так и есть. Но инфа на странице Admob дает повод задуматься:

    1.PNG.dc03ae03efe1ec580556de43a97bd670.PNG2.thumb.PNG.9f8622c0f7679892d3a6c23d1e92615e.PNG

  17. Добрый день.

    Только сегодня узнал о такой штуке как GDPR о защите персональных данных пользователей из ЕС, в соответствии с которой Google вводит что-то вроде инструмента разрешения для обработки данных пользователей, которые используются для подбора рекламы в AdMob. Кто-нибудь знает об этом более подробно? Прежде всего интересует, какие изменения нужно вносить в приложение, чтобы реклама продолжала отображаться в баннере.

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