 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
rodrigoprado Colaborador

Registrado: Terça-Feira, 24 de Mai de 2005 Mensagens: 1074 Localização: Curitiba/PR
|
Enviada: Seg Mar 18, 2019 8:40 am Assunto: Delphi 10.3.1 trabalhando com anuncios |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Sex Mar 22, 2019 1:24 am Assunto: |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Dom Mar 24, 2019 3:43 am Assunto: |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Dom Mar 24, 2019 4:06 am Assunto: |
|
|
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 |
|
 |
rodrigoprado Colaborador

Registrado: Terça-Feira, 24 de Mai de 2005 Mensagens: 1074 Localização: Curitiba/PR
|
Enviada: Ter Abr 09, 2019 11:32 am Assunto: |
|
|
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 |
|
 |
strak2012 Colaborador


Registrado: Segunda-Feira, 13 de Janeiro de 2014 Mensagens: 1518 Localização: Maceió - AL
|
Enviada: Ter Abr 09, 2019 12:22 pm Assunto: |
|
|
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 |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|