ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Delphi 10.3.1 trabalhando com anuncios

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Mobile com Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rodrigoprado
Colaborador
Colaborador


Registrado: Terça-Feira, 24 de Mai de 2005
Mensagens: 1074
Localização: Curitiba/PR

MensagemEnviada: Seg Mar 18, 2019 8:40 am    Assunto: Delphi 10.3.1 trabalhando com anuncios Responder com Citação

Bom dia pessoal

Eu tenho um jogo feito em delphi, e o que me falta para por ele em prática seria utilizar o anuncio premiado, recompensar meu usuário por ver o vídeo de 30 segundos.

https://developers.google.com/admob/android/rewarded-video

*** Hoje eu consigo utilizar o
"Banner Ads"e o "Interstitial Ads", isso tem suporte no delphi 10.3.1

Todavia no delphi não encontrei apoio em foruns ainda nem nada sobre RewardedVideoAdListener, até então acredito que não tenha suporte ainda...

Gostaria de saber dos colegas, sobre este assunto...

Hoje para usar o rewareded eu faço uma gambiarra com o classe JInterstitialAd usando um timer... ele abre o vídeo, mas não eh o correto, preciso da classe e dos eventos mapeados.

Agradeço a todos, qualquer ajuda é bem vinda.[/code]
_________________
- Compartilhe seus conhecimentos -
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Sex Mar 22, 2019 1:24 am    Assunto: Responder com Citação

Quanto a anuncio premiado no delphi por parte da embarcadeiro acredito que eles não desenvolveram nada mesmo, assim sendo vai contar de seus conhecimento em java mesmo para a utilização do mesmo.

Não importa qual versão do delphi use, acredito que seja possível mostrar anuncio premiado desde a versão do xe5.

A implementação é que é algo bem tosco, isso por conta da própria google.

vamos então o que implica implementar isso em seu projeto:

1- a google ja não disponibiliza do sdk em jar, o que dificulta muito a vida do programadores pascal em delphi
2- vais precisar atualizar sua sdk, nossa isso ai te toma um bom tempo se não tiver famializado com todo o processo, isso pq a sdk vai exigir a targe version 28 aff :(
3- o tal android.compactv7 até o berlin só temos isso no android.compctv4
4- importações de alguns png e xml provindo da ultilização do android.compctv7 (e não são poucos)

vencendo as barreiras e conseguindo exito em todo o processo
consegui mostrar anúncio premiado no delphi berlin seguindo estes passos:
1- compilando o exemplo demo deles no eclipse com a importação do gradle
2- com o exemplo compilado em apk indica que a sdk tb foi introduzida no apk (testar se nescessario no dispositivo e certificar que o anúncio é exibido)
3- sacar do apk a sdk pois iremos ultilizada-la (o uso do winrar, jd-gui, dx será nescessario para isso)
4- usar o java2op para gerar nosso arquivo pas
5- alguns ajuste no arquivo pas é nescessario (normal isso ocorrer com o java2op)
6- desativar no delphi toda as libraries relacionado a googleplay
7- desativar todos os itens entitlement list inclusive o admob (isso pq a ide delphi vai escrever a versão do serviço diferente da que nescessitamos)
8- editar o manifest colocando as seguintes linhas:
Código:
 
<meta-data android:name="com.google.android.gms.ads.APPLICATION_ID" android:value="id da sua aplicação no admob" />
<meta-data android:name="com.google.android.gms.version" android:value="12451000" /> <!-- versão correta para o sdk -->
 <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />

9- importar para o deployment os xml e png nescessario para o android.compactv7 ou pelo menos o nescessario para tua aplicação rodar sem se queixar que falta algum resource
10- importar a sdk para seu projeto
11- compilar se ser feliz


os passos acima é resumido mais bem funciona, e desta forma consigo colocar anucio premiado em minhas aplicações.
até criei um component para este proposito hehehe.

segue o codigo fonte do componente:
Código:
unit Strak.ads.RewardedVideo;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics,
  FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo, UFrmDisplay, FMX.Objects
{$IFDEF android},
  FMX.Layouts, Androidapi.JNIBridge,
  Androidapi.JNI.JavaTypes,
  com.google.Android.gms.ads
{$ENDIF};

type

  TRewardedVideo = class;

  TEvent1 = procedure of object;
  TEvent2 = procedure(P1: Integer) of object;
  TEvent3 = procedure{$IFDEF android}(Amount: Integer; TypeItem: string){$ENDIF} of object;

  TRewardedVideoAdListener = class{$IFDEF android}(TJavaLocal,
    JRewardedVideoAdListener){$ENDIF}
  private
    RewardedVideo: TRewardedVideo;
  public
    constructor Create(aRewardedVideo: TRewardedVideo);
    procedure onRewarded{$IFDEF android}(P1: JRewardItem){$ENDIF}; cdecl;
    procedure onRewardedVideoAdClosed; cdecl;
    procedure onRewardedVideoAdFailedToLoad(P1: Integer); cdecl;
    procedure onRewardedVideoAdLeftApplication; cdecl;
    procedure onRewardedVideoAdLoaded; cdecl;
    procedure onRewardedVideoAdOpened; cdecl;
    procedure onRewardedVideoCompleted; cdecl;
    procedure onRewardedVideoStarted; cdecl;
  end;

  TRewardedVideo = class(TComponent)
  private
    FAppId: string;
    FUnitId: string;
    FTestMode: boolean;

    FRewardedVideoAdListener: TRewardedVideoAdListener;
{$IFDEF android}
    FRewardedVideoAd: JRewardedVideoAd;
{$ENDIF}
    FRewarded: TEvent3;
    FRewardedVideoAdClosed: TEvent1;
    FRewardedVideoAdFailedToLoad: TEvent2;
    FRewardedVideoAdLeftApplication: TEvent1;
    FRewardedVideoAdLoaded: TEvent1;
    FRewardedVideoAdOpened: TEvent1;
    FRewardedVideoCompleted: TEvent1;
    FRewardedVideoStarted: TEvent1;
    procedure LoadAd;
  protected

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ShowAd;
  published
    property AppId: string read FAppId write FAppId;
    property UnitId: string read FUnitId write FUnitId;
    property TestMode: boolean read FTestMode write FTestMode;
    property onRewarded: TEvent3 read FRewarded write FRewarded;
    property onRewardedVideoAdClosed: TEvent1 read FRewardedVideoAdClosed
      write FRewardedVideoAdClosed;
    property onRewardedVideoAdFailedToLoad: TEvent2
      read FRewardedVideoAdFailedToLoad write FRewardedVideoAdFailedToLoad;
    property onRewardedVideoAdLeftApplication: TEvent1
      read FRewardedVideoAdLeftApplication
      write FRewardedVideoAdLeftApplication;
    property onRewardedVideoAdLoaded: TEvent1 read FRewardedVideoAdLoaded
      write FRewardedVideoAdLoaded;
    property onRewardedVideoAdOpened: TEvent1 read FRewardedVideoAdOpened
      write FRewardedVideoAdOpened;
    property onRewardedVideoCompleted: TEvent1 read FRewardedVideoCompleted
      write FRewardedVideoCompleted;
    property onRewardedVideoStarted: TEvent1 read FRewardedVideoStarted
      write FRewardedVideoStarted;
  end;

procedure Register;

implementation

{$IFDEF android}

uses
  FMX.Platform.Android,
  FMX.Helpers.Android,
  Androidapi.Helpers;

function JsToStr(const JStr: JString): string;
begin
  Result := TAndroidHelper.JStringToString(JStr);
end;

function StrToJs(const Str: string): JString;
begin
  Result := TAndroidHelper.StringToJString(Str);
end;
{$ENDIF}

procedure TRewardedVideo.LoadAd;
{$IFDEF android}
var
  FRequestBuilder: JAdRequest_Builder;
  FRequest: JAdRequest;
begin
  FRequestBuilder := TJAdRequest_Builder.Create;
  if FTestMode then
    FRequestBuilder.addTestDevice(MainActivity.getDeviceID);
  FRequest := FRequestBuilder.build;
  FRewardedVideoAd.setRewardedVideoAdListener
    (JRewardedVideoAdListener(FRewardedVideoAdListener));
  if not FRewardedVideoAd.isLoaded then
    FRewardedVideoAd.LoadAd(StrToJs(FUnitId), FRequest);
{$ELSE}
begin
{$ENDIF}
end;

procedure TRewardedVideo.ShowAd;
begin
{$IFDEF android}
  CallInUIThread(LoadAd);
{$ENDIF}
end;

constructor TRewardedVideo.Create(AOwner: TComponent);
begin
  inherited;
  TestMode := true;
{$IFDEF android}
  TJMobileAds.JavaClass.initialize(TAndroidHelper.Context, StrToJs(FAppId));
  FRewardedVideoAd := TJMobileAds.JavaClass.getRewardedVideoAdInstance
    (MainActivity);
{$ENDIF}
  FRewardedVideoAdListener := TRewardedVideoAdListener.Create(self);
end;

destructor TRewardedVideo.Destroy;
begin
  freeandnil(FRewardedVideoAdListener);
  inherited;
end;

{ TRewardedVideoAdListener }

constructor TRewardedVideoAdListener.Create(aRewardedVideo: TRewardedVideo);
begin
  inherited Create;
  RewardedVideo := aRewardedVideo;
end;

procedure TRewardedVideoAdListener.onRewarded{$IFDEF android}(P1: JRewardItem){$ENDIF};
begin
  if Assigned(RewardedVideo.FRewarded) then
    RewardedVideo.FRewarded{$IFDEF android}(P1.getAmount,
      JsToStr(P1.getType)){$ENDIF};
end;

procedure TRewardedVideoAdListener.onRewardedVideoAdClosed;
begin
  if Assigned(RewardedVideo.FRewardedVideoAdClosed) then
    RewardedVideo.FRewardedVideoAdClosed;
end;

procedure TRewardedVideoAdListener.onRewardedVideoAdFailedToLoad(P1: Integer);
begin
  if Assigned(RewardedVideo.FRewardedVideoAdFailedToLoad) then
    RewardedVideo.FRewardedVideoAdFailedToLoad(P1);
end;

procedure TRewardedVideoAdListener.onRewardedVideoAdLeftApplication;
begin
  if Assigned(RewardedVideo.FRewardedVideoAdLeftApplication) then
    RewardedVideo.FRewardedVideoAdLeftApplication;
end;

procedure TRewardedVideoAdListener.onRewardedVideoAdLoaded;
begin
  if Assigned(RewardedVideo.FRewardedVideoAdLoaded) then
    RewardedVideo.FRewardedVideoAdLoaded;
{$IFDEF android}
  RewardedVideo.FRewardedVideoAd.show;
{$ENDIF}
end;

procedure TRewardedVideoAdListener.onRewardedVideoAdOpened;
begin
  if Assigned(RewardedVideo.FRewardedVideoAdOpened) then
    RewardedVideo.FRewardedVideoAdOpened;
end;

procedure TRewardedVideoAdListener.onRewardedVideoCompleted;
begin
  if Assigned(RewardedVideo.FRewardedVideoCompleted) then
    RewardedVideo.FRewardedVideoCompleted;
end;

procedure TRewardedVideoAdListener.onRewardedVideoStarted;
begin
  if Assigned(RewardedVideo.FRewardedVideoStarted) then
    RewardedVideo.FRewardedVideoStarted;
end;

procedure Register;
begin
  RegisterComponents('StrakInfo Components', [TRewardedVideo]);
end;

end.


a unit com.google.Android.gms.ads é o que foi gerado pelo java2op usando a sdk extraida do demo deles.

com mais tempo tento postar um exemplo compilado em berlin.
vai estudando os pontos que deixei.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Dom Mar 24, 2019 3:43 am    Assunto: Responder com Citação

bom falei antes postaria um exemplo compilado em delphi berlin, mas antes umas ilustrações do que foi falado resumidamente no post anteior:




------------------------------------------------------------------------
aqui o AppId deve ser igual ao que colocado no arquivo manifest
------------------------------------------------------------------------




resultado final:





mais algumas ilustrações:






e por fim o Código fonte do exemplo compilado em no delphi berlin 10.1

Download aqui do exemplo :p
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Dom Mar 24, 2019 4:06 am    Assunto: Responder com Citação

este tipo de anúncio é mais bem pago, pois ele possui recompensa para o usuário, se o usuário quer a recompensa deve assistir o vídeo até o fim garantindo assim que o usuário assista a publicidade por completa beneficiando ambas as partes os anunciantes que terá sua publicidade assistida ate o fim e o usuário que no fim recebera a recompensa, por conta deste detalhe estes tipo de anucio se paga bem melhor que os outros dois anteriores a ele.

Quanto ao tipo da recompensa e o valor é configurado no momento que se cria o anúncio, contudo como não gosto de ir lá na admob e estar a criar vários anúncio para várias tipo de recompensa faço o controle na aplicação mesmo do tipo da recompensa e valor, assim tenho um único anúncio lá na admob onde na aplicação quem define o valor da recompensa será o evento que for disparado ou seja antes do showAd devo ter ja definido o tipo da recompensa.

exemplo:
se o usuário tiver clickado no botão 1 (recompensa 10 coins)
defino o tipo e valor da recompensa 10 coins e aguardo o evento RewardedVideo1Rewarded ser acionado
se foi então o usuário assistiu o video por completo e lhe entrego a recompensa

se o usuário tiver clickado no botão 2 (recompensa 1000 coins)
defino o tipo e valor da recompensa para 1000 coins e aguardo o evento RewardedVideo1Rewarded ser acionado
se foi acionado então o usuário assistiu o video por completo e lhe entrego a recompensa

em termo de codigo fica mais ou menos assim:



Código:
{...}
  public
    { Public declarations }
    valorRecompensa:integer;
    credito:integer;
  end;

{...}

procedure TForm2.Button1Click(Sender: TObject);
begin
  valorRecompensa:=10;  // meu controle do valor da recompensa
  RewardedVideo1.showAd;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  valorRecompensa:=1000; // meu controle do valor da recompensa
  RewardedVideo1.showAd;
end;


procedure TForm2.RewardedVideo1Rewarded(Amount: Integer; TypeItem: string);
begin
// não uso o valor Amount e nem TypeItem que teria vindo lá da admob
//  em vez disso entrego a recompensa ao usuário registrada no evento que vai disparar o showAd
credito:=credito+valorRecompensa;
end;

_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
rodrigoprado
Colaborador
Colaborador


Registrado: Terça-Feira, 24 de Mai de 2005
Mensagens: 1074
Localização: Curitiba/PR

MensagemEnviada: Ter Abr 09, 2019 11:32 am    Assunto: Responder com Citação

Bom dia, eu havia até desanimado quando a uma resposta relacionado a este assunto, hoje meu app abre o anuncio premiado, mas para ter o tal controle do tempo eu faço uns códigos a parte.

Eu agradeço sua resposta "strak2012", esssa semana vou estudar mais um pouco e testar o material que vc me passou, achei muito legal, vou testar.
_________________
- Compartilhe seus conhecimentos -
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
strak2012
Colaborador
Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014
Mensagens: 1518
Localização: Maceió - AL

MensagemEnviada: Ter Abr 09, 2019 12:22 pm    Assunto: Responder com Citação

Só vais notar um aumento no tempo da compilação, isso deriva por conta dos enumeros xml e png extra que são nescessario para o projeto.

O tempo aumenta em quase 5 vezes o tempo normal, então só recomendo a implementação do recurso já com um projeto avançado, perto do fim ou no fim.

Boa sorte.
_________________
Tudo podemos quando tudo sabemos!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Mobile com Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB