安卓系统白日梦/梦想服务中的广告



有人知道是否有任何Android广告SDK可以使用新的DreamService功能吗?我尝试使用AdMob,第一次看到Interinitial类构造函数明确地需要一个Activity。我看到AdView有一个只需要上下文的构造函数,所以我尝试了一下,但得到了一个运行时异常,告诉我问题是我试图使用除Activity之外的上下文来扩展AdView。我曾尝试过亚马逊移动广告API,但它似乎与AdMob完全相同。

我试着发挥创意,从我的DreamService开始另一项活动,创建一个初始广告,但它是在DreamService UI后面创建的(有点道理,因为白日梦覆盖了所有内容)。有人知道在白日梦中使用广告的解决方案吗?

我想出了一些解决这个问题的方法,尽管我仍然不太喜欢这个解决方案。如果有人知道一种更优雅的方法,我会欢迎的。

我所做的是使用mMedia SDK而不是AdMob。它们的Interinitial和AdView类在构造函数中都可以采用Context而不是Activity。Interstial对我来说仍然没有成功,因为它在Dream覆盖层后面打开。因此,我最终做的是在Dream的XML布局中添加一个AdView,然后将其可见性设置为View.GONE,直到我想显示它。当该显示广告时,我将其设置为View.VISIBLE.

我遇到的另一个问题是,在点击AdView后,它会启动带有广告URL的浏览器,当然,URL会在Dream后面打开,这违背了显示广告的目的。所以我最终将Dream设置为交互式的,捕捉到了onTouchEvent,然后如果点击时广告是可见的,请调用广告的callOnClick方法。我还必须将广告的RequestListener设置为我的Dream Service,并实现MMAdOverlayLaunched方法,该方法在广告启动浏览器时调用。在这个方法中,我只是调用finish()来停止Dream并让浏览器显示Ad.

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    // Exit dream upon user touch
    setInteractive(true);
    // Hide system UI
    setFullscreen(true);
    // Set the dream layout
    setContentView(R.layout.dream_layout);
    //Initialize Ads
    this.initAdvertising();
}
private void initAdvertising(){
     MMSDK.initialize(this);
     mDreamAd = (MMAdView) findViewById(R.id.adView);
     //Separate thread will handle showing the ad
     mDreamAd.setVisibility(View.GONE);
     mAdRequest = new MMRequest();
     //TODO add metadata to Request
     mDreamAd.setMMRequest(mAdRequest);
     mDreamAd.setListener(this);
     mDreamAd.getAd();
}
@Override
public boolean dispatchTouchEvent(MotionEvent event){
    super.dispatchTouchEvent(event);
    if(mDreamAd != null && mDreamAd.isShown()){
        mDreamAd.callOnClick();
    }
    return true;
}
@Override
public void MMAdOverlayLaunched(MMAd ad) {
    //Finish so we can display the ad the user has clicked
    if(ad.equals(this.mDreamAd))
        this.finish();
}