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

Maka

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

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

  • Посещение

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

    4

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

  1. Коллеги, подскажите. Тема, правда, не совсем из области разработки. Есть несколько приложений, опубликованных в Google Play, приносящих ежемесячный доход от внутренних покупок и рекламы. Платежный аккаунт и аккаунт разработчика google зарегистрированы на физлицо. Возникла потребность работать как ИП (Хочется платить меньше 13% налог). На Российской стороне все понятно - открыть ИП, патент, упрощенка, валютный счет, тут вопросов нет. А вот на стороне Google - насколько удалось выяснить - изменить тип аккаунта с "личного" на "бизнес" нельзя. (Может просто не нашел?) Но можно создать новый аккаунт на организацию, а так же существует механизм переноса приложений между аккаунтами. А нужно ли менять тип аккаунта в Google? А если не менять, то не будет ли проблем с платежами с "личного" платежного аккаунта на счет ИП? Сталкивался ли кто-нибудь с подобным кейсом?
  2. 2020год RadStudio 10.3.3 Проблема так и осталась. Не появилось ли решения?
  3. Коллеги, подскажите. Давно был создан проект Multi Device Application с поддержкой только Android и Windows. (Rad Studio была установлена без поддержки систем от Apple) Теперь потребовалось добавить в проект платформы iOS и MacOS. Но среди доступных платформ в Add Platform их нет, хотя при создании нового Multi Device Application они присутствуют. Можно ли как то их добавить в текущий проект, или придется создавать новый и переносить все туда?
  4. А вот на сайте самого гугла, написано, что можно отключить: https://developers.google.com/admob/android/global-settings Разве это не об этом?
  5. Это помогло. Большое спасибо
  6. Коллеги, подскажите где искать ошибку? Решил добавить в существующее приложение рекламу AdMob. Выполнив все строго по инструкции, получаю на сроке кода: bnrd1.LoadAd; ошибку "Java class JAdSize could not be found" При этом, если создать новое приложение, и полностью перенести туда код показа баннера, то все работает нормально. ошибка возникает потому, что в модуле Androidapi.JNIBridge, в процедуре: class function TJNIResolver.GetJavaClassID(const AClass: string): JNIClass; var LTemp: UTF8String; LJNIEnvRes: PJNIEnv; begin LJNIEnvRes := TJNIResolver.GetJNIEnv; LTemp := UTF8String(AClass); Result := LJNIEnvRes^.FindClass(LJNIEnvRes, MarshaledAString(LTemp)); if Result = nil then begin ExceptionCheck; if ClassLoader = nil then ClassLoader := TClassLoader.Create; Result := ClassLoader.LoadClass(AClass); if Result = nil then ExceptionCheck; end; end; когда в нее передается AClass = ''com/google/android/gms/ads/AdSize'', строка Result := LJNIEnvRes^.FindClass(LJNIEnvRes, MarshaledAString(LTemp)); возвращает nil. В пустом приложении, где все работает тут возвращается значение <> nil Где копать? Куда смотреть?
  7. Коллеги, подскажите, можно ли как то побороть сломанную в Android64 работу с InAppPurchase? Иллюстрация: var Form1: TForm1; InAppPurchase: TCustomInAppPurchase; implementation {$R *.fmx} procedure TForm1.btn1Click(Sender: TObject); begin InAppPurchase := TInAppPurchase.Create(nil); InAppPurchase.OnSetupComplete := SetupComplete; InAppPurchase.OnError := Error; InAppPurchase.OnProductsRequestResponse := ProductsRequestResponse; InAppPurchase.SetupInAppPurchase; end; procedure TForm1.SetupComplete(Sender: TObject); begin mmo1.Lines.Add('SetupComplete'); InAppPurchase.QueryProducts; // !!!!! В этом месте, при компиляции в Аndroid64, приложение вылетает end; procedure TForm1.ProductsRequestResponse(Sender: TObject; const Products: TIAPProductList; const InvalidProductIDs: TStrings); begin mmo1.Lines.Add('onProductsRequestResponse'); end; procedure TForm1.Error(Sender: TObject; ErrorKind: TFailureKind; const ErrorMessage: string); begin mmo1.Lines.Add('OnPurchaseError. ErrKnd=' + IntToStr(Byte(ErrorKind)) + ' Msg=' + ErrorMessage); end; Причем приложение вылетает не сразу после вызова QueryProducts, даже успевает приходить ProductsRequestResponse. Но после пары секунд вылетает. Как будто запускаются какие-то асинхронные потоки, которые и вызывают ошибку.
  8. При компиляции в android64, метод InAppPurchase.QueryProducts крашит приложение. Кто попробовал, есть похожие проблемы, или искать у себя?
  9. Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения
  10. Самым простым решением оказалось исправление файла System.StartUpCopy. Там комментариями разработчики явно указали, где код отвечающий за перезапись
  11. Добрый день. Подскажите, как сделать так, чтобы при обновлении приложения из PlayMarket, подключенные через Deploy Manager файлы перезаписывались?
  12. добавление поддержки подписки в FMX: http://delphitoptips.blogspot.com/2018/03/supporting-in-app-purchase.html
  13. Оказыватся печаль (
  14. По поводу ошибки с подпиской нашел вот такое решение в случае Java: Т.е. получается что, скорее всего, внутри у TInAppPurchase, для подписки, используется не верный метод? И как быть? Я же туда залезть не могу. Или я все не верно понимаю?
  15. Maka

    Работа с TInAppPurchase

    При работе с TInAppPurchase в Андроид обнаружился ряд проблем. Подскажите, есть ли способы борьбы с ними? Делаю так: var InAppPurchase: TInAppPurchase; InAppPurchase := TInAppPurchase.Create(nil); InAppPurchase.ApplicationLicenseKey := 'MIIBIjANBgkqhk.....'; InAppPurchase.SetupInAppPurchase; InAppPurchase.ProductIDs.Add('prod_subscribe'); // подписка InAppPurchase.ProductIDs.Add('prod_once'); // ограниченный контент InAppPurchase.QueryProducts; 1. Проблема с ограниченным контентом: покупаем ограниченный контент: InAppPurchase.PurchaseProduct('prod_once'); штатно приходит OnPurchaseCompleted. После этого вызываем InAppPurchase.ConsumeProduct('prod_once') Приложение молча падает, хотя продукт успешно "консумится" на сервере и его опять можно покупать. 2. Проблема с подпиской: Покупаем ее: InAppPurchase.PurchaseProduct('prod_subscribe'); на серверах гугла подписка оформляется, деньги списываются, однако приходит OnError с сообщением: "labResult: IAB returned null purchaseData or dataSignature (responce: Unknown error)" теперь до перезагрузки приложения, все запросы: InAppPurchase.IsProductPurchased('prod_subscribe') возвращают False, а вызов InAppPurchase.QueryProducts закрывает приложение.
  16. Всем привет. Подскажите, почему андроид приложение не может создать папку: ForceDirectories(System.IOUtils.TPath.GetSharedDocumentsPath + '/FRead_Backup/'); (разрешение Write external storage стоит)
  17. Быть может это натолкнет более опытных товарищей на какую-нибудь идею, решающую проблему: Удалось понять, что на скриншот не попадают элементы, для которых доступна работа со стилями, и прекрасно перерисовываются элементы без стилей (Effects, Shapes)
  18. И кстати. В реализации MakeScreenshot уже присутствует PaintTo
  19. По поводу корректности MakeScreenshot в данном сценарии - это предположение, или личный опыт? У меня получается так: Отображаю нужный контрол за пределами экрана, отлавливаю OnPaint контрола, и в нем делаю MakeScreenshot. В результате какие-то элементы попадают на скриншот (например TCharts, TRectangle, ), а какие-то нет (например кнопки, эдиты). Эффект тени от кнопки попадает, а сама кнопка нет.. И прочие чудеса.
  20. Возможно так и придется поступить Нет, не пойдет, т.к. содержимое выводимых контролов постоянно меняется, и будет чехорда из "красивых" и "некрасивых" вариантов вывода Вот, видоизменил код Ярослава Бровина для сохранения скриншота: procedure ActionMakeScreenshotExecute(aCtr: TControl); var BitmapBuffer: TBitmap; SourceRect: TRectF; begin aCtr.Visible := True; aCtr.BringToFront; aCtr.Opacity := 1; // Фиксируем размер снимаемой области SourceRect := TRectF.Create(0, 0, aCtr.Width, aCtr.Height); // Создаем временный буфер для получения скриншота BitmapBuffer := TBitmap.Create(Round(SourceRect.Width), Round(SourceRect.Height)); try // Переводим канву в режим отрисовки - начинаем процесс отрисовки сцены if BitmapBuffer.Canvas.BeginScene then try // Говорим контролу отрисовать себя в канве нашего буфера в указанной области aCtr.PaintTo(BitmapBuffer.Canvas, SourceRect); finally // Завершаем процесс отрисовки, заканчивая формируемую сцену BitmapBuffer.Canvas.EndScene; end; BitmapBuffer.SaveToFile(DateDir + 'screenshot1.png'); finally FreeAndNil(BitmapBuffer); end; end; И если мы сюда отправим еще не отрисованный контрол, то получим пустой скриншот, а последующие вызовы будут сохранять не текущее, а последнее нарисованное состояние контрола. Или есть другой способ воспользоваться PaintTo?
  21. так и делаю, и вопрос в том и заключается, как ее правильно заранее подготовить
×
×
  • Создать...