Показывать персонализированное рекламное объявление, например, как рекламное объявление AdMob - PullRequest
1 голос
/ 08 февраля 2020

В настоящее время мы используем промежуточную рекламу admob в нашем приложении. На первом экране spla sh мы имеем:

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        getWindow().setNavigationBarColor(getResources().getColor(R.color.colorPrimary));
    }
    setContentView(R.layout.activity_splash);
    mContext = this;

    requestNewInterstitialList();
}

private void requestNewInterstitialList() {
    InterstitialAd mInterstitialAd = new InterstitialAd(this);
    mInterstitialAd.setAdUnitId(getString(R.string.gl_start_app_inter));
    mInterstitialAd.loadAd(new AdRequest.Builder().build());
    mInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdOpened() {
                super.onAdOpened();
                mContext.finish();
            }

            @Override
            public void onAdLoaded() {
                super.onAdLoaded();
                if (mInterstitialAd != null && mInterstitialAd.isLoaded()) {
                    Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                    mInterstitialAd.show();
                }
            }
        });
}

Я запросил interstitial с onCreate() на нашем экране spla sh. Обратите внимание, что в interstitial объявлении в onAdLoaded() я запустил MainActivity.class через intent, и это обязательно запустит этот экран, не закрывая interstitial объявление! Таким образом, он просто запустит новый экран в фоновом режиме и покажет рекламное объявление одновременно! После этого в onAdOpened() объявления я только что закончил свою текущую активность (экран Spla sh), и это также не влияет на объявление interstitial и в среднем, когда пользователь закрывает объявление на заднем главном экране, загружается!

Теперь ситуация такова, что у нас есть несколько спонсоров, и они хотят показывать встроенную рекламную рекламу в нашем приложении! Итак, я сделал это в DialogFragment:

public class DF_Interstitial_Ad extends DialogFragment {
private LayoutInterstitialAdBinding mBinding;
private Context mContext;
private String adUrl;

private SimpleExoPlayer player;
private PlayerView exoPlayerView;
private long playBackPosition = 0;
private boolean isPlayerReady = false;
private boolean isOnPause = false;

private InterAdListener mAdListener = null;

public DF_Interstitial_Ad(@NonNull Context mContext, @NonNull String adUrl) {
    this.mContext = mContext;
    this.adUrl = adUrl;

    mBinding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.layout_interstitial_ad, null,
            false);

    dataSourceFactory = buildDataSourceFactory();
    exoPlayerView = mBinding.playerAd;
    initializePlayer();
}

private class ModelInterStitialAd {
    private String title;
    private String description;
    private String appIconUrl;
    private String videoUrl;
    private String installUrl;
    private float rattings;

    public String getTitle() {
        return title;
    }

    public String getDescription() {
        return description;
    }

    public String getAppIconUrl() {
        return appIconUrl;
    }

    public String getVideoUrl() {
        return videoUrl;
    }

    public String getInstallUrl() {
        return installUrl;
    }

    public float getRattings() {
        return rattings;
    }
}

//region Data source...
private DataSource.Factory dataSourceFactory;
private MediaSource mediaSource;
private AdsLoader adsLoader;

private void releaseAdsLoader() {
    if (adsLoader != null) {
        adsLoader.release();
        adsLoader = null;
        Objects.requireNonNull(exoPlayerView.getOverlayFrameLayout()).removeAllViews();
    }
}

private void releasePlayer() {
    if (player != null) {
        playBackPosition = player.getCurrentPosition();
        player.release();
        player = null;
        mediaSource = null;
        Log.i("Player>>>", "Player released");
    }
    if (adsLoader != null) {
        releaseAdsLoader();
    }
}

private DataSource.Factory buildDataSourceFactory() {
    return MyApplication.getInstance().buildDataSourceFactory(null);
}
//endregion

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(STYLE_NORMAL, R.style.FullScreenDialog);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Objects.requireNonNull(Objects.requireNonNull(getDialog()).getWindow()).addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

    if (mAdListener != null) {
        mAdListener.onShow();
    }

    playPausePlayer(true);

    return mBinding.getRoot();
}

@Override
public void onResume() {
    super.onResume();
    isOnPause = false;
    playPausePlayer(true);
}

@Override
public void onPause() {
    super.onPause();
    isOnPause = true;
    playPausePlayer(true);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (mAdListener != null) {
        mAdListener.onClose();
    }
    releasePlayer();
}

//region Player zone...
private void initializePlayer() {
    player = new SimpleExoPlayer.Builder(mContext).build();
    player.setPlayWhenReady(false);

    exoPlayerView.setPlayer(player);
    exoPlayerView.setBackgroundColor(Color.BLACK);
    exoPlayerView.setUseController(false);

    mBinding.viewMain.setOnClickListener(v -> {
        if (isPlayerReady)
            if (player != null) {
                if (player.getPlaybackState() == Player.STATE_ENDED) {
                    mBinding.ivPlayVideo.setVisibility(View.VISIBLE);
                    playBackPosition = 0;
                    playPausePlayer(true);
                } else {
                    if (player.getPlayWhenReady()) {
                        playPausePlayer(false);
                        mBinding.ivPlayVideo.setVisibility(View.VISIBLE);
                    } else {
                        playPausePlayer(true);
                        mBinding.ivPlayVideo.setVisibility(View.GONE);
                    }
                }
            }
    });

    player.addListener(new Player.EventListener() {
        @Override
        public void onPlayerStateChanged(boolean playWhenReady, int playbackState) {
            if (playbackState == Player.STATE_ENDED) {
                mBinding.ivPlayVideo.setVisibility(View.VISIBLE);
            } else if (playbackState == Player.STATE_READY) {
                if (!isPlayerReady) {
                    isPlayerReady = true;
                    if (mAdListener != null) {
                        mAdListener.onLoaded();
                    }
                }
                if (isOnPause)
                    playPausePlayer(false);
            }
        }
    });
        prepareExoPlayer();
    }

private void prepareExoPlayer() {
    mediaSource = buildMediaSource(Uri.parse(adUrl));
    player.prepare(mediaSource, true, false);
}

private MediaSource buildMediaSource(Uri uri) {
    CacheDataSourceFactory cacheDataSourceFactory = new CacheDataSourceFactory(VideoCache.getInstance(mContext),
            dataSourceFactory);
    @C.ContentType int type = Util.inferContentType(uri, null);
    switch (type) {
        case C.TYPE_HLS:
            return new HlsMediaSource.Factory(cacheDataSourceFactory).setAllowChunklessPreparation(true).createMediaSource(uri);
        case C.TYPE_OTHER:
            return new ProgressiveMediaSource.Factory(cacheDataSourceFactory).createMediaSource(uri);
        case C.TYPE_DASH:
        case C.TYPE_SS:
        default:
            throw new IllegalStateException("Unsupported type: " + type);
    }
}

private void playPausePlayer(boolean play) {
    if (player != null) {
        if (play) {
            player.seekTo(playBackPosition);
            player.setPlayWhenReady(true);
            player.getPlaybackState();
            mBinding.ivPlayVideo.setVisibility(View.GONE);
        } else {
            playBackPosition = player.getCurrentPosition();
            player.setPlayWhenReady(false);
            player.getPlaybackState();
            mBinding.ivPlayVideo.setVisibility(View.VISIBLE);
        }
    }
}
//endregion

public void setmAdListener(InterAdListener mAdListener) {
    this.mAdListener = mAdListener;
}

public boolean isLoaded() {
    return isPlayerReady;
}
}

Это мой DialogFragment, в котором я реализовал свое собственное промежуточное объявление. Итак, после этого я просто регулярно запрашиваю его, как и объявление interstitial от Adobob с экрана spla sh, например:

private void requestMyInterstitialAd() {
    DF_Interstitial_Ad dfInterstitialAd = new DF_Interstitial_Ad(mContext, "https://booads.s3.ap-south-1.amazonaws.com/output.mp4");
    dfInterstitialAd.setmAdListener(new InterAdListener() {
        @Override
        public void onLoaded() {
            super.onLoaded();
            if (dfInterstitialAd != null && dfInterstitialAd.isLoaded()) {
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                dfInterstitialAd.show(getSupportFragmentManager(), "SplashScreen");
            }
        }

        @Override
        public void onShow() {
            super.onShow();
        }

        @Override
        public void onClose() {
            super.onClose();

        }
    });
}

Это показ следующего экрана (MainActivity) перед экраном, а не DialogFragment рекламы! Так что делать? за показ рекламы перед пользователем и в то же время при открытии следующего действия за рекламой! Я уже пытался показывать объявление в activity, а не DialogFragment, но оно также не работает для меня!

...