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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. 10 часов назад, YurMak сказал:
    
    CurrentPath := CurrentPath+Item.ItemData.Text;

    Возможно, проблема в том, что вы не обнуляете переменную CurrentPath. И при повторном нажатии на Item в ней будет строка, которая уже не является путём к директории или файлу. Поэтому код не срабатывает.

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

    Проверил эту гипотезу. На предмет глюков  RAD Studio 10.1 Berlin Update 2 с TThread.Synchronize. Эта проблема меня больше всего волнует из всех под win, остальные я уже почти все обошёл так или иначе. Для чистоты эксперимента взял виртуальную машину, образ скаченный с сайта эмбы и всё. Ничего стороннего не ставилось.

    Результат печален.  Один и тот-же проект, под 10.2 стандартные падения в стандартных местах, где-то 1 раз из 4-х, может чуть реже. Берлин падает каждый раз при выходе, после использования синхронайза, плюс в процессе работы падения 1 из 3 или даже 1 из 2. В общем Токио ГОРАЗДО стабильнее работает с много поточностью.
     

    P.S. Запускалось естественно всё на одной машине, под одним пользователем.
     

    Первый раз слышу о проблемах с TThread.Synchronize.

     

  3. 26 минут назад, x11 сказал:

    Да просто указываешь в TargetSDK нужную версию.

    Но придётся использовать костыль с динамическими правами.

    Если нужны небезопасные разрешения. Если таковые не нужны, то костыль не нужен.

    Хотя не такой уж это и костыль (Если речь о решении Андрея Ефимова). А вполне хорошая вещь.

  4. 12 часа назад, wamaco сказал:

    Это конечно все хорошо.... новые SDK и все такое... но надо смотреть еще и на процент используемых аппаратов у пользователей...

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

    всегда это оправдано. чего не скажешь про ios. там все хорошо. :)

    Google уже пообещала с лета ограничивать приложения, TargetSDK которых ниже актуальной версии на 2 единицы и более. Так что гнаться нужно будет обязательно, чтобы приложение осталось в Google Play

  5. 8 часов назад, Равиль Зарипов (ZuBy) сказал:

    Вот поэтому нужно валить с делфи, если хотите и дальше писать под андроид. Нам нельзя повышать СДК (андроид 6.0+ запрашивает разрешения в рантайм, чего мы не можем делать, хотя есть костыль у Андрея Ефимова)

    Разве возможность выдавать разрешения в рантайм не может появиться в будущих версиях FMX? (Тем более что пример от Андрея Ефимова подтверждает, что и сейчас это решаемо). Тоже самое и насчет 64 битных приложений.

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

    Просто собираюсь дальше писать под Андроид и немного неожиданно было прочесть такую инфу в вашем комментарии )).

     

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

    Совсем недавно появилась информация, что с апреля все публикуемые в App Store приложения должны обязательно поддерживать экран смартфона Apple iPhone X.

    В связи с этим естественно напрашивается вопрос, как это реализовать в Rad Studio и что вообще подразумевается под поддержкой такого экрана - чтобы в приложении было предусмотрено место под выемку?

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

  7. Тоже есть вопрос по этой теме.

    Для того, чтобы уже размещенные приложения продолжали быть доступными - достаточно ли обновить годовую подписку, или же нужно заново получать все сертификаты (у них тоже ограничение 1 год), пересоздавать приложение с новыми сертификатами и обновлять его в App Store?

  8. Здесь речь идёт о значении targetSDK в файле манифеста. Этот параметр влияет на то,  использует ли приложение новые функции последних версий SDK. То есть какие SDK приложение гарантированно поддерживает. Но если сейчас этому параметру разработчик может в принципе придавать любые значения, то со второй половины этого года Google вводит правило, что он должен быть не ниже предпоследней версии. То есть если сейчас последняя версия равна 27, значит этот параметр должен быть с августа не ниже 26 для новых приложений, а с ноября для обновлений. В дальнейшем раз в год по мере выхода новых версий Android нужно повышать это значение на 1. Так Google побуждает разработчиков использовать функции новых версий SDK.

    Чтобы соответствовать этим требованиям, нужно обновлять значение параметра TargetSDK в файле манифеста, и все будет норм.

  9. Причем, строка в манифесте:

    <meta-data android:name="com.google.android.gms.version" android:value="4323000" />

    появляется при включении Admob Service в Project->Options->Entitlement list и в последней версии студии 10.2.2, которая была выпущена недавно.

    Значит ли это, что Rad Studio не поддерживает Mobile Ads SDK выше этой версии? Или этот параметр ни на что не влияет, в том числе и на то, что Google перестанет поддерживать Mobile Ads SDK старше 7.0.0?

     

  10. Все же возникли сомнения на этот счет.

    Прочел разную инфу и уже не уверен в правильности своего ответа. Не могу понять, нужно обновлять переменную <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> в манифесте или достаточно наличия последней версии SDK.

    Гугл говорит, что версии Mobile Ads SDK старше 7.0.0 поддерживаться не будут. Но сейчас он является частью Google Play Services. 

    Если проект собран с последней версией Google Play Services, достаточно ли этого? Или же нужно менять и переменную com.google.android.gms.version в манифесте?

    Кто может подсказать?

  11. Чтобы не было красного крестика, нужно не только создать эмулятор в AVD менеджере, но и запустить его там же. В итоге на экране увидите окно, в котором запускается интерфейс Android. Когда он запустится, и появится рабочий стол Android, можно запускать установку приложения на эмулятор.

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

  12. Может быть вам пригодится - мой пример векторного подхода к AniIndicator без использования картинок и для различных разрешений экрана.

    Для отрисовки дуги использовал компонент Равиля на основе FMX.Graphics.Native, поскольку стандартные функции не красиво рисуют под Андроидом.

    Сам индикатор:

    unit newaniindicator;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Ani,
      FMX.Objects, FMX.Layouts, FMX.ZNativeDrawFigure;
    
    type
      TNewAniIndicator = class(TZNativeDrawFigureArc)
        Animation: TFloatAnimation;
        procedure AnimationProcess(Sender: TObject);
        procedure AnimationFinish(Sender: TObject);
        procedure IndicatorResize(Sender: TObject);
        procedure Start;
        procedure Stop;
        Constructor Create(AOwner: TComponent); override;
        Destructor Destroy; override;
        private
            active: boolean;
        public
            colors: array of TAlphaColor;
      end;
    
    
    implementation
    
    constructor TNewAniIndicator.Create(AOwner: TComponent);
    begin
        inherited Create(AOwner);
        Fill.Kind:=TBrushKind.None;
        Stroke.Cap:=TStrokeCap.Round;
        Stroke.Join:=TStrokeJoin.Round;
        Animation:=TFloatAnimation.Create(Self);
        with Animation do begin
            Parent:=Self;
            Duration:=1;
            StartValue:=-90;
            StopValue:=270;
            PropertyName:='StartAngle';
            Interpolation:=TInterpolationType.Quadratic;
            OnProcess:=AnimationProcess;
            OnFinish:=AnimationFinish;
        end;
        OnResize:=IndicatorResize;
    end;
    
    destructor TNewAniIndicator.Destroy;
    begin
        Animation.Free;
        inherited;
    end;
    
    procedure TNewAniIndicator.IndicatorResize(Sender: TObject);
    begin
        Stroke.Thickness:=Width*0.1;
    end;
    
    procedure TNewAniIndicator.Start;
    begin
        active:=true;
        Stroke.Color:=colors[0];
        Visible:=true;
        Animation.Start;
    end;
    
    procedure TNewAniIndicator.Stop;
    begin
        active:=false;
        Visible:=False;
        Animation.Stop;
    end;
    
    procedure TNewAniIndicator.AnimationProcess(Sender: TObject);
    begin
        EndAngle:=-0.0037*sqr(StartAngle)+0.667*StartAngle+90; //Функция сжатия/растяжения дуги
    end;
    
    procedure TNewAniIndicator.AnimationFinish(Sender: TObject);
    var i: byte;
    begin
        if active then begin
            i:=0; while colors[i] <> Stroke.Color do inc(i);
            if i=length(colors)-1 then Stroke.Color:=colors[0] else Stroke.Color:=colors[i+1];
            Animation.Start;
        end;
    end;
    end.

    Далее в программе:

        ani:=TNewAniIndicator.Create(form1);
        with ani do begin
            Parent:=Form1;
            Width:=Form1.Width*0.2;
            Height:=Width;
            setlength(colors,6);
            colors[0]:=TAlphaColors.Red;
            colors[1]:=TAlphaColors.Orange;
            colors[2]:=TAlphaColors.Yellow;
            colors[3]:=TAlphaColors.Green;
            colors[4]:=TAlphaColors.Blue;
            colors[5]:=TAlphaColors.Violet;
            Start;
        end;

    newaniindicator.zip

  13. Если все же решили остановиться на BitmapListAnimation, то нарисуйте в графическом редакторе такой индикатор, который вам нравится, и устраивающий вас по  размеру. Далее, напишите в Делфи простенькую программу, которая поворачивает это изображение на определенный угол в зависимости от того, сколько кадров анимации вам нужно. Если 30 кадров, то на угол 360/30 = 12 градусов. И сохраните этот массив из 30 картинок в одно изображение. Это и будет ваша заготовка для BitmapListAnimation.

    В дальнейшем, если решите заменить индикатор анимации, то будет уже легче это сделать с такой программкой.

    Все ИМХО конечно. Но когда-то делал именно так, правда все равно перешёл на векторный вариант, потому что хотел чтоб индикатор ещё и цвет менял после каждого оборота.

  14. Насколько я понимаю, речь идет о том, какую версию Google Mobile Ads SDK вы используете. И манифест здесь ни при чем. Google Mobile Ads SDK сейчас является составной частью Google Play Services. И если вы регулярно обновляете SDK под Android, то все должно быть норм.

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

    1.PNG.4ace54ec3df7172cf0fd1c66f6dd6944.PNG

  15. Сделал простой пример приложения рации в локальной сети под Android. Реализация через UDP. 

    Буду рад, если кому окажется полезным.

    Для начала/окончания сеанса связи нужно нажать на окружность

    Screenshot_2017-11-18-21-12-26-443_com.embarcadero.Project5.thumb.png.1c7b66db773caff541a943b8a7b09d9b.pngScreenshot_2017-11-18-21-12-31-104_com.embarcadero.Project5.thumb.png.7cb018ff8c34cbad623f730535e672e5.png

    Для проверки нужно 2 телефона

    unit Unit5;
    
    interface
    
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
      FMX.Controls.Presentation, FMX.StdCtrls, IdUDPServer, IdBaseComponent,
      IdComponent, IdUDPBase, IdUDPClient, IdGlobal, IdSocketHandle, Androidapi.JNI.Media,
      Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, AndroidApi.JNI, AndroidApi.Helpers,
      FMX.Objects, System.Math;
    
    type
      TForm1 = class(TForm)
        Circle: TCircle;
        procedure ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
        procedure FormCreate(Sender: TObject);
        procedure CircleTap(Sender: TObject; const Point: TPointF);
      end;
    
      TSendThread = class(TThread)
        protected
        procedure Execute;  override;
      end;
    
    var
      Form1: TForm1;
      SendThread: TSendThread;
      Server: TIdUDPServer;
      audioRecord: JaudioRecord;
      audiotrack: JAudioTrack;
      recording: boolean;
      buffer_Size, port,ch_in, ch_out, format, freq, source: integer;
    
    implementation
    
    {$R *.fmx}
    
    procedure TSendThread.Execute;
    var buffer: TJavaArray<Byte>;
    begin
        buffer := TJavaArray<Byte>.create(buffer_size);
        while recording do begin
            audioRecord.read(buffer,0,buffer_size);
            Server.Broadcast(TIDBytes(TJavaArrayToTBytes(buffer)),port);
        end;
        buffer.Free;
    end;
    
    procedure TForm1.CircleTap(Sender: TObject; const Point: TPointF);
    begin
        recording:= not recording;
        if recording then begin
            Circle.Fill.Color:=TAlphaColors.Red;
            Server.OnUDPRead:=nil;
            audiorecord.startRecording;
            SendThread:=TSendThread.Create;
        end
        else begin
            Circle.Fill.Color:=TAlphaColors.Gray;
            audiorecord.stop;
            Server.OnUDPRead:=ServerUDPRead;
        end;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        buffer_size:=2048; freq:=8000; port:=5555;
        Server:=TIdUdpServer.Create(Form1);
        with Server do begin
            BufferSize:=buffer_size;
            DefaultPort:=port;
            BroadCastEnabled:=true;
            Active:=true;
            OnUDPRead:=ServerUDPRead;
        end;
    
        Circle.Width:=min(Screen.Width,Screen.Height)*0.7;
        Circle.Height:=Circle.Width;
    
        ch_in:=TJAudioFormat.JavaClass.CHANNEL_IN_MONO;
        ch_out:=TJAudioFormat.JavaClass.CHANNEL_OUT_MONO;
        format:=TJAudioFormat.JavaClass.ENCODING_PCM_16BIT;
        source:=TJMediaRecorder_AudioSource.JavaClass.MIC;
    
        audioRecord := TJAudioRecord.JavaClass.init(source, freq, ch_in, format, buffer_size);
        audiotrack:=TJAudioTrack.JavaClass.init(3, freq, ch_out, format, buffer_size,1);
    end;
    
    procedure TForm1.ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
    begin
        audiotrack.write(TBytesToTJavaArray(TBytes(AData)),0,Length(AData));
        audiotrack.play;
    end;
    
    end.

     

    radio.zip

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