Android এর জন্য IMA SDK-এর সাথে কাস্টম বিজ্ঞাপন প্লেব্যাক

IMA v3.30.0 এবং তার নিচের সংস্করণে, IMA SDK বিজ্ঞাপন-বাজনার সমস্ত যুক্তি পরিচালনা করতে পারে, যখন আপনার অ্যাপটি বিষয়বস্তু ভিডিও চালানোর উপর ফোকাস করে। এই পদ্ধতিটিকে "SDK-মালিকানাধীন বিজ্ঞাপন প্লেব্যাক" বলা হয়।

আপনি যদি আপনার ভিডিও প্লেয়ারে বিজ্ঞাপন চালাতে চান, SDK এর জন্য একটি ইন্টারফেস প্রদান করে। আমরা এই পদ্ধতিটিকে "কাস্টম অ্যাড প্লেব্যাক" হিসাবে উল্লেখ করি এবং এই নির্দেশিকাটির বাকি অংশ এটির বাস্তবায়নের উপর চলে যায়।

পূর্বশর্ত

  • একটি মৌলিক IMA ইন্টিগ্রেশন।

আপনার যদি বর্তমানে একটি মৌলিক IMA ইন্টিগ্রেশন না থাকে তবে আমরা আপনাকে সূচনা পয়েন্ট হিসাবে github-এ উন্নত উদাহরণ দেখার পরামর্শ দিই। এই উদাহরণটি ইতিমধ্যেই কাস্টম বিজ্ঞাপন প্লেব্যাক প্রয়োগ করে৷ এই গাইডের বাকি অংশটি IMA বিজ্ঞাপনের সাথে কাস্টম বিজ্ঞাপন প্লেব্যাকের জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলি বর্ণনা করবে।

VideoAdPlayer এর সাথে ইন্টারফেস

VideoAdPlayer ইন্টারফেস বাস্তবায়নের জন্য কাস্টম বিজ্ঞাপন প্লেব্যাকের জন্য আপনার অ্যাপের প্রয়োজন। এই ইন্টারফেসটি SDK দ্বারা বিজ্ঞাপন ভিডিও চালানোর জন্য আপনার অ্যাপকে অবহিত করতে ব্যবহার করা হয়। আপনার অ্যাপটিও এই ইন্টারফেসটি ব্যবহার করে SDK-কে প্রধান ভিডিও বিজ্ঞাপন ইভেন্টগুলি জানাতে। ইন্টারফেস বাস্তবায়ন করতে এই পদক্ষেপগুলি অনুসরণ করুন।

একটি VideoAdPlayer তৈরি করুন

প্রথম ধাপ হল requestAds() এ একটি বেনামী VideoAdPlayer ক্লাস তৈরি করা:

private VideoAdPlayer videoAdPlayer;
...

private void requestAds(String adTagUrl) {
    videoAdPlayer = new VideoAdPlayer() {
    };
}

ভিডিও পদ্ধতি যোগ করুন

এরপরে, এমন পদ্ধতি যোগ করুন যা আপনার ভিডিও প্লেয়ারকে বিজ্ঞাপন ভিডিও চালাতে, লোড করতে, থামাতে এবং পজ করতে বলে। আমরা প্লেয়ার রিলিজ করার এবং এখানে ভলিউম পাওয়ার পদ্ধতিও যোগ করি:

videoAdPlayer = new VideoAdPlayer() {
        @Override
        public void playAd() {
            if (mIsAdDisplayed) {
                videoPlayer.resume();
            } else {
                isAdDisplayed = true;
                videoPlayer.play();
            }
        }

        @Override
        public void loadAd(String url) {
            isAdDisplayed = true;
            videoPlayer.setVideoPath(url);
        }
        @Override
        public void stopAd() {
            videoPlayer.stopPlayback();
        }
        @Override
        public void pauseAd() {
            videoPlayer.pause();
        }

        @Override
        public void release() {
            // any clean up that needs to be done
        }

        @Override
        public int getVolume() {
            return videoPlayer.getVolume();
        }
};

এই পদ্ধতিগুলি আপনার ভিডিও প্লেয়ারের নিজস্ব অনুরূপ পদ্ধতির চারপাশে পাতলা মোড়ক। মনে রাখবেন যে এই পদ্ধতিগুলি একটি অভ্যন্তরীণ পরিবর্তনশীল সেট করে যা একটি বিজ্ঞাপন প্রদর্শিত হয় কিনা তা ট্র্যাক রাখতে ব্যবহৃত হয়। কাস্টম বিজ্ঞাপন প্লেব্যাকে, ভিডিও প্লেয়ার কন্টেন্ট ভিডিও এবং ভিডিও বিজ্ঞাপন উভয়ই চালায়, তাই আপনাকে ট্র্যাক রাখতে হবে যা বর্তমানে প্রদর্শিত হচ্ছে।

বিজ্ঞাপন প্লেব্যাক অগ্রগতি

VideoAdPlayer ইন্টারফেস অন্য একটি ইন্টারফেস, AdProgressProvider প্রয়োগ করে, তাই আপনাকে অবশ্যই এটি বাস্তবায়ন করতে হবে। এটিতে শুধুমাত্র একটি পদ্ধতি রয়েছে, getAdProgress() , যা SDK দ্বারা বিজ্ঞাপনের জন্য প্লেব্যাকের তথ্য পেতে ব্যবহৃত হয়। অন্যান্য পদ্ধতির নিচে আপনার বেনামী VideoAdPlayer ক্লাসে এটি যোগ করুন:

VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
        ...
        @Override
        public VideoProgressUpdate getAdProgress() {
            if (!isAdDisplayed || videoPlayer.getDuration() <= 0) {
                return VideoProgressUpdate.VIDEO_TIME_NOT_READY;
            }
            return new VideoProgressUpdate(videoPlayer.getCurrentPosition(),
                    videoPlayer.getDuration());
        }
};

getAdProgress() একটি VideoProgressUpdate প্রকার প্রদান করে, যা অবশ্যই ভিডিওর বর্তমান অবস্থান এবং সময়কাল নিয়ে গঠিত। যদি প্লেয়ার একটি বিজ্ঞাপন না চালায়, বা সময়কাল অনুপলব্ধ হয়, তাহলে এটিকে VideoProgressUpdate.VIDEO_TIME_NOT_READY ফেরত দিতে হবে৷ যেমন উদাহরণে দেখানো হয়েছে VIDEO_TIME_NOT_READY৷

ভিডিও কলব্যাক পরিচালনা করুন

কাস্টম বিজ্ঞাপন প্লেব্যাকের জন্য আপনার অ্যাপের SDK-কে প্রধান ভিডিও ইভেন্টগুলি জানাতে হবে। SDK-এর দৃষ্টিকোণ থেকে, এইগুলি হল কলব্যাক যা VideoAdPlayer.VideoAdPlayerCallback ইন্টারফেস দ্বারা বর্ণনা করা হয়েছে৷ কলব্যাক পদ্ধতিতে প্রবেশ করার আগে, আপনাকে SDK-এর অনুরোধে কলব্যাকগুলি যোগ করতে এবং সরাতে সক্ষম হতে হবে৷ এটি addCallback() এবং removeCallback() ব্যবহার করে VideoAdPlayer ভিতরে করা হয়:

private List<VideoAdPlayerCallback> adCallbacks = new ArrayList<>(1);

VideoAdPlayer videoAdPlayer = new VideoAdPlayer() {
        ...
        @Override
        public void addCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
            adCallbacks.add(videoAdPlayerCallback);
        }

        @Override
        public void removeCallback(VideoAdPlayerCallback videoAdPlayerCallback) {
            adCallbacks.remove(videoAdPlayerCallback);
        }
};

এই ইমপ্লিমেন্টেশনটি একটি List<> ব্যবহার করে কলব্যাকের জন্য যেটিতে List<>.add() এবং remove() পদ্ধতিতে কল করতে হবে।

কলব্যাকগুলিকে কল করুন

এখন যেহেতু SDK-এর কাছে আপনার অ্যাপকে কলব্যাক যোগ করতে এবং সরাতে বলার একটি উপায় রয়েছে, সেই স্থানগুলিকে সংজ্ঞায়িত করুন যেখানে কলব্যাকটি বলা হয়েছে৷ আপনার অ্যাপটিকে এই কলব্যাকগুলি কল করতে হবে যখন বড় ভিডিও ইভেন্টগুলি ঘটে, যেমন একটি ভিডিও চালানো, বিরতি দেওয়া বা পুনরায় শুরু করা, বা যখন একটি ভিডিও শেষ হয় বা একটি ত্রুটি অনুভব করে৷

এটি করার জন্য, VideoFragment থেকে যোগ করা এই ভিডিও ইভেন্টগুলির জন্য একজন শ্রোতা পেতে SampleVideoPlayer প্রসারিত করুন। এই বিজ্ঞাপন কলব্যাকগুলি কল করার জন্য SampleVideoPlayer এ একটি পৃথক শ্রোতা তৈরি করার কারণ হল SampleVideoPlayer বিজ্ঞাপনগুলি সম্পর্কে কিছুই জানে না, তাই আপনাকে অবশ্যই এর ভিডিও ইভেন্টগুলিকে এমন কিছুতে ফরওয়ার্ড করতে হবে যা বিজ্ঞাপনগুলির সাথে মোকাবিলা করতে পারে৷

public interface OnVideoEventsListener {
    void onPlay();
    void onResume();
    void onPause();
    void onError();
}

private final List<OnVideoEventsListener> onVideoEventsListeners = new ArrayList<>(1);

public void addVideoEventsListener(OnVideoEventsListener listener) {
    onVideoEventsListeners.add(listener);
}

শুরু করুন, বিরতি দিন এবং পুনরায় শুরু করুন

প্লেব্যাক অবস্থার ট্র্যাক রাখতে একটি নতুন enum তৈরি করুন এবং SampleVideoPlayerstart() এবং pause() পদ্ধতির জন্য নতুন ওভাররাইড যোগ করুন:

private enum PlaybackState {
    STOPPED, PAUSED, PLAYING
}

private PlaybackState playbackState = PlaybackState.STOPPED;

@Override
public void start() {
    super.start();
    switch (playbackState) {
        case STOPPED:
            for (OnVideoEventsListener listener : onVideoEventsListeners) {
                listener.onPlay();
            }
            break;
        case PAUSED:
            for (OnVideoEventsListener listener : onVideoEventsListeners) {
                listener.onResume();
            }
            break;
        default:
            // Already playing; do nothing.
            break;
    }
    playbackState = PlaybackState.PLAYING;
}

@Override
public void pause() {
    super.pause();
    playbackState = PlaybackState.PAUSED;
    for (OnVideoEventsListener listener : onVideoEventsListeners) {
        listener.onPause();
    }
}

ত্রুটিগুলি পরিচালনা করুন

আপনি init() এ সেট করা ভিডিও প্লেয়ারের বেনামী ত্রুটি শ্রোতাকে ওভাররাইড করুন :

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
    playbackState = PlaybackState.STOPPED;
    for (OnVideoEventsListener listener : onVideoEventsListeners) {
        listener.onError();
    }

    // Returning true signals to MediaPlayer that the error was handled.
    // This  prevents the completion handler from being called.
    return true;
}

শ্রোতাকে বাস্তবায়িত করুন

VideoFragment এ ফিরে যান এবং আপনার SampleVideoPlayer উদাহরণে একটি বেনামী OnVideoEventsListener যোগ করুন:

mVideoPlayer.addVideoEventsListener(new OnVideoEventsListener() {
    @Override
    public void onPlay() {
        if (isAdDisplayed) {
            for (VideoAdPlayerCallback callback : adCallbacks) {
                callback.onPlay();
            }
        }
    }

    @Override
    public void onResume() {
        if (isAdDisplayed) {
            for (VideoAdPlayerCallback callback : adCallbacks) {
                callback.onResume();
            }
        }
    }

    @Override
    public void onPause() {
        if (isAdDisplayed) {
            for (VideoAdPlayerCallback callback : adCallbacks) {
                callback.onPause();
            }
        }
    }

    @Override
    public void onError() {
        if (isAdDisplayed) {
            for (VideoAdPlayerCallback callback : adCallbacks) {
                callback.onError();
            }
        }
    }
});

একটি বিজ্ঞাপন ভিডিও শেষ হয়েছে এমন কেস পরিচালনা করতে OnVideoCompletedListener এর onVideoCompleted() পদ্ধতিটি পরিবর্তন করুন:

public void onVideoCompleted() {
    // Handle completed event for playing post-rolls.
    if (isAdDisplayed) {
        for (VideoAdPlayerCallback callback : adCallbacks) {
            callback.onEnded();
        }
    } else {
        if (adsLoader != null) {
            adsLoader.contentComplete();
    }
}

বিষয়বস্তু এবং বিজ্ঞাপন মধ্যে স্যুইচ

এই উদাহরণটি ভিডিও প্লেয়ারের একই উদাহরণ ব্যবহার করে বিষয়বস্তু এবং বিজ্ঞাপন উভয়ই চালাতে, তাই আপনার প্লেয়ারে সামগ্রী এবং বিজ্ঞাপনগুলির মধ্যে স্যুইচ করার জন্য আপনাকে কিছু যুক্তি যোগ করতে হবে। তারপরে আপনি বিজ্ঞাপনটি যেখানে শুরু হয়েছিল সেখানে ফিরে যাওয়ার জন্য সামগ্রী ভিডিওটি পুনরায় লোড করতে এবং সন্ধান করতে পারেন। এটি করতে দুটি ফাংশন যোগ করুন:

private int savedContentPosition = 0;

private void pauseContent() {
    savedContentPosition = videoPlayer.getCurrentPosition();
    videoPlayer.stopPlayback();
    isAdDisplayed = true;
}

private void resumeContent() {
    videoPlayer.setVideoPath(getString(R.string.content_url));
    videoPlayer.seekTo(mSavedContentPosition);
    videoPlayer.play();
    isAdDisplayed = false;
}

এগুলিকে বলা হয় যখন CONTENT_PAUSE_REQUESTED এবং CONTENT_RESUME_REQUESTED ইভেন্টগুলি যথাক্রমে VideoFragment.onAdEvent() এ প্রাপ্ত হয়:

case CONTENT_PAUSE_REQUESTED:
    pauseContent();
    break;
case CONTENT_RESUME_REQUESTED:
    resumeContent();
    break;

কাস্টম বিজ্ঞাপন প্লেব্যাক সক্ষম করুন

শেষ ধাপ হল SDK কে বলা যে আপনি কাস্টম বিজ্ঞাপন প্লেব্যাক ব্যবহার করছেন। এটি আপনার AdDisplayContainer এ একটি VideoAdPlayer পাস করার মাধ্যমে করা হয়:

adDisplayContainer.setPlayer(videoAdPlayer);

setPlayer() এ আপনার প্লেয়ারকে পাস করা প্রয়োজন। অন্যথায়, SDK SDK-মালিকানাধীন প্লেব্যাক ব্যবহার করে।

সেটাই। আপনার IMA বাস্তবায়নে কাস্টম বিজ্ঞাপন প্লেব্যাক যোগ করার জন্য প্রয়োজনীয় সমস্ত পদক্ষেপ। আপনি যদি সমস্যায় পড়েন তবে আপনি গিথুবের উন্নত উদাহরণের সাথে আপনার নিজের বাস্তবায়ন তুলনা করতে পারেন।