-
Постов
326 -
Зарегистрирован
-
Посещение
-
Победитель дней
57
Активность репутации
-
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;
-
OnePeople получил реакцию от Ingalime в Не добавляется иконка приложения для Android
Галочки уберите
-
OnePeople получил реакцию от Александр Алексеев в Не добавляется иконка приложения для Android
Галочки уберите
-
OnePeople получил реакцию от Ingalime в Как правильно задать разрешения приложению на доступ к файлам?
Для доступа к памяти вам нужно запросить необходимые разрешения в реальном времени, на форуме куча примеров
-
OnePeople получил реакцию от Ingalime в Целевой уровень API
Я не знаю но думаю так по памяти, в AndroidManifest.template: targetSdk=30.
-
OnePeople получил реакцию от Александр Алексеев в Как убрать ShortCut в C++ Builder 10.4 Community Edition
Закройте проект. Попробуйте открыть файл *.fmx формы в проводнике, найти ваш MainMenu22 и удалить там строчку ShortCut. Затем откройте проект.
-
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;
А так сколько показывает?
-
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');
-
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.
-
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
-
-
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;
-
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
-
OnePeople получил реакцию от Ingalime в Android: сканирование и подключение к WiFi
Вы можете его даже не создавать
TJNetworkCapabilities.JavaClass.TRANSPORT_WIFI
-
OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi
а в Яве он разворачивается в целую процедуру, какую процедуру!? Callback это ответный метод, вы так сказать подсоединяетесь к нему
Callback.onAvailable := NetworkonAvailable; и каждый раз когда платформа подключается и объявляет новую сеть готовой к использованию(onAvailable) будет вызываться процедура, которую вам необходимо объявить и описать дальнейшие действия
procedure NetworkonAvailable(network: JNetwork);
begin
//
end;
-
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;
-
OnePeople получил реакцию от Ingalime в Динамическое создание объекта во фрейме
onMouseDown := (Self.Parent as TFrame6).imgMouseDown;
-
OnePeople получил реакцию от Ingalime в [Android] А возможно ли на Delphi делать такие мобильные приложения?
Да для простых приложений это самое быстрое решение, я вам так скажу сейчас уже мало осталось того что не написать на делфи для андроид, дело в том что люди не хотят искать и писать, им нужно чтобы раз и все получилось...
-
OnePeople получил реакцию от Sascha в Динамическое создание объекта во фрейме
onMouseDown := (Self.Parent as TFrame6).imgMouseDown;
-
OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi
перегрузок может быть столько сколько у гугла в api, а там их две
-
OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi
Так её и не может быть, попробуйте в Androidapi.JNI.net.wifi заменить
JWifiNetworkSpecifier = interface(JObject)
на
JWifiNetworkSpecifier = interface(JNetworkSpecifier)
-
OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi
А нет, могу помочь сейчас, как вы ищите не понимаю
https://github.com/AndrewEfimov/Wrappers/blob/master/Androidapi.JNI.net.wifi.pas
-
OnePeople получил реакцию от UFO 007 в Android: сканирование и подключение к WiFi
И не забудьте добавить проверку на версию API, так как тот API только для android 10.
-
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, и некоторые вещи, вообще не реализованы, но их очень мало и они очень специфические.
.
-
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);