Лидеры
Популярный контент
Показан контент с высокой репутацией 29.06.2021 во всех областях
-
Оставлю тут код демо-проекта и обёртку для WallpaperManager, кому-нибудь в будущем пригодятся. // Подключить System.IOUtils, Androidapi.JNI.GraphicsContentViewText, // Androidapi.JNI.JavaTypes, // Androidapi.helpers, android.app.WallpaperManager; (android.app.WallpaperManager распаковать и закинуть к исходникам проекта) //перейти в Project->Options->Application->Uses permissions и поставить галочку напротив пункта "Set wallpaper" procedure TForm1.Button1Click(Sender: TObject); var path: string; str: JString; Wallpaper: JWallpaperManager; Image: JBitmap; Context: JContext; begin if Edit1.Text <> '' then begin path := Tpath.Combine(Tpath.GetDocumentsPath, Edit1.Text); //Вместо TPath.GetDocumentsPath можно написать путь к любой директории на //устройстве, вместо Edit1.text - название картинки(с расширением, важно соблюдать регистр!!!) str := StringToJString(path); Context := SharedActivityContext; try if FileExists(path) then begin ShowMessage('Файл найден'); Image := TJBitmapFactory.JavaClass.decodeFile(str) end else ShowMessage('Файл не найден'); except ShowMessage('Не удалось декодировать'); end; try Wallpaper := TJWallpaperManager.JavaClass.getInstance(Context); Wallpaper.setBitmap(Image); except ShowMessage('Не удалось установить обои'); end; end; end; android.app.WallpaperManager.pas.7z1 балл
-
Firemonkey и обои рабочего стола
Andrey Efimov отреагировал PowerOwl за вопрос
Извиняюсь за потраченное время, я сам затупил... У меня клавиатура автоматически переключается в верхний регистр перед началом набора текста, и поэтому программа не могла найти файл. Забыл, что в C-подобных языках регистр имеет значение. В общем, программа работает. А что по поводу изучения основ, то я был бы рад их изучить, но не могу найти нигде нормальную(современную) литературу, где доходчиво объясняется использование библиотеки Firemonkey. P.S. Я ещё заметил, что у объектов класса JContext есть методы для работы с обоями, но в официальной документации Android сказано, что их вырезали в API Level 15, так что для программирования до Android 4.0 можно обойтись и без WallpaperManager1 балл -
Firemonkey и обои рабочего стола
Andrey Efimov отреагировал PowerOwl за вопрос
Спасибо за замечания, буду пытаться исправляться. 1) Спасибо, перечитал, разобрался 2) Приложу обёртку снизу 3) Я не могу понять, где взять Context для этого метода. В Java-примерах для его получения используют функцию getContext(), но в Firemonkey такой нет. unit android.app.WallpaperManager; interface uses Androidapi.JNIBridge, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.JNI.Net, Androidapi.JNI.Os, Androidapi.JNI.Util; type // ===== Forward declarations ===== JWallpaperInfo = interface;//android.app.WallpaperInfo JWallpaperManager = interface;//android.app.WallpaperManager // ===== Interface declarations ===== JWallpaperInfoClass = interface(JObjectClass) ['{D1CC9CBB-D53F-4F29-ADA9-DD0BF04B0C86}'] {class} function _GetCREATOR: JParcelable_Creator; cdecl; {class} function init(context: JContext; service: JResolveInfo): JWallpaperInfo; cdecl; {class} function describeContents: Integer; cdecl; {class} procedure dump(pw: JPrinter; prefix: JString); cdecl; {class} function getComponent: JComponentName; cdecl; {class} function getSettingsActivity: JString; cdecl; {class} function loadAuthor(pm: JPackageManager): JCharSequence; cdecl; {class} function loadDescription(pm: JPackageManager): JCharSequence; cdecl; {class} function toString: JString; cdecl; {class} procedure writeToParcel(dest: JParcel; flags: Integer); cdecl; {class} property CREATOR: JParcelable_Creator read _GetCREATOR; end; [JavaSignature('android/app/WallpaperInfo')] JWallpaperInfo = interface(JObject) ['{A357E89F-3891-4795-8207-B1416424D512}'] function getPackageName: JString; cdecl; function getServiceInfo: JServiceInfo; cdecl; function getServiceName: JString; cdecl; function loadIcon(pm: JPackageManager): JDrawable; cdecl; function loadLabel(pm: JPackageManager): JCharSequence; cdecl; function loadThumbnail(pm: JPackageManager): JDrawable; cdecl; end; TJWallpaperInfo = class(TJavaGenericImport<JWallpaperInfoClass, JWallpaperInfo>) end; JWallpaperManagerClass = interface(JObjectClass) ['{F16EBFA1-4C27-4869-BEAA-3112EC3303A9}'] {class} function _GetACTION_CHANGE_LIVE_WALLPAPER: JString; cdecl; {class} function _GetACTION_CROP_AND_SET_WALLPAPER: JString; cdecl; {class} function _GetACTION_LIVE_WALLPAPER_CHOOSER: JString; cdecl; {class} function _GetCOMMAND_DROP: JString; cdecl; {class} function _GetCOMMAND_SECONDARY_TAP: JString; cdecl; {class} function _GetCOMMAND_TAP: JString; cdecl; {class} function _GetEXTRA_LIVE_WALLPAPER_COMPONENT: JString; cdecl; {class} function _GetWALLPAPER_PREVIEW_META_DATA: JString; cdecl; {class} procedure clear; cdecl;//Deprecated {class} function getBuiltInDrawable(outWidth: Integer; outHeight: Integer; scaleToFit: Boolean; horizontalAlignment: Single; verticalAlignment: Single): JDrawable; cdecl; overload; {class} function getCropAndSetWallpaperIntent(imageUri: Jnet_Uri): JIntent; cdecl; {class} function getDesiredMinimumHeight: Integer; cdecl; {class} function getInstance(context: JContext): JWallpaperManager; cdecl; {class} function getWallpaperInfo: JWallpaperInfo; cdecl; {class} function hasResourceWallpaper(resid: Integer): Boolean; cdecl; {class} procedure sendWallpaperCommand(windowToken: JIBinder; action: JString; x: Integer; y: Integer; z: Integer; extras: JBundle); cdecl; {class} procedure setBitmap(bitmap: JBitmap); cdecl; {class} procedure setResource(resid: Integer); cdecl; {class} procedure setWallpaperOffsets(windowToken: JIBinder; xOffset: Single; yOffset: Single); cdecl; {class} procedure suggestDesiredDimensions(minimumWidth: Integer; minimumHeight: Integer); cdecl; {class} property ACTION_CHANGE_LIVE_WALLPAPER: JString read _GetACTION_CHANGE_LIVE_WALLPAPER; {class} property ACTION_CROP_AND_SET_WALLPAPER: JString read _GetACTION_CROP_AND_SET_WALLPAPER; {class} property ACTION_LIVE_WALLPAPER_CHOOSER: JString read _GetACTION_LIVE_WALLPAPER_CHOOSER; {class} property COMMAND_DROP: JString read _GetCOMMAND_DROP; {class} property COMMAND_SECONDARY_TAP: JString read _GetCOMMAND_SECONDARY_TAP; {class} property COMMAND_TAP: JString read _GetCOMMAND_TAP; {class} property EXTRA_LIVE_WALLPAPER_COMPONENT: JString read _GetEXTRA_LIVE_WALLPAPER_COMPONENT; {class} property WALLPAPER_PREVIEW_META_DATA: JString read _GetWALLPAPER_PREVIEW_META_DATA; end; [JavaSignature('android/app/WallpaperManager')] JWallpaperManager = interface(JObject) ['{A1B98FC3-5736-43BC-A41C-5588DC0D8838}'] procedure clearWallpaperOffsets(windowToken: JIBinder); cdecl; procedure forgetLoadedWallpaper; cdecl; function getBuiltInDrawable: JDrawable; cdecl; overload; function getDesiredMinimumWidth: Integer; cdecl; function getDrawable: JDrawable; cdecl; function getFastDrawable: JDrawable; cdecl; function isWallpaperSupported: Boolean; cdecl; function peekDrawable: JDrawable; cdecl; function peekFastDrawable: JDrawable; cdecl; procedure setStream(data: JInputStream); cdecl; procedure setBitmap(bitmap: JBitmap); cdecl; procedure setWallpaperOffsetSteps(xStep: Single; yStep: Single); cdecl; end; TJWallpaperManager = class(TJavaGenericImport<JWallpaperManagerClass, JWallpaperManager>) end; implementation procedure RegisterTypes; begin TRegTypes.RegisterType('android.app.WallpaperManager.JWallpaperInfo', TypeInfo(android.app.WallpaperManager.JWallpaperInfo)); TRegTypes.RegisterType('android.app.WallpaperManager.JWallpaperManager', TypeInfo(android.app.WallpaperManager.JWallpaperManager)); end; initialization RegisterTypes; end.1 балл -
Если кто-то когда-то столкнется с подобной проблемой, обязательно добавляйте в манифест эту строчку, она спасет Вам дни или Недели тупого бездумного кодинга, в надежде понять почему TWebBrowser не в силах отобразить фрейм(iframe в котором как оказалось потом есть обращение к HTTP). А вы сидите на Андройде 8.1 или ниже а заказчик например на 9 и выше.1 балл
-
Firemonkey и обои рабочего стола
Ingalime отреагировал Andrey Efimov за вопрос
Ну смотрите: 1) Как я уже говорил, вам необходимо ознакомиться с основами транслирования и использования АПИ. Например тут: Как создавать обёртки для JAVA-кода и тут: Как подключить и использовать свой JAVA-класс (статьи "малость" старые, но суть сохранилась.) Единственное, что могу добавить (про обёртки): Всё, что находится в interface(JObjectClass) вызывается так: TJНазваниекласса.JavaClass.НазваниеМетода/Поля Всё, что находится в interface(JObject) вызывается только через предварительно созданный/полученный объект. 2) На форуме, для кода используйте тег "Код", без подсветки кода (или как вам угодно). Это помогает повысить читабельность поста, отделить код от текста. Если вы используете обёртку не из стандартной поставки, то прикладывайте её к посту. Не редкость, что ошибки бывают в самих обёртках. 3) Из-за первого пункта вы начали копировать другие решения (не обдумывая). Я буду исходить из вашего изначального кода. Вам должно быть достаточно подключения AndroidAPI.JNI.GraphicsContentViewText, там всё уже реализовано (это я про обёртку для использования JBitmap и JBitmapFactory). Далее моё "гадание на кофейной гуще" (т.к. обёртку для WallpaperManager в вашем сообщении я не вижу). Исхожу из того, что она сгенерирована правильно. Значит в вашем коде, перед использованием метода setBitmap(Image); необходимо получить доступ к объекту WallpaperManager. Заходим по ссылке Android API: WallpaperManager, смотрим на описание и методы, видим метод Android API: WallpaperManager#getInstance, делаем вывод, что с помощью этого метода сможем получить доступ к объекту WallpaperManager, а далее попытаться использовать метод setBitmap. На этом, моё предсказание завершено (само собой не факт, что оно верное, но если бы передо мной стояла такая задача, то в самом начале, я поступил бы именно так), остаётся только попробовать. p.s. Автоматический генератор обёрток иногда сбоит, рекомендую всегда проверять генерируемые обёртки. Результаты этих сбоев встречались как в личном опыте, так и у других разработчиков на форуме.1 балл -
У меня исчезает при запуске приложения. А вообще, если Вы пользовались примером Равиля для отправки пуша, то в нем функция, в ней параметр badge отвечает за цифру function pushSend($title, $text, $tokens, $server_key) { $url = 'https://fcm.googleapis.com/fcm/send'; $headers = array('Authorization: key=' . $server_key, 'Content-Type: application/json'); if (is_array($tokens)) $fields['registration_ids'] = $tokens; else $fields['registration_ids'] = array($tokens); $fields['priority'] = 'high'; $badge = 1; $fields['notification'] = array('body' => $text, 'title' => $title, 'sound' => 'default', 'badge' => $badge); $fields['data'] = array('message' => $text, 'title' => $title); $jsonfields = json_encode($fields); print_r($jsonfields); $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $url, CURLOPT_POST => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_RETURNTRANSFER => true, CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_POSTFIELDS => json_encode($fields) )); $result = curl_exec($ch); curl_close($ch); if ($result === false) return false; $json = json_decode($result, true); if ($json['success'] == 0) return false; else return true; }1 балл
-
Андроид 9 и Интернет
Ingalime отреагировал Евгений Корепов за вопрос
На будущее - при создании темы указывайте все исходные данные (как минимум вашу версию среды), что бы люди не давали вам советы, а потом уже узнали советы для какой версии среды они вам нужны. Я поставил Берлин и попробовал - ничего не получилось, результат такой же как у вас. Разбираться времени нет. Вот вам варианты: 1. Постарайтесь избавится от http и перейти на https. В наше время почти не возможно найти сайт http, даже самые отсталые госслужбы перешли на https на своих порталах. Если это ваш сервер, то я могу проконсультировать по способам перевода его на https. 2. Перейдите на Delphi 10.3.2. 3. Сделайте на каком нибудь другом сервере прокладку между запросами приложения по https и запросами к вашему серверу по http.1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00