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

sinuke

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

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

  • Посещение

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

    35

Весь контент sinuke

  1. Получилось получить DeviceToken? А то у меня такая же проблема... Upd: В чате выяснилось, что код создания подключения и получения токена нужно выполнять в отдельном потоке. Например так: TTask.Run( procedure () begin FPushService := nil; FPushServiceConnection := nil; {$IF defined(ANDROID)} FPushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM); FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := ANDROID_SEND_ID; {$ENDIF} if Assigned(FPushService) then begin FPushServiceConnection := TPushServiceConnection.Create(FPushService); FPushServiceConnection.OnChange := OnServiceConnectionChange; FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent; FPushServiceConnection.Active := True; FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID]; FDeviceToken := FPushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken]; TThread.Synchronize(TThread.CurrentThread, procedure () begin Log('DeviceID: ' + FDeviceID); Log('DeviceToken: ' + FDeviceToken); end); end; end); Так все работает!
  2. скопируйте исходник в папку с проектом и можете редактировать как угодно. наверное с С++ так можно
  3. Ну может сделать ленту с акциями и скидками... А также, при просмотре детализации по акции сделать что-то типа "Принять участие / Записаться и т.д."
  4. Edit положить на Layout. Настройки у Layout такие, чтобы он занимал весь экран поверх всех компонентов. В Layout.OnTap скрывать Layout
  5. Всем привет Как все знаете, с весны этого года Google требует для всех новых приложений поддержку новейших API (а осенью затребует и от уже опубликованных). В FMX-приложениях это делается изменением targetAPI в манифесте. Что я собственно и сделал. Но столкнулся с неприятной особенностью. А именно: невозможно отправить картинку с помощью ShareSheetAction. При попытке отправить вылетает вот такая ошибка: В интернете наткнулся на статью (ссылка), в которой говорится, что начиная с API 24 механизм отправки картинок через Intent поменялся. Там же приводится решение того, как это сделать по новым требованиям. И конечно же это решение на Java, в Delphi решения данного вопроса нет. Решил попробовать реализовать, но столкнулся с непреодолимыми для себя проблемами.... Там получается три действия: 1) Создать и задеплоить файл res/xml/provider_paths.xml со следующим содержимым: <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> С этим проблем не возникло. Создал, задеплоил 2) Добавить в манифест провайдер: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> Вот тут возникли проблемы. После добавления данных строк в манифест проект перестал деплоиться - ругается на недоступный символ "$" 3) Поменять код получения Uri картинки... Uri photoURI = Uri.fromFile(createImageFile()); ...меняется на: Uri photoURI = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", createImageFile()); Однако, в FMX.MediaLibrary.Android.pas код для получения Uri выглядит следующим образом: procedure TSharingManagerAndroid.AddImage(var AIntent: JIntent; const AImage: TBitmap); var ImageFile: JFile; ImageUri: Jnet_Uri; ArrayList: JArrayList; OutputDir: JFile; begin Assert(AIntent <> nil); Assert(AImage <> nil); OutputDir := TAndroidHelper.Context.getExternalCacheDir(); ImageFile := TJFile.JavaClass.createTempFile(StringToJString('attachment'), StringToJString('.png'), OutputDir); ImageUri := TJnet_Uri.JavaClass.fromFile(ImageFile); AImage.SaveToFile(JStringToString(ImageFile.getAbsolutePath)); if FDataType = TSharingDataType.Image then AIntent.putExtra(TJIntent.JavaClass.EXTRA_STREAM, TJParcelable.Wrap((ImageUri as ILocalObject).GetObjectID)) else begin // If we use ACTION_SEND_MULTIPLE action of Intent, we should put image throught Parcelable Array List. // Because in this case other application read EXTRA_STREAM like a ArrayList<Uri> ArrayList := TJArrayList.Create; ArrayList.add(ImageUri); AIntent.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM, ArrayList); end; end; И тут также возникает сложность для меня, т.к. я не представляю как можно получить ImageUri новым способом. В общем, давайте разбираться, как можно решить данный вопрос...
  6. Я бы сделал это кодом. Отключил бы стандартное выделение ЛВ. А кодом бы уже смотрел в какую область был клик/тап. В зависимости от этого рисовал бы ректагл вокруг нужного изображения Но код получился бы конечно немного громоздкий.
  7. Посмотрите вот этот пример - https://github.com/sinuke/Image-Zoom-Demo Там есть увеличение жестами. И мышью. И увеличение выбранной области
  8. опечатался. верно. ListBox тормозит
  9. Компонент ListView предназначен для вывода списков. При этом на Андройде он не тормозит, в отличие ListView. Но кроме списков его можно приспособить для вывода практически любой информации. Правда сложновато. MultiView - для бокового меню Label - текстовые метки SpeedButton - кнопки TrackBar - в настройках используется для изменения какого либо значения Tlayout - "прозрачный" компонент, удобный для группировки других компонентов и их выравнивания Ну а вам, как человеку, который не знает даже, что это за компоненты, наверное самым простым будет использование WebBrowser, в который будете загружать нужные страницы. Думаю это самый простой случай, хотя и не самый стабильный
  10. можно сделать как здесь - https://play.google.com/store/apps/details?id=com.sinukeapps.locksmithery основной компонент, на котором все сделано - ListView (списки, меню, вывод информации и тесты, а также "о приложении") остальное - TMultiView для бокового дровера, лейблы, пару кнопок, трекбар. Для выравнивания - TLayout
  11. В Токио для того, чтобы показалось окно с прогрессом FGX нужно ресурсоемкую (длительную) операцию выполнять в отдельном потоке. самое простое примерно можно описать так: TTask.Run( procedure () begin //Выполнение операции TThread.Synchronize(nil, procedure () begin ActionDialog.Hide; end) end);
  12. sinuke

    Баг в Tokio

    у меня тоже бывают артефакты с закругленным ректанглом
  13. с кириллицей в файле вообще нет никаких проблем под андройдом, если файл в юникоде... проверяйте кодировку
  14. Не знаю на сколько вам это подойдет, но у меня запись и чтение в стрим (это может быть хоть файл, хоть мемористрим) происходит так: procedure SaveToStream(const AStream: TStream); var buff: TBytes; myString: string; begin ... myString := 'some string'; buff := TEncoding.UTF8.GetBytes(myString); l := Length(buff); AStream.Write(l, SizeOf(l)); AStream.WriteBuffer(buff, l); ... end; Чтение: procedure LoadFromStream(const AStream: TStream); var l: Integer; buff: TBytes; myString: string; begin ... AStream.Read(l, SizeOf(l)); SetLength(buff, l); AStream.ReadBuffer(buff, l); myString := TEncoding.UTF8.GetString(buff); ... end;
  15. В последнем Токио Application.ProcessMessages использовать под Андройд нельзя = смерть приложению если нужно выполнять какую-либо операцию и сохранить отзывчивость интерфейса, то это самое время, чтобы перейти на использование потоков (thread'ов). Гуру, поправьте меня, если я не прав
  16. А деплоймент одинаков для Release и Debug?
  17. В чате проскакивал вопрос по пушам в 10.2.3. Ярослав говорил, что забыли "положить" в новом релизе какую-то либу с сервисами гугла. Может быть и карты на этой либе завязаны...
  18. Я так понимаю, что у Вас есть "массив" из 20 элементов, который нужно сформировать (перемешать) в произвольном порядке. Так? Я для похожих целей пользуюсь следующим: var a: array [0 .. 19] of Integer; i, j, k: Integer; begin //Заполняем начальными данными for i := Low(a) to High(a) do a[i] := i; //Перемешиваем for i := High(a) downto 1 do begin j := Random(i - 1); if i <> j then begin //Меняем местами элементы k := a[j]; a[j] := a[i]; a[i] := k; end; end; end;
  19. нет, больше ничего не нужно. после добавления ключа должно начать работать. а пример от студии работает? разрешения приложению даны на работу с GPS? больше идей у меня нет
  20. Да, нужен ключ специально для карт. Как его получить - погуглите. Я уже не помню как его получал, но точно помню, что через гугл все нашел и довольно быстро разобрался. Ничего сложного
  21. Дело не в устройстве. Даже стандартный пример работать не будет до тех пор, пока не пропишите ваш apiKey
×
×
  • Создать...