我们的App需要通过接入广告的方式来赚取收入,其中GoogleAdMob就是比较简单容易实现的一种。
我在文章中接入GoogleAdmob的方式是通过AndroidStudio原生来接入的。
横幅广告是在应用布局中占据一处位置的矩形图片或文字广告。用户与应用互动时,这类广告会停留在屏幕上,并且可在一段时间后自动刷新。如果您刚开始接触移动广告,建议从横幅广告着手。
插页式广告是全屏广告,它会覆盖整个应用界面,直到用户将其关闭。在应用执行流程的自然停顿点,例如游戏的不同关卡之间,或一项任务完成后,最适合投放这类广告。
原生广告是一种基于组件的广告格式,可让您自由地自定义素材资源(如标题和号召性用语)在应用中的呈现方式。通过自行选择字体、颜色和其他详细信息,您可以呈现出自然而不突兀的广告展示效果,进而提供更丰富的用户体验。
目前,原生广告尚处于封闭测试阶段,仅面向部分发布商提供。
激励视频广告是一种全屏视频广告,用户可选择使用全屏模式观看,以换取应用内奖励。
下面,我们将开展激励广告的接入方式。
1.在app文件夹外部的build.gradle文件中增加这两行
allprojects {
repositories {
google()
jcenter()
}
}
当然,如果有了就不用加了。
2.在app文件夹内部的build.gradle文件中增加这一行
implementation 'com.google.android.gms:play-services-ads:17.2.0'
3.在AndroidManifest.xml里增加以下内容:
其中的YOUR_ADMOB_APP_ID就是上图中你的AdMob账号中的“应用ID”。
4.初始化MobileAds
加载广告之前,请先使用AdMob“应用ID”调用MobileAds.initialize(),以便让应用初始化移动广告SDK。此操作仅需要执行一次,最好是在应用启动时执行。
在AppActivity.java中加入以下代码:
package ...
import ...
import com.google.android.gms.ads.MobileAds;
public class MainActivity extends AppCompatActivity {
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Sample AdMob app ID: ca-app-pub-3940256099942544~3347511713
MobileAds.initialize(this, "YOUR_ADMOB_APP_ID");
}
...
}
至此,初始化已经完成了,如果要接入不同类型的广告,就可以直接接入。
当我们接到需要接入广告的需求的时候,可能我们App功能还没开发完成,还没上线到商店里,这样也可以接入广告测试吗?
答案当然是可以。
GoogleAdMob提供了测试广告ID:
广告格式 | 示例广告单元 ID |
---|---|
横幅广告 | ca-app-pub-3940256099942544/6300978111 |
插页式广告 | ca-app-pub-3940256099942544/1033173712 |
插页式视频广告 | ca-app-pub-3940256099942544/8691691433 |
激励视频广告 | ca-app-pub-3940256099942544/5224354917 |
原生高级广告 | ca-app-pub-3940256099942544/2247696110 |
原生高级视频广告 | ca-app-pub-3940256099942544/1044960115 |
在这里,我们首先初始化激励广告的SDK功能:
1.在AppActivity.java中加入以下代码
public class AppActivity extends Cocos2dxActivity {
private RewardedVideoAd mRewardedVideoAd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
if (!isTaskRoot()) {
// Android launched another instance of the root activity into an existing task
// so just quietly finish and go away, dropping the user back into the activity
// at the top of the stack (ie: the last state of this task)
// Don't need to finish it again since it's finished in super.onCreate .
return;
}
// DO OTHER INITIALIZATION BELOW
SDKWrapper.getInstance().init(this);
CAAgent.enableDebug(false);
// Sample AdMob app ID:
MobileAds.initialize(this, "不能说");
// Use an activity context to get the rewarded video instance.
mRewardedVideoAd = MobileAds.getRewardedVideoAdInstance(this);
mRewardedVideoAd.setRewardedVideoAdListener(this);
loadRewardedVideoAd();
}
private void loadRewardedVideoAd() {
mRewardedVideoAd.loadAd("ca-app-pub-3940256099942544/5224354917",
new AdRequest.Builder().build());
}
@Override
public void onRewarded(RewardItem reward) {
Toast.makeText(this, "onRewarded! currency: " + reward.getType() + " amount: " +
reward.getAmount(), Toast.LENGTH_SHORT).show();
// Reward the user.
}
.....
}
2.实现RewardedVideoAdListener接口
public class AppActivity extends Cocos2dxActivity implements RewardedVideoAdListener
@Override
public void onRewarded(RewardItem reward) {
Toast.makeText(this, "onRewarded! currency: " + reward.getType() + " amount: " +
reward.getAmount(), Toast.LENGTH_SHORT).show();
// Reward the user.
}
@Override
public void onRewardedVideoAdLeftApplication() {
Toast.makeText(this, "onRewardedVideoAdLeftApplication",
Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdClosed() {
Toast.makeText(this, "onRewardedVideoAdClosed", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdFailedToLoad(int errorCode) {
Toast.makeText(this, "onRewardedVideoAdFailedToLoad", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdLoaded() {
Toast.makeText(this, "onRewardedVideoAdLoaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoAdOpened() {
Toast.makeText(this, "onRewardedVideoAdOpened", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoStarted() {
Toast.makeText(this, "onRewardedVideoStarted", Toast.LENGTH_SHORT).show();
}
@Override
public void onRewardedVideoCompleted() {
Toast.makeText(this, "onRewardedVideoCompleted", Toast.LENGTH_SHORT).show();
}
3.反复播放广告
把上面的onRewardedVideoAdClosed方法修改一下:
@Override
public void onRewardedVideoAdClosed() {
// Load the next rewarded video ad.
loadRewardedVideoAd();
}
然后再在我们需要弹出广告的地方调用以下方法:
if (mRewardedVideoAd.isLoaded()) {
mRewardedVideoAd.show();
}
注意:我们需要在广告加载完成,也就是isLoaded()为true的时候调用。
至此,我们调用广告的功能就完成了!!!。。。。
4.做一个优化:有用的回调
要将父级 Activity 的生命周期事件转发给 RewardedVideoAd
对象,可在父级 Activity 的 onResume()
、onPause()
和 onDestroy()
方法中分别调用 resume()
、pause()
和 destroy()
方法。
@Override
public void onResume() {
mRewardedVideoAd.resume(this);
super.onResume();
}
@Override
public void onPause() {
mRewardedVideoAd.pause(this);
super.onPause();
}
@Override
public void onDestroy() {
mRewardedVideoAd.destroy(this);
super.onDestroy();
}
这一个生命周期的回调有挺大的用处的,大家可以思考一下这个用处是什么。