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

Maka

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

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

  • Посещение

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

    4

Сообщения, опубликованные Maka

  1. Коллеги, подскажите.

    Тема, правда, не совсем из области разработки.

    Есть несколько приложений, опубликованных в Google Play, приносящих ежемесячный доход от внутренних покупок и рекламы. Платежный аккаунт и аккаунт разработчика google зарегистрированы на физлицо. Возникла потребность работать как ИП (Хочется платить меньше 13% налог). На Российской стороне все понятно - открыть ИП, патент, упрощенка, валютный счет, тут вопросов нет. А вот на стороне Google - насколько удалось выяснить - изменить тип аккаунта с "личного" на "бизнес" нельзя. (Может просто не нашел?) Но можно создать новый аккаунт на организацию, а так же существует механизм переноса приложений между аккаунтами.

    А нужно ли менять тип аккаунта в Google? А если не менять, то не будет ли проблем с платежами с "личного" платежного аккаунта на счет ИП?

    Сталкивался ли кто-нибудь с подобным кейсом?

  2. Коллеги, подскажите.

    Давно был создан проект Multi Device Application с поддержкой только Android и Windows. (Rad Studio была установлена без поддержки систем от Apple)

    Теперь потребовалось добавить в проект платформы iOS и MacOS. Но среди доступных платформ в Add Platform их нет, хотя при создании нового Multi Device Application они присутствуют.

    Можно ли как то их добавить в текущий проект, или придется создавать новый и переносить все туда?

  3. 1 минуту назад, Евгений Корепов сказал:

    Подозреваю что такая попытка приведет к блокировке учетной записи. Нельзя вмешиваться в показ рекламы или изменять рекламный контент.

    А вот на сайте самого гугла, написано, что можно отключить:

    https://developers.google.com/admob/android/global-settings

    Разве это не об этом?

  4. Коллеги, подскажите где искать ошибку?

    Решил добавить в существующее приложение рекламу 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

    Где копать? Куда смотреть?

  5. 9 часов назад, qz5 сказал:

    попробуйте создать полностью новое приложение и в настройках 64-битного профиля выставите все разрешения как и у 32-битного профиля

    К сожалению это не помогает

  6. Коллеги, подскажите, можно ли как то побороть сломанную в 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. Но после пары секунд вылетает. Как будто запускаются какие-то асинхронные потоки, которые и вызывают ошибку.

  7. В 18.09.2019 в 10:07, gonzales сказал:

    Подал заявку, прошло 3 дня, никакого ответа. У кого-нибудь положительно решилась ситуация?

    Отвечают долго, 10-14 дней, а потом еще около 7 дней переписка, проверки и ожидание решения. Наберитесь терпения

  8. По поводу ошибки с подпиской нашел вот такое решение в случае Java:

    Цитата

    I had this problem myself. After a while I found what I did wrong. I was calling the wrong method on the IABHelper.

    If you call mHelper.launchPurchaseFlow(...) with an SKU that is registered as a subscription on Google Developer Console it will result in the error: IAB returned null purchaseData or dataSignature (response -1008:Unknown error).

    If you have a SKU that is registered as an subscription you have to use the method: mHelper.launchSubscriptionPurchaseFlow(...) instead.

    Hope this helps.

    Т.е. получается что, скорее всего, внутри у TInAppPurchase, для подписки, используется не верный метод? И как быть? Я же туда залезть не могу.

    Или я все не верно понимаю?

     

  9. При работе с 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 закрывает приложение.

     

  10. Быть может это натолкнет более опытных товарищей на какую-нибудь идею, решающую проблему:

    Удалось понять, что на скриншот не попадают элементы, для которых доступна работа со стилями, и прекрасно перерисовываются элементы без стилей (Effects, Shapes)

     

  11. 2 часа назад, Tumaso сказал:

    Как вариант (кривой если честно, тем не менее) - отображайте TControl вне границ экрана, тогда и MakeScreenshot корректно отработает, и мерцать на экране не будет.

    По поводу корректности MakeScreenshot в данном сценарии  - это предположение, или личный опыт?

    У меня получается так:

    Отображаю нужный контрол за пределами экрана, отлавливаю OnPaint контрола, и в нем делаю MakeScreenshot.

    В результате какие-то элементы попадают на скриншот (например TCharts, TRectangle, ), а какие-то нет (например кнопки, эдиты).  Эффект тени от кнопки попадает, а сама кнопка нет..  И прочие чудеса.

     

  12. 59 минут назад, Tumaso сказал:

    Как вариант (кривой если честно, тем не менее) - отображайте TControl вне границ экрана, тогда и MakeScreenshot корректно отработает, и мерцать на экране не будет.

    Возможно так и придется поступить

    39 минут назад, #WAMACO сказал:

    ну так первый раз вывести "честно", снять скриншот, записать в ресурсы, распространять вместе с программой и данный скрин и проявлять медленно...

    Нет, не пойдет, т.к. содержимое выводимых контролов постоянно меняется, и будет чехорда из "красивых" и "некрасивых" вариантов вывода

     

    40 минут назад, dnekrasov сказал:

    А чем PaintTo не устраивает?

    Вот, видоизменил код Ярослава Бровина для сохранения скриншота:

    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?

  13. 2 минуты назад, #WAMACO сказал:

    и еще костыль.... подготовьте заранее картинку экрана...ее и проявляйте медленно...

    так и делаю, и вопрос в том и заключается, как ее правильно заранее подготовить

×
×
  • Создать...