Maka
Пользователи-
Постов
60 -
Зарегистрирован
-
Посещение
-
Победитель дней
4
Весь контент Maka
-
Коллеги, подскажите. Тема, правда, не совсем из области разработки. Есть несколько приложений, опубликованных в Google Play, приносящих ежемесячный доход от внутренних покупок и рекламы. Платежный аккаунт и аккаунт разработчика google зарегистрированы на физлицо. Возникла потребность работать как ИП (Хочется платить меньше 13% налог). На Российской стороне все понятно - открыть ИП, патент, упрощенка, валютный счет, тут вопросов нет. А вот на стороне Google - насколько удалось выяснить - изменить тип аккаунта с "личного" на "бизнес" нельзя. (Может просто не нашел?) Но можно создать новый аккаунт на организацию, а так же существует механизм переноса приложений между аккаунтами. А нужно ли менять тип аккаунта в Google? А если не менять, то не будет ли проблем с платежами с "личного" платежного аккаунта на счет ИП? Сталкивался ли кто-нибудь с подобным кейсом?
-
Коллеги, подскажите. Давно был создан проект Multi Device Application с поддержкой только Android и Windows. (Rad Studio была установлена без поддержки систем от Apple) Теперь потребовалось добавить в проект платформы iOS и MacOS. Но среди доступных платформ в Add Platform их нет, хотя при создании нового Multi Device Application они присутствуют. Можно ли как то их добавить в текущий проект, или придется создавать новый и переносить все туда?
-
Это помогло. Большое спасибо
-
Коллеги, подскажите где искать ошибку? Решил добавить в существующее приложение рекламу 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 Где копать? Куда смотреть?
-
Коллеги, подскажите, можно ли как то побороть сломанную в 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. Но после пары секунд вылетает. Как будто запускаются какие-то асинхронные потоки, которые и вызывают ошибку.
-
Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения
-
Самым простым решением оказалось исправление файла System.StartUpCopy. Там комментариями разработчики явно указали, где код отвечающий за перезапись
-
Добрый день. Подскажите, как сделать так, чтобы при обновлении приложения из PlayMarket, подключенные через Deploy Manager файлы перезаписывались?
-
добавление поддержки подписки в FMX: http://delphitoptips.blogspot.com/2018/03/supporting-in-app-purchase.html
-
По поводу ошибки с подпиской нашел вот такое решение в случае Java: Т.е. получается что, скорее всего, внутри у 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 закрывает приложение.
-
Всем привет. Подскажите, почему андроид приложение не может создать папку: ForceDirectories(System.IOUtils.TPath.GetSharedDocumentsPath + '/FRead_Backup/'); (разрешение Write external storage стоит)
-
Да, это помогло. Спасибо!
-
Быть может это натолкнет более опытных товарищей на какую-нибудь идею, решающую проблему: Удалось понять, что на скриншот не попадают элементы, для которых доступна работа со стилями, и прекрасно перерисовываются элементы без стилей (Effects, Shapes)
-
И кстати. В реализации MakeScreenshot уже присутствует PaintTo
-
По поводу корректности MakeScreenshot в данном сценарии - это предположение, или личный опыт? У меня получается так: Отображаю нужный контрол за пределами экрана, отлавливаю OnPaint контрола, и в нем делаю MakeScreenshot. В результате какие-то элементы попадают на скриншот (например TCharts, TRectangle, ), а какие-то нет (например кнопки, эдиты). Эффект тени от кнопки попадает, а сама кнопка нет.. И прочие чудеса.
-
Возможно так и придется поступить Нет, не пойдет, т.к. содержимое выводимых контролов постоянно меняется, и будет чехорда из "красивых" и "некрасивых" вариантов вывода Вот, видоизменил код Ярослава Бровина для сохранения скриншота: 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?
-
так и делаю, и вопрос в том и заключается, как ее правильно заранее подготовить