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

OnePeople

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

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

  • Посещение

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

    57

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

  1. procedure TForm1.UpdateAsset(AssetName, FilePath: String);
    var
      inputStream: JInputStream;
      FileOutputStream: JFileOutputStream;
      WData: TJavaArray<Byte>;
      LData: Integer;
    begin
    
      try
      InputStream :=  TAndroidHelper.Context.getAssets.open(StringToJString(AssetName));
      except
        exit;
      end;
    
      try
      FileOutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FilePath));
      except
        exit;
      end;
    
      WData := TJavaArray<Byte>.Create(4096);
      repeat
       try
           LData := InputStream.read(WData);
       except
           LData := -1;
       end;
    
      if LData <> -1 then
         begin
            FileOutputStream.write(WData, 0, LData);
         end;
      until (LData = -1) or (LData = 0);
    
      FileOutputStream.flush;
      FileOutputStream.close;
      inputStream.close;
    
    end;

    Обновление файла из assets в папку с программой

    Пользоваться так проверяете при Form.Create что версия новая и вызываете UpdateAsset('internal/base.db', ApplicationPath + 'base.db');

     

     

  2. Если будете загружать файл в deployment тогда ваша база будет здесь 

    Для remote path: assets\internal

    TPath.Combine(TPath.GetDocumentsPath, 'filename')  { Internal }

    Для remote path: assets

    TPath.Combine(TPath.GetPublicPath, 'filename')  { External }

    Есть же в конце то концов https://docwiki.embarcadero.com/RADStudio/Sydney/en/Creating_an_Android_App#Loading_and_Deploying_Files

  3.     if TJBuild_VERSION.JavaClass.SDK_INT >= 26 then
            begin
                playbackAttributes := TJAudioAttributes_Builder.Create
                        .setUsage(TJAudioAttributes.JavaClass.USAGE_MEDIA)
                        .setContentType(TJAudioAttributes.JavaClass.CONTENT_TYPE_MUSIC)
                        .build();
    
                AudioFocusRequest:=TJAudioFocusRequest_Builder(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN).Create
                        .setAudioAttributes(playbackAttributes)
                        .setAcceptsDelayedFocusGain(true)
                        .setOnAudioFocusChangeListener(afChangeListener, afHandler)
                        .build();
    
                 res := FAudioManager.requestAudioFocus(AudioFocusRequest);
            end else
                begin
                   res := FAudioManager.requestAudioFocus(afChangeListener, TJAudioManager.JavaClass.STREAM_MUSIC, TJAudioManager.JavaClass.AUDIOFOCUS_GAIN);
                end;

     

  4. 5 часов назад, Lev сказал:

    не увидел альтернативу воспроизведения звука

    Вариантов масса, BASS, стандартный android MediaPlayer, сторонние библиотеки все зависит от того какая платформа, какой файл короткий, длинный, что вы хотите кроме воспроизведения и т.д.

  5. 13 часов назад, Sascha сказал:

    Как одновременно изменить Position.X и Position.Y, чтобы использовать их в AnimateFloatWait?

      TAnimator.AnimateFloat(Image1, 'Position.X', P.X, Time);
      TAnimator.AnimateFloatWait(Image1, 'Position.Y', P.Y, Time, Timewait);

    Не проверял уже давно, но в андроид не работало, в Windows точно работает, 

    я делаю так, в особых случаях

    Внимание костыль!

     TTask.Run(procedure()
        begin
          TThread.Synchronize(nil, procedure()
           begin
             TAnimator.AnimateFloat(Image1, 'Position.X', P.X, Time);
             TAnimator.AnimateFloat(Image1, 'Position.Y', P.Y, Time);
           end);
        sleep(Time);
          TThread.Synchronize(nil, procedure()
           begin
           после анимации идет важная процедура)
           end);
        end);
  6. Нашел времени немного, у себя сделал так, нахожу все сети, заполняю ими ListView, при нажатии на item вызываю ConnectToWifi(ssid, bsid, password: String) а вы какой хотите велосипед такой и изобретайте

    1.JWifiNetworkSpecifier = interface(JObject) оставляем!

    2.

    procedure ConnectToWifi(ssid, bsid, password: String);
      var
        ConnectivityManagerNative: JObject;
        ConnectivityManager: JConnectivityManager;
        NetworkRequest_Builder: JNetworkRequest_Builder;
        NetworkRequest: JNetworkRequest;
        WifiNetworkSpecifier: JWifiNetworkSpecifier;
        WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder;
        WiFicallback: JConnectivityManager_NetworkCallback;
      begin
      WifiNetworkSpecifier := TJWifiNetworkSpecifier_Builder.Create
                        .setSsidPattern(TJPatternMatcher.JavaClass.init(StringToJString(ssid), TJPatternMatcher.JavaClass.PATTERN_PREFIX))
                        .setBssid(TJMacAddress.JavaClass.fromString(StringToJString(bsid)))
                        .setWpa2Passphrase(StringToJString(password))
                        .build();
    
      NetworkRequest := TJNetworkRequest_Builder.Create
                        .addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI)
                        .removeCapability(TJNetworkCapabilities.JavaClass.NET_CAPABILITY_INTERNET)
                        .setNetworkSpecifier( TJNetworkSpecifier.Wrap((WifiNetworkSpecifier as ILocalObject).GetObjectID))
                        .build();
    
      WiFicallback := TJConnectivityManager_NetworkCallback.JavaClass.init;
    
      ConnectivityManagerNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);
      connectivityManager := TJConnectivityManager.Wrap((ConnectivityManagerNative as ILocalObject).GetObjectID);
    
      connectivityManager.requestNetwork(NetworkRequest, WiFicallback);
    end;

    3. WiFiCallBack это обратный вызов - это класс Java, поэтому вам нужно создать потомка и реализовать необходимые методы. В настоящее время это невозможно сделать в Delphi (хотя listner'ы отлично реализуются), поэтому вам нужно будет сделать это на Java. В коде Java вы можете объявить интерфейс, который может быть передан классу, как в этом примере:

    https://github.com/DelphiWorlds/Kastri/blob/master/Features/Connectivity/DW.Connectivity.Android.pas

     https://github.com/DelphiWorlds/Kastri/tree/master/Java/Base/Connectivity

  7. Так правильно, какая перегрузка метода, который берется с указанием директивы вызова процедур, его нет, а вы сами придумали.

    Короче я вас не понимаю, на днях я в своем приложении буду делать схожий функционал, выложу вам код, сейчас ремонт, очень редко за пк(

  8. по-библейски я знаю историю языка, но по мне он достаточно ушел по возможностям чтобы его называть Pascal'ем.

    20 часов назад, UFO 007 сказал:

    тут чё писать

    Допустим

    memo1.lines.add('connect');

    Я ни каких велосипедов не изобретаю, поменяйте местами

    Callback:= TJConnectivityManager_NetWorkCallback.JavaClass.init;//.Create;

    Callback.onAvailable(ConnectivityManager.getActiveNetwork ;

    ConnectivityManager.requestNetwork(NetworkRequest, Callback);

     

    21 час назад, UFO 007 сказал:

    Function NetworkonAvailable(network: JNetwork? JNetwork

    Разве onAvailable функция??? Мне кажется что нет. 

    procedure TForm1.NetworkonAvailable(network: JNetwork)

    Вот этим можно просто зарегистрировать callback и его метод onAvailable будет каждый раз вызываться при подключении к сети.

    ConnectivityManager.registerDefaultNetworkCallback(Callback)

    А эта конструкция подключается к сети которая наиболее подходит к параметрам NetworkRequest и callback.onAvailable будет вызываться при подключении именно к этой сети.

    ConnectivityManager.requestNetwork(NetworkRequest, Callback);

     

    P.s читайте android developer, ищите ошибки у себя в коде, тестите, выводить в memo логи какие нибудь и смотрите что не работает

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

    Добрый совет - лучше напиши на котлине или джаве, меньше потом проблем будет. 

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

  10. а в Яве он разворачивается в целую процедуру, какую процедуру!? Callback это ответный метод, вы так сказать подсоединяетесь к нему

     

    Callback.onAvailable := NetworkonAvailable;

    и каждый раз когда платформа подключается и объявляет новую сеть готовой к использованию(onAvailable) будет вызываться процедура, которую вам необходимо объявить и описать дальнейшие действия

     

    procedure NetworkonAvailable(network: JNetwork);

    begin

    //

    end;

  11. Base class for NetworkRequest callbacks. Used for notifications about network changes. Should be extended by applications wanting notifications. A NetworkCallback is registered by calling

    Соответственно это класс. Соответственно здесь вы и увидете что происходит с этой сетью вай фай в зависимости от процедур объявленных в этом классе

     

     

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