-
Постов
190 -
Зарегистрирован
-
Посещение
-
Победитель дней
35
Весь контент sinuke
-
Получилось получить 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); Так все работает!
-
скопируйте исходник в папку с проектом и можете редактировать как угодно. наверное с С++ так можно
-
myTime := Now;
-
HitTest = True ?
-
Всем привет Как все знаете, с весны этого года 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 новым способом. В общем, давайте разбираться, как можно решить данный вопрос...
-
Я бы сделал это кодом. Отключил бы стандартное выделение ЛВ. А кодом бы уже смотрел в какую область был клик/тап. В зависимости от этого рисовал бы ректагл вокруг нужного изображения Но код получился бы конечно немного громоздкий.
-
Посмотрите вот этот пример - https://github.com/sinuke/Image-Zoom-Demo Там есть увеличение жестами. И мышью. И увеличение выбранной области
-
10.2 (Tokyo) или Berlin?
-
опечатался. верно. ListBox тормозит
-
Компонент ListView предназначен для вывода списков. При этом на Андройде он не тормозит, в отличие ListView. Но кроме списков его можно приспособить для вывода практически любой информации. Правда сложновато. MultiView - для бокового меню Label - текстовые метки SpeedButton - кнопки TrackBar - в настройках используется для изменения какого либо значения Tlayout - "прозрачный" компонент, удобный для группировки других компонентов и их выравнивания Ну а вам, как человеку, который не знает даже, что это за компоненты, наверное самым простым будет использование WebBrowser, в который будете загружать нужные страницы. Думаю это самый простой случай, хотя и не самый стабильный
-
можно сделать как здесь - https://play.google.com/store/apps/details?id=com.sinukeapps.locksmithery основной компонент, на котором все сделано - ListView (списки, меню, вывод информации и тесты, а также "о приложении") остальное - TMultiView для бокового дровера, лейблы, пару кнопок, трекбар. Для выравнивания - TLayout
-
у меня тоже бывают артефакты с закругленным ректанглом
-
с кириллицей в файле вообще нет никаких проблем под андройдом, если файл в юникоде... проверяйте кодировку
-
Не знаю на сколько вам это подойдет, но у меня запись и чтение в стрим (это может быть хоть файл, хоть мемористрим) происходит так: 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;
-
В последнем Токио Application.ProcessMessages использовать под Андройд нельзя = смерть приложению если нужно выполнять какую-либо операцию и сохранить отзывчивость интерфейса, то это самое время, чтобы перейти на использование потоков (thread'ов). Гуру, поправьте меня, если я не прав
- 6 ответов
-
- gameaudiomanager
- ios
-
(и ещё 2 )
C тегом:
-
А деплоймент одинаков для Release и Debug?
-
В чате проскакивал вопрос по пушам в 10.2.3. Ярослав говорил, что забыли "положить" в новом релизе какую-то либу с сервисами гугла. Может быть и карты на этой либе завязаны...
-
Я так понимаю, что у Вас есть "массив" из 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;
-
нет, больше ничего не нужно. после добавления ключа должно начать работать. а пример от студии работает? разрешения приложению даны на работу с GPS? больше идей у меня нет
-
Да, нужен ключ специально для карт. Как его получить - погуглите. Я уже не помню как его получал, но точно помню, что через гугл все нашел и довольно быстро разобрался. Ничего сложного
-
Дело не в устройстве. Даже стандартный пример работать не будет до тех пор, пока не пропишите ваш apiKey