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

OnePeople

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

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

  • Посещение

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

    57

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

  1. Thanks
    OnePeople получил реакцию от Semitako в [Android]Входящий звонок   
    Вам не нужно этого делать, вам нужно обрабатывать потерю аудиофокуса. Код корявый лень в порядок приводить...
    type TMyAudioFocusChangeListener = class; // Создаем класс прослушивания фокуса аудио TForm1 = class(TForm) ... private { Private declarations } afChangeListener: TMyAudioFocusChangeListener; Создаем переменную прослушивания фокуса аудио ... public procedure GetAudioFocus; procedure onAudioFocusChange(focusChange: Integer); end; TAudioFocusChangeEvent = procedure(focusChange: Integer) of object; // описания события изменения фокуса TMyAudioFocusChangeListener = class(TJavaLocal, JAudioManager_OnAudioFocusChangeListener) // описание класса прослушивания фокуса аудио private [weak] FParent : TForm1; FOnAudioFocusChanged: TAudioFocusChangeEvent; public constructor Create(AParent : TForm1); property OnAudioFocusChanged: TAudioFocusChangeEvent read FOnAudioFocusChanged write FOnAudioFocusChanged; Destructor Destroy; Override; procedure onAudioFocusChange(focusChange: Integer); cdecl; end; var Form1: TForm1; AuFocus: JAudioManager_OnAudioFocusChangeListener; JAudioManagerListener: TMyAudioFocusChangeListener; implementation constructor TMyAudioFocusChangeListener.Create; // создание класса begin inherited Create; FParent := AParent; end; destructor TMyAudioFocusChangeListener.Destroy; // уничтожение класса begin inherited; end; procedure TMyAudioFocusChangeListener.onAudioFocusChange(focusChange: Integer); // событие изменения фокуса begin if Assigned(FOnAudioFocusChanged) then begin FOnAudioFocusChanged(focusChange); // передача события изменения фокуса end; FParent.onAudioFocusChange(focusChange); // вызов процедуры изменения фокуса формы end; procedure TForm1.onAudioFocusChange(focusChange: Integer); //процедура изменения фокуса формы begin if (focusChange=TJaudioManager.JavaClass.AUDIOFOCUS_LOSS) then // фокус потерян begin // music stop // действия если фокус потерян end; end; procedure TForm1.GetAudioFocus; // получаем фокус для своего приложения begin CallinUIThread(procedure var AudioFocusRequest: JAudioFocusRequest; playbackAttributes: JAudioAttributes; afHandler: JHandler; res: integer; begin afChangeListener := TMyAudioFocusChangeListener.Create(Self); // создаем класс прослушивания аудио фокуса для своего приложения afHandler := TJHandler.Create; // создаем указатель своего приложения 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); // непосредственно запрашиваем фокус if res = TJAudioManager.JavaClass.AUDIOFOCUS_REQUEST_DELAYED then // отказано else if res = TJAudioManager.JavaClass.AUDIOFOCUS_REQUEST_GRANTED then begin //фокус получен LogCAAdd('AUDIOFOCUS_REQUEST_GRANTED'); end else if res = TJAudioManager.JavaClass.AUDIOFOCUS_REQUEST_FAILED then // отказано LogCAAdd('AUDIOFOCUS_REQUEST_FAILED'); end ); end;  
  2. Like
    OnePeople получил реакцию от Ingalime в Не добавляется иконка приложения для Android   
    Галочки уберите

  3. Like
    OnePeople получил реакцию от Александр Алексеев в Не добавляется иконка приложения для Android   
    Галочки уберите

  4. Like
    OnePeople получил реакцию от Ingalime в Как правильно задать разрешения приложению на доступ к файлам?   
    Для доступа к памяти вам нужно запросить необходимые разрешения в реальном времени, на форуме куча примеров
  5. Like
    OnePeople получил реакцию от Ingalime в Целевой уровень API   
    Я не знаю но думаю так по памяти, в AndroidManifest.template: targetSdk=30.
  6. Thanks
    OnePeople получил реакцию от Александр Алексеев в Как убрать ShortCut в C++ Builder 10.4 Community Edition   
    Закройте проект. Попробуйте открыть файл *.fmx формы в проводнике, найти ваш MainMenu22 и удалить там строчку ShortCut. Затем откройте проект.
  7. Like
    OnePeople получил реакцию от Ingalime в Смещение CANVSa или почему? при печати на принтер   
    DialogService: IFMXDialogService;
     FMargin, FMinMargin: TRect;
     FPaperSize: TPointf;
     FUnits: TPageMeasureUnits;
     FOptions : TPageSetupDialogOptions;
    begin

      if TPlatformServices.Current.SupportsPlatformService(IFMXDialogService, DialogService) then
        DialogService.PageSetupGetDefaults(FMargin, FMinMargin, FPaperSize, FUnits, FOptions);
    Text8.Text := FMinMargin.Left.ToString + ' ' + FMinMargin.Top.ToString;
    А так сколько показывает?
  8. Like
    OnePeople получил реакцию от Ingalime в Как вместе с программой установить файл базы данных?   
    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');
     
     
  9. Like
    OnePeople получил реакцию от Ingalime в Как вместе с программой установить файл базы данных?   
    Можно не писать в startupcopy.pas есть методы обновления ассетов. Самому лень писать))))
    I feel that files that need to be deployed are files that should not and need not be changed by the application. They are resources like images. If an application changes a file, it does so with intent. The user via the developer wanted it that way. Changing it back through an update causes data loss. As a consequence all files that could be subject to change should not be deployed but generated when used.
  10. Like
    OnePeople получил реакцию от Ingalime в Как вместе с программой установить файл базы данных?   
    Если будете загружать файл в 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
  11. Like
    OnePeople получил реакцию от Ingalime в Removed execute permission for app home directory   
    Это можно
  12. Like
    OnePeople получил реакцию от Semitako в [Android]Входящий звонок   
    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;  
  13. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    Нашел времени немного, у себя сделал так, нахожу все сети, заполняю ими 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
  14. Like
    OnePeople получил реакцию от Ingalime в Android: сканирование и подключение к WiFi   
    Вы можете его даже не создавать
    TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI
  15. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    а в Яве он разворачивается в целую процедуру, какую процедуру!? Callback это ответный метод, вы так сказать подсоединяетесь к нему
     
    Callback.onAvailable := NetworkonAvailable; и каждый раз когда платформа подключается и объявляет новую сеть готовой к использованию(onAvailable) будет вызываться процедура, которую вам необходимо объявить и описать дальнейшие действия
     
    procedure NetworkonAvailable(network: JNetwork);
    begin
    //
    end;
  16. Like
    OnePeople отреагировална krapotkin в Динамическое создание объекта во фрейме   
    эмм крайне странная логика, не ?
    обработчик должен присваивать тот кто создает, а не тот, кого создают
    и уж 99.9% компонент не должен знать ничего о классе, куда его будут вставлять
    procedure TFrame6.SomeProc(); var   img: TMyImage; begin img := TMyImage.Create(Self); img.parent := layout5; img.OnMouseDown := OnMouseDown; images.add(img); end;  
  17. Like
    OnePeople получил реакцию от Ingalime в Динамическое создание объекта во фрейме   
    onMouseDown :=  (Self.Parent as TFrame6).imgMouseDown;
  18. Like
    OnePeople получил реакцию от Ingalime в [Android] А возможно ли на Delphi делать такие мобильные приложения?   
    Да для простых приложений это самое быстрое решение, я вам так скажу сейчас уже мало осталось того что не написать на делфи для андроид, дело в том что люди не хотят искать и писать, им нужно чтобы раз и все получилось...
  19. Thanks
    OnePeople получил реакцию от Sascha в Динамическое создание объекта во фрейме   
    onMouseDown :=  (Self.Parent as TFrame6).imgMouseDown;
  20. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    перегрузок может быть столько сколько у гугла в api, а там их две
  21. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    Так её и не может быть, попробуйте в  Androidapi.JNI.net.wifi заменить 
      JWifiNetworkSpecifier = interface(JObject)
    на
      JWifiNetworkSpecifier = interface(JNetworkSpecifier)
  22. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    А нет, могу помочь сейчас, как вы ищите не понимаю 
    https://github.com/AndrewEfimov/Wrappers/blob/master/Androidapi.JNI.net.wifi.pas
     
     
  23. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    И не забудьте добавить проверку на версию API, так как тот API только для android 10.
  24. Like
    OnePeople получил реакцию от Ingalime в Android: сканирование и подключение к WiFi   
    Здесь все зависит от того, как сделано в android. Следовательно вам всегда в первую очередь нужно смотреть справку developer.android.com.
    Все что ниже это то как делаю я, не истина, так как мне для хобби достаточно. На примере 
     
    1. JConnectivityManager. 
    Захожу в справку, ищу JConnectivityManager, открываю пример работы с API.
    Вижу код:
     
    ConnectivityManager cm =         (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); Начинаю переписывать на Delphi (паскале, не считаю) и вижу что getSystemService возвращает JObject. Если мы получаем не определенный объект то нам нужно сопоставить его с определенным классом, так сказать объект обернуть в класс 
    НАШКЛАСС.ОБЕРНУТЬ(ИД_ОБЪЕКТА)
    TJConnectivityManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID); Если же объект создается методом new, тогда мы можем просто использовать init, create. (В чем разница я не знаю
                AudioFocusRequest:=TJAudioFocusRequest_Builder.JavaClass.init(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN);
                AudioFocusRequest:=TJAudioFocusRequest_Builder(TJAudioManager.JavaClass.AUDIOFOCUS_GAIN).Create;
    Я пользуюсь обоими видами конструкцию, но предпочитаю init
    )
     
    2.Захожу в справку, ищу JWifiNetworkSpecifier, вижу
    Apps should use the WifiNetworkSpecifier.Builder class to create an instance.
    Соответственно Network specifier object создается строителем, перехожу дальше в WifiNetworkSpecifier.Builder, смотрю там и так далее.
     
    Есть всякие костыли и идеи людей решающие многие проблемы, но я вам так скажу у вас не будет проблем если вы будете делать так как вам советует гугл, а если и будут, то на китайских устройствах где по какой то причине китайцы просто что то сломали в системе и заменили это своим хламом не отвечающим требованиям гугл(Обычно телефон и BT). Единственная помарка, в Delphi бывает отсутствует все API, и некоторые вещи, вообще не реализованы, но их очень мало и они очень специфические.
     
    .
     
  25. Like
    OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi   
    WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder(); builder.setSsid("wifi-ap-ssid"); builder.setWpa2Passphrase("wifi-ap-password"); Вот это добавлено только для API 29 и выше
    NetworkSpecifierObj:= TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE); NetworkSpecifier:= TJNetworkSpecifier.Wrap((NetworkSpecifierObj as ILocalObject).GetObjectID); Чушь полная, вы запрашиваете сервис соединений ConnectivityManager, а NetworkSpecifier это абстрактный класс он не создается вообще его получают от другого API. WifiNetworkSpecifier и NetworkSpecifier это разные вещи, вам нужен именно WifiNetworkSpecifier.
         
     
      var ConnectivityManagerNative: JObject;   ConnectivityManager: JConnectivityManager;   NetworkRequest_Builder: JNetworkRequest_Builder;   NetworkRequest: JNetworkRequest; WifiNetworkSpecifier: JWifiNetworkSpecifier; WifiNetworkSpecifier_Builder: JWifiNetworkSpecifier_Builder; begin   WifiNetworkSpecifie_Builder:= TJWifiNetworkSpecifier.JavaClass.init;  WifiNetworkSpecifie_Builder.setSsid("wifi-ap-ssid");   WifiNetworkSpecifie_Builder.setWpa2Passphrase("wifi-ap-password"); WifiNetworkSpecifier := WifiNetworkSpecifie_Builder.build;   NetworkRequest_Builder := TJNetworkRequest_Builder.JavaClass.init;   NetworkRequest_Builder.addTransportType(TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI);   NetworkRequest_Builder.setNetworkSpecifier(wifiNetworkSpecifier);   NetworkRequest := NetworkRequest_Builder.build;   ConnectivityManagerNative := TAndroidHelper.Context.getSystemService(TJContext.JavaClass.CONNECTIVITY_SERVICE);   connectivityManager := TJConnectivityManager.Wrap((ConnectivityManagerNative as ILocalObject).GetObjectID);   connectivityManager.requestNetwork(NetworkRequest, callback);  
×
×
  • Создать...