Перейти к содержанию
  • Регистрация

krapotkin

Пользователи
  • Публикаций

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

  • Посещение

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

    107

krapotkin стал победителем дня 10 января

krapotkin имел наиболее популярный контент!

6 Подписчиков

Информация о krapotkin

  • Звание
    Продвинутый пользователь
  • День рождения 17.10.1970

Контакты

  • ICQ
    125417612

Информация

  • Пол
    Мужчина
  • Город
    Екатеринбург

Посетители профиля

2 957 просмотров профиля
  1. Взять в опциях ide search path ту папку, которая подходит, и юзать
  2. В процессе разработки столкнулся с очень странной ситуацией, корни которой до сих пор неясны, но решение нашлось. Итак. Делфи 10.3.3. Чистое приложение - пустая форма и кнопка. Отлично работает на разных устройствах кроме Samsung Galaxy Tab A (2016). Android 5.1.1 Программа падает, не успев даже загрузиться. Любая. При этом она же, скомпилированная на другом компе, запускается нормально. И даже после изменения SDK/NDK на нем, ничего не падает. LogCat дает крайне странную картину java.lang.IllegalArgumentException: Unable to load native library: /data/app-lib/com.embarcadero.Project1-1/libProject1.so Начинаем экспериментировать с SDK, NDK и т.д. Поставил также хотфиксы для 10.3.3. Сразу скажу, SDK/NDK ставились отдельно через Android studio, не скачивались вместе с Delphi. Не торопитесь бросать чтение на этом месте!)) На другом компе, где все работает, все ставилось точно так же. Короче, очень много комбинаций версий SDK/NDK проверено. Результат такой. При постепенном понижении версии NDK все взлетело при NDK v22. При этом версия SDK видимо такого большого влияния не имеет, потому что этот вариант нормально работает Повторюсь. На других устройствах все работало и на более новых Ndk. Xiaomi Mi Pad4 , Samsung Galaxy Tab A (2019), Xiaomi Redmi 5 и 5Plus Спасибо за участие и помощь в разборе завалов @Andrey Efimov
  3. что-то не сходится в показаниях я тоже абсолютно корректно посылаю принимаю данные на win и android и все в правильной кодировке безо всяких ухищрений примерно аналогичным кодом что-то важное вы скрываете... vResp := Http.Post(vURL, PostData, FResStream, FHeaders); как версию рассматриваю еще кодирование TNetEncoding.URL.Encode( хотя я например посылаю JSON в POST без кодирования и сервер все принимает нормально
  4. а все-таки, заголовки какие передаются? мало ли что мы предполагаем. я помню, раскапывал код Post, так они там вообще не всегда прикладывались. Выбрал вариант, где они есть в явном виде и с тех пор использую его...
  5. полезные ссылки https://android-tools.ru/coding/delimsya-fajlami-v-android-s-pomoshhyu-fileprovider/ https://www.delphiworlds.com/2018/06/targeting-android-8-and-higher-continued/
  6. От программиста никаких действий не требуется. Система любезно сообщает, что откуда попало не ставит, но вот вам переход прямо на нужную настройку. Переходим, включаем, нажимаем back и продолжаем установку...
  7. У меня в работе два приложения, и оба они не предназначены для Play market, так как имеют ограниченный круг использования, по сути, чисто внутрикорпоративные. Так что нежелательно и выкладывание их и на альтернативные магазины приложений. Автоматически возникает вопрос обновления. Если в первый раз мы можем установить приложение сами при помощи админов, то обновлять их не так просто. А контингент пользователей не справится с "скачайте APK по ссылке, найдите, куда его скачал браузер, и запустите вручную именно последний скачанный, а не какой попало"... Простейший способ - дать приложению скачать свежую копию с сайта и натравить на полученный файл системный инсталлер. Вот только свежие Andoird делать это напрямик запрещают. Нужен filepropvider. Целый день шуровал по мануалам и YT, Вот то что получилось в результате. Если у вас 10.3.3 как у меня, уже можно не вносить <provider>...</provider> в манифест и свой файл file_paths.xml (или как вам его советуют назвать в интернетах) в деплой. Теперь все это делается хоть несколько странно и однобоко, но автоматически, путем установки галочки Secure File Sharing после этого в манифесте автоматически пропишется один из вариантов размещения файлов, которые вы можете найти в интернете. Используется алиас external-path файл, показанный на рисунке, создается автоматически самой делфи. теперь остается отгадать, какой путь реально подставится вместо "." Как показала практика, все пути выглядят не так, как кажется, если исходить из простого здравого смысла. Целый день использования GetHomeDir и других полезных методов TPath завел меня совсем в тупик. Оказалось все проще (?) st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; ... OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); обратите внимание, в provider_paths мы задаем external-paths, а в коде ищем ExternalCacheDir.!!! (For.Unbelievably.Creative.Knowers!) Потом все просто. FApkUri передаем в интент и запускаем итоговый код примерно таков. (скачивание в потоке с использованием небольшого собственного API, но там ничего важного, можно не обращать внимания) procedure TasdSettingsFrame.bDownloadClick(Sender: TObject); begin {$IFDEF ANDROID} bDownload.Enabled := False; DownloadAndRun(); {$ENDIF} end; {$IFDEF ANDROID} procedure TasdSettingsFrame.DownloadAndRun(); begin ttask.Run(procedure var aapi:TasdAPI; st:TMemoryStream; OutputDir: JFile; ApkFile: JFile; ApkUri: Jnet_Uri; path, filename: string; begin st := TMemoryStream.Create; aapi := TasdAPI.Clone(_API); try aapi.OnReceiveData := OnReceiveData; aapi.getApk(st); if aapi.Err.Code=0 then begin OutputDir := TAndroidHelper.Context.getExternalCacheDir(); path := JStringToString(OutputDir.getAbsolutePath); filename := path+'/ASDroid2.apk'; ApkFile := TJfile.JavaClass.init( StringToJstring(filename)); FApkUri := TAndroidHelper.JFileToJURI(ApkFile); st.Position := 0; st.SaveToFile(filename); TThread.Synchronize(nil,procedure begin bDownload.Enabled := true; StartActivity(FApkUri); end); end; finally st.Free; aapi.Free; end; end); end; procedure StartActivity(ApkUri: Jnet_Uri); var Intent: JIntent; begin Intent := TJIntent.Create(); Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); Intent.addFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NEW_TASK or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP or TJIntent.JavaClass.FLAG_GRANT_WRITE_URI_PERMISSION or TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION); Intent.setDataAndType(apkuri, StringToJString('application/vnd.android.package-archive')); TAndroidHelper.Activity.startActivity(Intent); end; procedure TasdSettingsFrame.OnReceiveData(const Sender: TObject; AContentLength: Int64; AReadCount: Int64; var Abort: Boolean); begin tthread.Synchronize(nil, procedure begin pb1.Max := AContentLength; pb1.Value := AReadCount; end); end; {$ENDIF} Вопросы остались конечно, почему так странно с каталогами, но выяснять пока нет желания. Работает - не трожь. Всем удачи. UPD. Для того, чтобы системный инсталлер запускался, нужно не забыть отметить еще одну галочку
  8. Отличие я рассказал. Деструктор должен вызываться сам. Архитектура на это рассчитана. Если не вызывается, значит что программа несовместима с ней. Это никак не говорит о том, что она не будет работать. Но говорит о том что внутри - мины
  9. все-таки вернусь к логической загадке ARC 1. если вы все ссылки на объект обнулили, то вызывать его деструктор не требуется, его вызовут за вас 2. если не все обнулили, но вызвали деструктор, значит имеем нехилую вероятность того, что кто-то, у кого осталась ссылка, обратится по ней к объекту. тогда мы имеем гарантированный AV 3. Тогда зачем все эти варианты с DisposeOF ??? У меня вся программа на фреймах построена, и ничего, создаются удаляются. При этом отлаживаюсь я в Win64, а потом запускаю на Andoird. И все работает штатно в обоих случаях. Единственное отличие, я обычно не указываю владельца (Owner). Т.е. F:=TMyFrame.Create(NIL) После использования сам убираю за собой F.Parent:=NIL; FreeAndNil(F) и все норм. В некоторых фреймах еще большинство компонентов в динамике создается и пересоздается. и тоже никаких явных вызовов деструктора. Так что лучше все-таки следовать архитектуре, а не раскладывать костылики...
  10. эта проблема с диалогами решалась уже 100500 раз MyDialogs от ZuBy где то тут на сайте болтается вот мой текущий вариант этой же задумки тут https://bitbucket.org/vkrapotkin/vkdialogs/src/master/ видел в наборах компонентов тоже диалоги примерно так же реализованные
  11. описать класс - узел дерева вообще не вижу проблем
  12. я ж вроде расписал что как в другом форуме ? что не так?
  13. А также Cannot find style resource fir Windows. Воспроизведение 1. создать новое FMX приложение 2. кинуть TSyleBook 3. зайти по двойному щелчку4. попытаться добавить платформурезультат (1) 5. добавить Windows, Android. Удалить Default. закрыть StyleBook editor6. Положить кнопку, ПКМ, Edit Custom Style7. Результат если же просто сначала кинуть кнопку, сделать ПКМ, Edit custom Style, то картина совсем другая поэтому и не находит ни Windows ни Android Соответственно Workaround - найти в FMX Platform = 'Android' и заменить на Platform = 'AndroidL Light' Platform = 'Windows' тоже возможно надо будет заменить, но с ней проблем вроде нет пока. Все это делал на Windows 7 x64 Pro SP1
  14. самое простое в OnResize проверять значения ширины-высоты
×
×
  • Создать...