পিকচার-ইন-পিকচার (পিআইপি) ব্যবহার করে ভিডিও যোগ করুন

অ্যান্ড্রয়েড 8.0 (এপিআই লেভেল 26) থেকে শুরু করে, অ্যান্ড্রয়েড পিকচার-ইন-পিকচার (পিআইপি) মোডে ক্রিয়াকলাপ চালু করার অনুমতি দেয়। PiP হল একটি বিশেষ ধরনের মাল্টি-উইন্ডো মোড যা বেশিরভাগ ভিডিও প্লেব্যাকের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীকে অ্যাপের মধ্যে নেভিগেট করার সময় বা প্রধান স্ক্রিনে সামগ্রী ব্রাউজ করার সময় স্ক্রিনের একটি কোণায় পিন করা একটি ছোট উইন্ডোতে একটি ভিডিও দেখতে দেয়।

PiP পিন করা ভিডিও ওভারলে উইন্ডো প্রদান করার জন্য Android 7.0-এ উপলব্ধ মাল্টি-উইন্ডো API-গুলি ব্যবহার করে। আপনার অ্যাপ্লিকেশানে PiP যোগ করতে, আপনাকে আপনার ক্রিয়াকলাপগুলি নিবন্ধন করতে হবে যা PiP সমর্থন করে, আপনার কার্যকলাপকে প্রয়োজন অনুসারে PiP মোডে স্যুইচ করুন এবং নিশ্চিত করুন যে UI উপাদানগুলি লুকানো আছে এবং যখন কার্যকলাপটি PiP মোডে থাকে তখন ভিডিও প্লেব্যাক চলতে থাকে।

PiP উইন্ডোটি পর্দার উপরের স্তরে, সিস্টেম দ্বারা নির্বাচিত একটি কোণে উপস্থিত হয়।

Android 14 (API লেভেল 34) বা তার পরে চলমান সামঞ্জস্যপূর্ণ Android TV OS ডিভাইসগুলিতেও PiP সমর্থিত। যদিও অনেক মিল রয়েছে, টিভিতে PiP ব্যবহার করার সময় অতিরিক্ত বিবেচনা রয়েছে।

ব্যবহারকারীরা কিভাবে PiP উইন্ডোর সাথে ইন্টারঅ্যাক্ট করতে পারে

ব্যবহারকারীরা পিআইপি উইন্ডোটিকে অন্য স্থানে টেনে আনতে পারেন। অ্যান্ড্রয়েড 12 থেকে শুরু করে, ব্যবহারকারীরাও করতে পারেন:

  • একটি পূর্ণ-স্ক্রীন টগল, একটি বন্ধ বোতাম, একটি সেটিংস বোতাম, এবং আপনার অ্যাপ দ্বারা প্রদত্ত কাস্টম ক্রিয়াগুলি (উদাহরণস্বরূপ, প্লে নিয়ন্ত্রণ) প্রদর্শন করতে উইন্ডোটিতে একক-ট্যাপ করুন।

  • বর্তমান PiP আকার এবং সর্বাধিক বা সর্বনিম্ন PiP আকারের মধ্যে টগল করতে উইন্ডোটিকে ডবল-ট্যাপ করুন-উদাহরণস্বরূপ, একটি সর্বাধিক করা উইন্ডোকে ডবল-ট্যাপ করা এটিকে ছোট করে, এবং কথোপকথনটিও সত্য।

  • জানালাটিকে বাম বা ডান প্রান্তে টেনে টেনে লুকিয়ে রাখুন। উইন্ডোটি আনস্ট্যাশ করতে, হয় লুকিয়ে রাখা উইন্ডোর দৃশ্যমান অংশে আলতো চাপুন বা এটি টেনে আনুন।

  • পিঞ্চ-টু-জুম ব্যবহার করে PiP উইন্ডোর আকার পরিবর্তন করুন।

আপনার অ্যাপ নিয়ন্ত্রণ করে যখন বর্তমান কার্যকলাপ PiP মোডে প্রবেশ করে। এখানে কিছু উদাহরণ আছে:

  • ব্যবহারকারী যখন হোম বোতামে ট্যাপ করেন বা হোম পর্যন্ত সোয়াইপ করেন তখন একটি কার্যকলাপ PiP মোডে প্রবেশ করতে পারে। এইভাবে Google মানচিত্র নির্দেশনা প্রদর্শন করতে থাকে যখন ব্যবহারকারী একই সময়ে অন্য একটি কার্যকলাপ চালায়।

  • ব্যবহারকারী অন্যান্য বিষয়বস্তু ব্রাউজ করতে ভিডিও থেকে ফিরে নেভিগেট করলে আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে স্থানান্তর করতে পারে।

  • আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে পরিবর্তন করতে পারে যখন একজন ব্যবহারকারী বিষয়বস্তুর একটি পর্বের শেষ দেখেন। মূল পর্দা সিরিজের পরবর্তী পর্ব সম্পর্কে প্রচারমূলক বা সারসংক্ষেপ তথ্য প্রদর্শন করে।

  • আপনার অ্যাপ ব্যবহারকারীদের একটি ভিডিও দেখার সময় অতিরিক্ত সামগ্রী সারিবদ্ধ করার একটি উপায় প্রদান করতে পারে। ভিডিওটি PiP মোডে চলতে থাকে যখন প্রধান স্ক্রীন একটি বিষয়বস্তু নির্বাচন কার্যকলাপ প্রদর্শন করে।

PiP সমর্থন ঘোষণা করুন

ডিফল্টরূপে, সিস্টেম স্বয়ংক্রিয়ভাবে অ্যাপগুলির জন্য PiP সমর্থন করে না। আপনি যদি আপনার অ্যাপে PiP সমর্থন করতে চান, true android:supportsPictureInPicture সেট করে আপনার ম্যানিফেস্টে আপনার ভিডিও কার্যকলাপ নিবন্ধন করুন। এছাড়াও, নির্দিষ্ট করুন যে আপনার কার্যকলাপ লেআউট কনফিগারেশন পরিবর্তনগুলি পরিচালনা করে যাতে PiP মোড পরিবর্তনের সময় লেআউট পরিবর্তনগুলি ঘটলে আপনার কার্যকলাপ পুনরায় চালু না হয়।

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

আপনার কার্যকলাপকে PiP-এ স্যুইচ করুন

Android 12 দিয়ে শুরু করে, আপনি setAutoEnterEnabled পতাকাটিকে true সেট করে PiP মোডে আপনার কার্যকলাপ স্যুইচ করতে পারেন। এই সেটিং দিয়ে, onUserLeaveHintenterPictureInPictureMode() স্পষ্টভাবে কল না করেই প্রয়োজন অনুযায়ী একটি কার্যকলাপ স্বয়ংক্রিয়ভাবে PiP মোডে স্যুইচ করে। এবং এটি অনেক মসৃণ রূপান্তর প্রদানের অতিরিক্ত সুবিধা রয়েছে। বিশদ বিবরণের জন্য, অঙ্গভঙ্গি নেভিগেশন থেকে পিআইপি মোডে রূপান্তরগুলিকে মসৃণ করুন দেখুন৷

আপনি যদি অ্যান্ড্রয়েড 11 বা তার নিচের সংস্করণকে টার্গেট করেন, তাহলে PiP মোডে স্যুইচ করতে একটি অ্যাক্টিভিটি অবশ্যই enterPictureInPictureMode() কল করতে হবে। উদাহরণস্বরূপ, ব্যবহারকারী যখন অ্যাপের UI-তে একটি ডেডিকেটেড বোতামে ক্লিক করেন তখন নিম্নলিখিত কোডটি একটি কার্যকলাপকে PiP মোডে স্যুইচ করে:

কোটলিন

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

জাভা

@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

আপনি যুক্তি অন্তর্ভুক্ত করতে চাইতে পারেন যা ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে একটি কার্যকলাপকে পিআইপি মোডে পরিবর্তন করে। উদাহরণস্বরূপ, অ্যাপটি নেভিগেট করার সময় ব্যবহারকারী হোম বা সাম্প্রতিক বোতাম টিপলে Google মানচিত্র PiP মোডে স্যুইচ করে। আপনি onUserLeaveHint() ওভাররাইড করে এই কেসটি ধরতে পারেন:

কোটলিন

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

জাভা

@Override
public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode();
    }
}

প্রস্তাবিত: ব্যবহারকারীদের একটি পালিশ PiP রূপান্তর অভিজ্ঞতা প্রদান করুন

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

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

এই পরিবর্তন নিম্নলিখিত জড়িত.

  • অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে স্থানান্তরগুলিকে মসৃণ করা
  • PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করা হচ্ছে
  • অ-ভিডিও বিষয়বস্তুর জন্য বিরামবিহীন আকার পরিবর্তন অক্ষম করা হচ্ছে

একটি পলিশড ট্রানজিশন অভিজ্ঞতা সক্ষম করার জন্য রেফারেন্স হিসাবে Android Kotlin PictureInPicture নমুনা দেখুন।

অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে রূপান্তরগুলিকে মসৃণ করুন৷

Android 12 থেকে শুরু করে, setAutoEnterEnabled পতাকা অঙ্গভঙ্গি নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও সামগ্রীতে রূপান্তর করার জন্য অনেক মসৃণ অ্যানিমেশন প্রদান করে—উদাহরণস্বরূপ, ফুলস্ক্রিন থেকে বাড়িতে সোয়াইপ করার সময়।

এই পরিবর্তন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন এবং একটি রেফারেন্সের জন্য এই নমুনাটি দেখুন:

  1. PictureInPictureParams.Builder তৈরি করতে setAutoEnterEnabled ব্যবহার করুন:

    কোটলিন

    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())

    জাভা

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
  2. আপ-টু-ডেট PictureInPictureParams সহ setPictureInPictureParams PictureInPictureParams কে তাড়াতাড়ি কল করুন। অ্যাপটি onUserLeaveHint কলব্যাকের জন্য অপেক্ষা করে না (যেমন এটি অ্যান্ড্রয়েড 11 এ করা হতো)।

    উদাহরণ স্বরূপ, আপনি হয়ত প্রথম প্লেব্যাকে setPictureInPictureParams কল করতে চাইতে পারেন এবং যদি অ্যাসপেক্ট রেশিও পরিবর্তন করা হয় তাহলে পরবর্তী যেকোনো প্লেব্যাকে।

  3. কল setAutoEnterEnabled(false) , কিন্তু শুধুমাত্র প্রয়োজন হিসাবে। উদাহরণ স্বরূপ, বর্তমান প্লেব্যাকটি বিরতি দেওয়া অবস্থায় থাকলে আপনি সম্ভবত PiP-এ প্রবেশ করতে চান না।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করুন

Android 8.0-এ PiP-এর প্রবর্তনের সাথে শুরু করে, setSourceRectHint চিত্র-ইন-ছবিতে রূপান্তরিত হওয়ার পরে দৃশ্যমান কার্যকলাপের ক্ষেত্রটিকে নির্দেশ করে—উদাহরণস্বরূপ, ভিডিও ভিউ একটি ভিডিও প্লেয়ারে সীমাবদ্ধ।

অ্যান্ড্রয়েড 12-এর সাথে, পিআইপি মোডে প্রবেশ এবং প্রস্থান করার সময় সিস্টেমটি অনেক বেশি মসৃণ অ্যানিমেশন প্রয়োগ করতে sourceRectHint ব্যবহার করে।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য sourceRectHint সঠিকভাবে সেট করতে:

  1. sourceRectHint হিসাবে সঠিক সীমানা ব্যবহার করে PictureInPictureParams তৈরি করুন। আমরা ভিডিও প্লেয়ারের সাথে একটি লেআউট পরিবর্তন শ্রোতা সংযুক্ত করার পরামর্শ দিই:

    কোটলিন

    val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, oldLeft: Int,
            oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop:
            Int, newRight: Int, newBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)

    জাভা

    private final View.OnLayoutChangeListener mOnLayoutChangeListener =
            (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight,
            newBottom) -> {
        final Rect sourceRectHint = new Rect();
        mYourVideoView.getGlobalVisibleRect(sourceRectHint);
        final PictureInPictureParams.Builder builder =
            new PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint);
        setPictureInPictureParams(builder.build());
    };
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener);
  2. যদি প্রয়োজন হয়, সিস্টেমটি প্রস্থান পরিবর্তন শুরু করার আগে sourceRectHint আপডেট করুন। যখন সিস্টেমটি PiP মোড থেকে প্রস্থান করতে চলেছে, তখন কার্যকলাপের ভিউ হায়ারার্কি তার গন্তব্য কনফিগারেশনে (উদাহরণস্বরূপ, পূর্ণ স্ক্রীন) রাখা হয়। অ্যাপটি একটি লেআউট পরিবর্তন শ্রোতাকে এর রুট ভিউ বা টার্গেট ভিউ (যেমন ভিডিও প্লেয়ার ভিউ) এর সাথে ইভেন্ট সনাক্ত করতে এবং অ্যানিমেশন শুরু হওয়ার আগে sourceRectHint আপডেট করতে পারে।

    কোটলিন

    // Listener is called immediately after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom ->
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            val sourceRectHint = Rect()
            playerView.getGlobalVisibleRect(sourceRectHint)
            setPictureInPictureParams(
                PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build()
            )
        }
    }

    জাভা

    // Listener is called right after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener((v, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom) -> {
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            final Rect sourceRectHint = new Rect();
            playerView.getGlobalVisibleRect(sourceRectHint);
            setPictureInPictureParams(
                new PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build());
        }
    });

নন-ভিডিও বিষয়বস্তুর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করুন

Android 12 setSeamlessResizeEnabled ফ্ল্যাগ যুক্ত করে, যা PiP উইন্ডোতে নন-ভিডিও সামগ্রীর আকার পরিবর্তন করার সময় একটি অনেক মসৃণ ক্রস-ফেডিং অ্যানিমেশন প্রদান করে। পূর্বে, একটি PiP উইন্ডোতে নন-ভিডিও বিষয়বস্তুর আকার পরিবর্তন করা হলে জর্জরিং ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে।

নন-ভিডিও সামগ্রীর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করতে:

কোটলিন

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build())

জাভা

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build());

PiP চলাকালীন UI হ্যান্ডেল করুন

যখন কার্যকলাপ Picture-in-Picture (PiP) মোডে প্রবেশ করে বা প্রস্থান করে, তখন সিস্টেমটি Activity.onPictureInPictureModeChanged() বা Fragment.onPictureInPictureModeChanged() কল করে।

Android 15 এমন পরিবর্তনগুলি প্রবর্তন করে যা PiP মোডে প্রবেশ করার সময় একটি আরও মসৃণ রূপান্তর নিশ্চিত করে৷ এটি এমন অ্যাপগুলির জন্য উপকারী যেগুলির মূল UI এর উপরে UI উপাদানগুলি ওভারলেড রয়েছে, যা PiP-তে যায়৷

বিকাশকারীরা লজিক সংজ্ঞায়িত করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করে যা ওভারলেড UI উপাদানগুলির দৃশ্যমানতা টগল করে। PiP এন্টার বা এক্সিট অ্যানিমেশন সম্পন্ন হলে এই কলব্যাকটি ট্রিগার হয়। অ্যান্ড্রয়েড 15 থেকে শুরু করে, PictureInPictureUiState ক্লাসে একটি নতুন রাজ্য অন্তর্ভুক্ত রয়েছে।

এই নতুন UI অবস্থার সাথে, Android 15 টার্গেট করা অ্যাপগুলি PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথে Activity#onPictureInPictureUiStateChanged() কলব্যাক isTransitioningToPip() এর সাথে আহ্বান করা পর্যবেক্ষণ করে। এমন অনেক UI উপাদান রয়েছে যা অ্যাপটির জন্য প্রাসঙ্গিক নয় যখন এটি PiP মোডে থাকে, উদাহরণস্বরূপ, ভিউ বা লেআউট যাতে পরামর্শ, আসন্ন ভিডিও, রেটিং এবং শিরোনামের মতো তথ্য অন্তর্ভুক্ত থাকে। অ্যাপটি যখন PiP মোডে যায়, তখন এই UI উপাদানগুলি লুকানোর জন্য onPictureInPictureUiStateChanged() কলব্যাক ব্যবহার করুন। যখন অ্যাপটি PiP উইন্ডো থেকে ফুল স্ক্রিন মোডে যায়, তখন এই উপাদানগুলিকে আনহাইড করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

কোটলিন

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

অপ্রাসঙ্গিক UI উপাদানগুলির এই দ্রুত দৃশ্যমানতা টগল (একটি PiP উইন্ডোর জন্য) একটি মসৃণ এবং ফ্লিকার-মুক্ত PiP এন্টার অ্যানিমেশন নিশ্চিত করতে সহায়তা করে।

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

যদি আপনার অ্যাপকে PiP-এর জন্য কাস্টম অ্যাকশন প্রদান করতে হয়, তাহলে এই পৃষ্ঠায় নিয়ন্ত্রণ যোগ করুন দেখুন। আপনার কার্যকলাপ পিআইপিতে প্রবেশ করার আগে অন্যান্য UI উপাদানগুলি সরান এবং আপনার কার্যকলাপ আবার পূর্ণ স্ক্রীনে পরিণত হলে সেগুলি পুনরুদ্ধার করুন৷

নিয়ন্ত্রণ যোগ করুন

ব্যবহারকারী উইন্ডোর মেনু খুললে পিআইপি উইন্ডো নিয়ন্ত্রণ প্রদর্শন করতে পারে (মোবাইল ডিভাইসে উইন্ডোতে ট্যাপ করে বা টিভি রিমোট থেকে মেনু নির্বাচন করে)।

যদি একটি অ্যাপের একটি সক্রিয় মিডিয়া সেশন থাকে, তাহলে প্লে, পজ, পরবর্তী এবং পূর্ববর্তী নিয়ন্ত্রণগুলি প্রদর্শিত হবে৷

আপনি PiP মোডে প্রবেশ করার আগে PictureInPictureParams.Builder.setActions() এর সাথে PictureInPictureParams তৈরি করে স্পষ্টভাবে কাস্টম অ্যাকশনগুলি নির্দিষ্ট করতে পারেন এবং যখন আপনি enterPictureInPictureMode(android.app.PictureInPictureParams) বা setPictureInPictureParams(android.app.PictureInPictureParams) PiP মোডে প্রবেশ করেন তখন প্যারামগুলি পাস করতে পারেন। . সাবধান। যদি আপনি getMaxNumPictureInPictureActions() এর চেয়ে বেশি যোগ করার চেষ্টা করেন, আপনি শুধুমাত্র সর্বোচ্চ নম্বর পাবেন।

PiP-এ থাকাকালীন ভিডিও প্লেব্যাক চালিয়ে যাওয়া

যখন আপনার অ্যাক্টিভিটি পিআইপি-তে চলে যায়, তখন সিস্টেম অ্যাক্টিভিটিটিকে পজ করা অবস্থায় রাখে এবং অ্যাক্টিভিটির onPause() পদ্ধতিকে কল করে। ভিডিও প্লেব্যাক পজ করা উচিত নয় এবং এর পরিবর্তে বাজানো চালিয়ে যাওয়া উচিত যদি পিআইপি মোডে স্থানান্তর করার সময় কার্যকলাপ বিরাম দেওয়া হয়।

অ্যান্ড্রয়েড 7.0 এবং পরবর্তীতে, যখন সিস্টেম আপনার কার্যকলাপের onStop() এবং onStart() কল করে তখন আপনার ভিডিও প্লেব্যাককে বিরতি দেওয়া এবং পুনরায় শুরু করা উচিত৷ এটি করার মাধ্যমে, আপনি আপনার অ্যাপটি onPause() এ PiP মোডে আছে কিনা তা পরীক্ষা করা এবং স্পষ্টভাবে প্লেব্যাক চালিয়ে যাওয়া এড়াতে পারেন।

আপনি যদি setAutoEnterEnabled পতাকাটিকে true হিসাবে সেট না করে থাকেন এবং আপনার onPause() বাস্তবায়নে প্লেব্যাককে বিরতি দিতে হবে, isInPictureInPictureMode() কল করে PiP মোড পরীক্ষা করুন এবং যথাযথভাবে প্লেব্যাক পরিচালনা করুন৷ যেমন:

কোটলিন

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode) {
        // Continue playback.
    } else {
        // Use existing playback logic for paused activity behavior.
    }
}

জাভা

@Override
public void onPause() {
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode()) {
        // Continue playback.
        ...
    } else {
        // Use existing playback logic for paused activity behavior.
        ...
    }
}

যখন আপনার ক্রিয়াকলাপ PiP মোড থেকে পূর্ণ-স্ক্রীন মোডে ফিরে আসে, তখন সিস্টেমটি আপনার কার্যকলাপ পুনরায় শুরু করে এবং আপনার onResume() পদ্ধতিতে কল করে।

PiP এর জন্য একটি একক প্লেব্যাক কার্যকলাপ ব্যবহার করুন

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

ভিডিও প্লেব্যাক অনুরোধের জন্য একটি একক কার্যকলাপ ব্যবহার করা হয়েছে এবং প্রয়োজন অনুযায়ী PiP মোডে স্যুইচ করা হয়েছে তা নিশ্চিত করতে, আপনার ম্যানিফেস্টে কার্যকলাপের android:launchMode কে singleTask এ সেট করুন:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

আপনার কার্যকলাপে, onNewIntent() ওভাররাইড করুন এবং প্রয়োজনে বিদ্যমান ভিডিও প্লেব্যাক বন্ধ করে নতুন ভিডিও পরিচালনা করুন।

সর্বোত্তম অনুশীলন

কম RAM আছে এমন ডিভাইসগুলিতে PiP অক্ষম করা হতে পারে। আপনার অ্যাপ PiP ব্যবহার করার আগে, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) কল করে এটি উপলব্ধ কিনা তা নিশ্চিত করুন।

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

যখন একটি কার্যকলাপ PiP মোডে থাকে, ডিফল্টরূপে এটি ইনপুট ফোকাস পায় না। PiP মোডে থাকাকালীন ইনপুট ইভেন্টগুলি পেতে, MediaSession.setCallback() ব্যবহার করুন। setCallback() ব্যবহার করার বিষয়ে আরও তথ্যের জন্য একটি Now Playing কার্ড প্রদর্শন দেখুন।

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

আপনার অ্যাপ যখন PiP-এ প্রবেশ করতে চলেছে, তখন মনে রাখবেন শুধুমাত্র শীর্ষ ক্রিয়াকলাপই ছবিতে প্রবেশ করে৷ কিছু পরিস্থিতিতে যেমন মাল্টি-উইন্ডো ডিভাইসে, এটা সম্ভব যে নীচের কার্যকলাপটি এখন দেখানো হবে এবং PiP কার্যকলাপের সাথে আবার দৃশ্যমান হবে। একটি onResume() বা একটি onPause() কলব্যাক পাওয়ার নিচের কার্যকলাপ সহ আপনার সেই অনুযায়ী এই কেসটি পরিচালনা করা উচিত। এটাও সম্ভব যে ব্যবহারকারী কার্যকলাপের সাথে যোগাযোগ করতে পারে। উদাহরণস্বরূপ, যদি আপনার একটি ভিডিও তালিকা কার্যকলাপ প্রদর্শিত হয় এবং PiP মোডে ভিডিও চালানোর কার্যকলাপ থাকে, তাহলে ব্যবহারকারী তালিকা থেকে একটি নতুন ভিডিও নির্বাচন করতে পারে এবং PiP কার্যকলাপ সেই অনুযায়ী আপডেট হওয়া উচিত।

অতিরিক্ত নমুনা কোড

Kotlin-এ লেখা একটি নমুনা অ্যাপ ডাউনলোড করতে, Android PictureInPicture Sample (Kotlin) দেখুন।

,

অ্যান্ড্রয়েড 8.0 (এপিআই লেভেল 26) থেকে শুরু করে, অ্যান্ড্রয়েড পিকচার-ইন-পিকচার (পিআইপি) মোডে ক্রিয়াকলাপ চালু করার অনুমতি দেয়। PiP হল একটি বিশেষ ধরনের মাল্টি-উইন্ডো মোড যা বেশিরভাগ ভিডিও প্লেব্যাকের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীকে অ্যাপের মধ্যে নেভিগেট করার সময় বা প্রধান স্ক্রিনে সামগ্রী ব্রাউজ করার সময় স্ক্রিনের একটি কোণায় পিন করা একটি ছোট উইন্ডোতে একটি ভিডিও দেখতে দেয়।

PiP পিন করা ভিডিও ওভারলে উইন্ডো প্রদান করার জন্য Android 7.0-এ উপলব্ধ মাল্টি-উইন্ডো API-গুলি ব্যবহার করে। আপনার অ্যাপ্লিকেশানে PiP যোগ করতে, আপনাকে আপনার ক্রিয়াকলাপগুলি নিবন্ধন করতে হবে যা PiP সমর্থন করে, আপনার কার্যকলাপকে প্রয়োজন অনুসারে PiP মোডে স্যুইচ করুন এবং নিশ্চিত করুন যে UI উপাদানগুলি লুকানো আছে এবং যখন কার্যকলাপটি PiP মোডে থাকে তখন ভিডিও প্লেব্যাক চলতে থাকে।

PiP উইন্ডোটি পর্দার উপরের স্তরে, সিস্টেম দ্বারা নির্বাচিত একটি কোণে উপস্থিত হয়।

Android 14 (API লেভেল 34) বা তার পরে চলমান সামঞ্জস্যপূর্ণ Android TV OS ডিভাইসগুলিতেও PiP সমর্থিত। যদিও অনেক মিল রয়েছে, টিভিতে PiP ব্যবহার করার সময় অতিরিক্ত বিবেচনা রয়েছে।

ব্যবহারকারীরা কিভাবে PiP উইন্ডোর সাথে ইন্টারঅ্যাক্ট করতে পারে

ব্যবহারকারীরা পিআইপি উইন্ডোটিকে অন্য স্থানে টেনে আনতে পারেন। অ্যান্ড্রয়েড 12 থেকে শুরু করে, ব্যবহারকারীরাও করতে পারেন:

  • একটি পূর্ণ-স্ক্রীন টগল, একটি বন্ধ বোতাম, একটি সেটিংস বোতাম, এবং আপনার অ্যাপ দ্বারা প্রদত্ত কাস্টম ক্রিয়াগুলি (উদাহরণস্বরূপ, প্লে নিয়ন্ত্রণ) প্রদর্শন করতে উইন্ডোটিতে একক-ট্যাপ করুন।

  • বর্তমান PiP আকার এবং সর্বাধিক বা সর্বনিম্ন PiP আকারের মধ্যে টগল করতে উইন্ডোটিকে ডবল-ট্যাপ করুন-উদাহরণস্বরূপ, একটি সর্বাধিক করা উইন্ডোকে ডবল-ট্যাপ করা এটিকে ছোট করে, এবং কথোপকথনটিও সত্য।

  • জানালাটিকে বাম বা ডান প্রান্তে টেনে টেনে লুকিয়ে রাখুন। উইন্ডোটি আনস্ট্যাশ করতে, হয় লুকিয়ে রাখা উইন্ডোর দৃশ্যমান অংশে আলতো চাপুন বা এটি টেনে আনুন।

  • পিঞ্চ-টু-জুম ব্যবহার করে PiP উইন্ডোর আকার পরিবর্তন করুন।

আপনার অ্যাপ নিয়ন্ত্রণ করে যখন বর্তমান কার্যকলাপ PiP মোডে প্রবেশ করে। এখানে কিছু উদাহরণ আছে:

  • ব্যবহারকারী যখন হোম বোতামে ট্যাপ করেন বা হোম পর্যন্ত সোয়াইপ করেন তখন একটি কার্যকলাপ PiP মোডে প্রবেশ করতে পারে। এইভাবে Google মানচিত্র নির্দেশনা প্রদর্শন করতে থাকে যখন ব্যবহারকারী একই সময়ে অন্য একটি কার্যকলাপ চালায়।

  • ব্যবহারকারী অন্যান্য বিষয়বস্তু ব্রাউজ করতে ভিডিও থেকে ফিরে নেভিগেট করলে আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে স্থানান্তর করতে পারে।

  • আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে পরিবর্তন করতে পারে যখন একজন ব্যবহারকারী বিষয়বস্তুর একটি পর্বের শেষ দেখেন। মূল পর্দা সিরিজের পরবর্তী পর্ব সম্পর্কে প্রচারমূলক বা সারসংক্ষেপ তথ্য প্রদর্শন করে।

  • আপনার অ্যাপ ব্যবহারকারীদের একটি ভিডিও দেখার সময় অতিরিক্ত সামগ্রী সারিবদ্ধ করার একটি উপায় প্রদান করতে পারে। ভিডিওটি PiP মোডে চলতে থাকে যখন প্রধান স্ক্রীন একটি বিষয়বস্তু নির্বাচন কার্যকলাপ প্রদর্শন করে।

PiP সমর্থন ঘোষণা করুন

ডিফল্টরূপে, সিস্টেম স্বয়ংক্রিয়ভাবে অ্যাপগুলির জন্য PiP সমর্থন করে না। আপনি যদি আপনার অ্যাপে PiP সমর্থন করতে চান, true android:supportsPictureInPicture সেট করে আপনার ম্যানিফেস্টে আপনার ভিডিও কার্যকলাপ নিবন্ধন করুন। এছাড়াও, নির্দিষ্ট করুন যে আপনার কার্যকলাপ লেআউট কনফিগারেশন পরিবর্তনগুলি পরিচালনা করে যাতে PiP মোড পরিবর্তনের সময় লেআউট পরিবর্তনগুলি ঘটলে আপনার কার্যকলাপ পুনরায় চালু না হয়।

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

আপনার কার্যকলাপকে PiP-এ স্যুইচ করুন

Android 12 দিয়ে শুরু করে, আপনি setAutoEnterEnabled পতাকাটিকে true সেট করে PiP মোডে আপনার কার্যকলাপ স্যুইচ করতে পারেন। এই সেটিং দিয়ে, onUserLeaveHintenterPictureInPictureMode() স্পষ্টভাবে কল না করেই প্রয়োজন অনুযায়ী একটি কার্যকলাপ স্বয়ংক্রিয়ভাবে PiP মোডে স্যুইচ করে। এবং এটি অনেক মসৃণ রূপান্তর প্রদানের অতিরিক্ত সুবিধা রয়েছে। বিশদ বিবরণের জন্য, অঙ্গভঙ্গি নেভিগেশন থেকে পিআইপি মোডে রূপান্তরগুলিকে মসৃণ করুন দেখুন৷

আপনি যদি অ্যান্ড্রয়েড 11 বা তার নিচের সংস্করণগুলিকে টার্গেট করেন, তাহলে PiP মোডে স্যুইচ করতে একটি অ্যাক্টিভিটি অবশ্যই enterPictureInPictureMode() কল করতে হবে। উদাহরণস্বরূপ, ব্যবহারকারী যখন অ্যাপের UI-তে একটি ডেডিকেটেড বোতামে ক্লিক করেন তখন নিম্নলিখিত কোডটি একটি কার্যকলাপকে PiP মোডে স্যুইচ করে:

কোটলিন

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

জাভা

@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

আপনি যুক্তি অন্তর্ভুক্ত করতে চাইতে পারেন যা ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে একটি কার্যকলাপকে পিআইপি মোডে পরিবর্তন করে। উদাহরণস্বরূপ, অ্যাপটি নেভিগেট করার সময় ব্যবহারকারী হোম বা সাম্প্রতিক বোতাম টিপলে Google মানচিত্র PiP মোডে স্যুইচ করে। আপনি onUserLeaveHint() ওভাররাইড করে এই কেসটি ধরতে পারেন:

কোটলিন

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

জাভা

@Override
public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode();
    }
}

প্রস্তাবিত: ব্যবহারকারীদের একটি পালিশ PiP রূপান্তর অভিজ্ঞতা প্রদান করুন

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

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

এই পরিবর্তন নিম্নলিখিত জড়িত.

  • অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে স্থানান্তরগুলিকে মসৃণ করা
  • PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করা হচ্ছে
  • অ-ভিডিও বিষয়বস্তুর জন্য বিরামবিহীন আকার পরিবর্তন অক্ষম করা হচ্ছে

একটি পলিশড ট্রানজিশন অভিজ্ঞতা সক্ষম করার জন্য রেফারেন্স হিসাবে Android Kotlin PictureInPicture নমুনা দেখুন।

অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে রূপান্তরগুলিকে মসৃণ করুন৷

Android 12 থেকে শুরু করে, setAutoEnterEnabled পতাকা অঙ্গভঙ্গি নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও সামগ্রীতে রূপান্তর করার জন্য অনেক মসৃণ অ্যানিমেশন প্রদান করে—উদাহরণস্বরূপ, ফুলস্ক্রিন থেকে বাড়িতে সোয়াইপ করার সময়।

এই পরিবর্তন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন এবং একটি রেফারেন্সের জন্য এই নমুনাটি দেখুন:

  1. PictureInPictureParams.Builder তৈরি করতে setAutoEnterEnabled ব্যবহার করুন:

    কোটলিন

    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())

    জাভা

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
  2. আপ-টু-ডেট PictureInPictureParams সহ setPictureInPictureParams PictureInPictureParams কে তাড়াতাড়ি কল করুন। অ্যাপটি onUserLeaveHint কলব্যাকের জন্য অপেক্ষা করে না (যেমন এটি অ্যান্ড্রয়েড 11 এ করা হতো)।

    উদাহরণ স্বরূপ, আপনি হয়ত প্রথম প্লেব্যাকে setPictureInPictureParams কল করতে চাইতে পারেন এবং যদি অ্যাসপেক্ট রেশিও পরিবর্তন করা হয় তাহলে পরবর্তী যেকোনো প্লেব্যাকে।

  3. কল setAutoEnterEnabled(false) , কিন্তু শুধুমাত্র প্রয়োজন হিসাবে। উদাহরণ স্বরূপ, বর্তমান প্লেব্যাকটি বিরতি দেওয়া অবস্থায় থাকলে আপনি সম্ভবত PiP-এ প্রবেশ করতে চান না।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করুন

Android 8.0-এ PiP-এর প্রবর্তনের সাথে শুরু করে, setSourceRectHint চিত্র-ইন-ছবিতে রূপান্তরিত হওয়ার পরে দৃশ্যমান কার্যকলাপের ক্ষেত্রটিকে নির্দেশ করে—উদাহরণস্বরূপ, ভিডিও ভিউ একটি ভিডিও প্লেয়ারে সীমাবদ্ধ।

অ্যান্ড্রয়েড 12-এর সাথে, পিআইপি মোডে প্রবেশ এবং প্রস্থান করার সময় সিস্টেমটি অনেক বেশি মসৃণ অ্যানিমেশন প্রয়োগ করতে sourceRectHint ব্যবহার করে।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য sourceRectHint সঠিকভাবে সেট করতে:

  1. sourceRectHint হিসাবে সঠিক সীমানা ব্যবহার করে PictureInPictureParams তৈরি করুন। আমরা ভিডিও প্লেয়ারের সাথে একটি লেআউট পরিবর্তন শ্রোতা সংযুক্ত করার পরামর্শ দিই:

    কোটলিন

    val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, oldLeft: Int,
            oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop:
            Int, newRight: Int, newBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)

    জাভা

    private final View.OnLayoutChangeListener mOnLayoutChangeListener =
            (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight,
            newBottom) -> {
        final Rect sourceRectHint = new Rect();
        mYourVideoView.getGlobalVisibleRect(sourceRectHint);
        final PictureInPictureParams.Builder builder =
            new PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint);
        setPictureInPictureParams(builder.build());
    };
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener);
  2. যদি প্রয়োজন হয়, সিস্টেমটি প্রস্থান পরিবর্তন শুরু করার আগে sourceRectHint আপডেট করুন। যখন সিস্টেমটি PiP মোড থেকে প্রস্থান করতে চলেছে, তখন কার্যকলাপের ভিউ হায়ারার্কি তার গন্তব্য কনফিগারেশনে (উদাহরণস্বরূপ, পূর্ণ স্ক্রীন) রাখা হয়। অ্যাপটি একটি লেআউট পরিবর্তন শ্রোতাকে এর রুট ভিউ বা টার্গেট ভিউ (যেমন ভিডিও প্লেয়ার ভিউ) এর সাথে ইভেন্ট সনাক্ত করতে এবং অ্যানিমেশন শুরু হওয়ার আগে sourceRectHint আপডেট করতে পারে।

    কোটলিন

    // Listener is called immediately after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom ->
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            val sourceRectHint = Rect()
            playerView.getGlobalVisibleRect(sourceRectHint)
            setPictureInPictureParams(
                PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build()
            )
        }
    }

    জাভা

    // Listener is called right after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener((v, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom) -> {
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            final Rect sourceRectHint = new Rect();
            playerView.getGlobalVisibleRect(sourceRectHint);
            setPictureInPictureParams(
                new PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build());
        }
    });

নন-ভিডিও বিষয়বস্তুর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করুন

Android 12 setSeamlessResizeEnabled ফ্ল্যাগ যুক্ত করে, যা PiP উইন্ডোতে নন-ভিডিও সামগ্রীর আকার পরিবর্তন করার সময় একটি অনেক মসৃণ ক্রস-ফেডিং অ্যানিমেশন প্রদান করে। পূর্বে, একটি PiP উইন্ডোতে নন-ভিডিও বিষয়বস্তুর আকার পরিবর্তন করা হলে জর্জরিং ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে।

নন-ভিডিও সামগ্রীর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করতে:

কোটলিন

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build())

জাভা

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build());

PiP চলাকালীন UI হ্যান্ডেল করুন

যখন কার্যকলাপ Picture-in-Picture (PiP) মোডে প্রবেশ করে বা প্রস্থান করে, তখন সিস্টেমটি Activity.onPictureInPictureModeChanged() বা Fragment.onPictureInPictureModeChanged() কল করে।

Android 15 এমন পরিবর্তনগুলি প্রবর্তন করে যা PiP মোডে প্রবেশ করার সময় একটি আরও মসৃণ রূপান্তর নিশ্চিত করে৷ এটি এমন অ্যাপগুলির জন্য উপকারী যেগুলির মূল UI এর উপরে UI উপাদানগুলি ওভারলেড রয়েছে, যা PiP-তে যায়৷

বিকাশকারীরা লজিক সংজ্ঞায়িত করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করে যা ওভারলেড UI উপাদানগুলির দৃশ্যমানতা টগল করে। PiP এন্টার বা এক্সিট অ্যানিমেশন সম্পন্ন হলে এই কলব্যাকটি ট্রিগার হয়। অ্যান্ড্রয়েড 15 থেকে শুরু করে, PictureInPictureUiState ক্লাসে একটি নতুন রাজ্য অন্তর্ভুক্ত রয়েছে।

এই নতুন UI অবস্থার সাথে, Android 15 টার্গেট করা অ্যাপগুলি PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথে Activity#onPictureInPictureUiStateChanged() কলব্যাক isTransitioningToPip() এর সাথে আহ্বান করা পর্যবেক্ষণ করে। এমন অনেক UI উপাদান রয়েছে যা অ্যাপটির জন্য প্রাসঙ্গিক নয় যখন এটি PiP মোডে থাকে, উদাহরণস্বরূপ, ভিউ বা লেআউট যাতে পরামর্শ, আসন্ন ভিডিও, রেটিং এবং শিরোনামের মতো তথ্য অন্তর্ভুক্ত থাকে। অ্যাপটি যখন PiP মোডে যায়, তখন এই UI উপাদানগুলি লুকানোর জন্য onPictureInPictureUiStateChanged() কলব্যাক ব্যবহার করুন। যখন অ্যাপটি PiP উইন্ডো থেকে ফুল স্ক্রিন মোডে যায়, তখন এই উপাদানগুলিকে আনহাইড করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

কোটলিন

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

অপ্রাসঙ্গিক UI উপাদানগুলির এই দ্রুত দৃশ্যমানতা টগল (একটি PiP উইন্ডোর জন্য) একটি মসৃণ এবং ফ্লিকার-মুক্ত PiP এন্টার অ্যানিমেশন নিশ্চিত করতে সহায়তা করে।

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

যদি আপনার অ্যাপকে PiP-এর জন্য কাস্টম অ্যাকশন প্রদান করতে হয়, তাহলে এই পৃষ্ঠায় নিয়ন্ত্রণ যোগ করুন দেখুন। আপনার কার্যকলাপ পিআইপিতে প্রবেশ করার আগে অন্যান্য UI উপাদানগুলি সরান এবং আপনার কার্যকলাপ আবার পূর্ণ স্ক্রীনে পরিণত হলে সেগুলি পুনরুদ্ধার করুন৷

নিয়ন্ত্রণ যোগ করুন

ব্যবহারকারী উইন্ডোর মেনু খুললে পিআইপি উইন্ডো নিয়ন্ত্রণ প্রদর্শন করতে পারে (মোবাইল ডিভাইসে উইন্ডোতে ট্যাপ করে বা টিভি রিমোট থেকে মেনু নির্বাচন করে)।

যদি একটি অ্যাপের একটি সক্রিয় মিডিয়া সেশন থাকে, তাহলে প্লে, পজ, পরবর্তী এবং পূর্ববর্তী নিয়ন্ত্রণগুলি প্রদর্শিত হবে৷

আপনি PiP মোডে প্রবেশ করার আগে PictureInPictureParams.Builder.setActions() এর সাথে PictureInPictureParams তৈরি করে স্পষ্টভাবে কাস্টম অ্যাকশনগুলি নির্দিষ্ট করতে পারেন এবং যখন আপনি enterPictureInPictureMode(android.app.PictureInPictureParams) বা setPictureInPictureParams(android.app.PictureInPictureParams) PiP মোডে প্রবেশ করেন তখন প্যারামগুলি পাস করতে পারেন। . সাবধান। যদি আপনি getMaxNumPictureInPictureActions() এর চেয়ে বেশি যোগ করার চেষ্টা করেন, আপনি শুধুমাত্র সর্বোচ্চ নম্বর পাবেন।

PiP-এ থাকাকালীন ভিডিও প্লেব্যাক চালিয়ে যাওয়া

যখন আপনার অ্যাক্টিভিটি পিআইপি-তে চলে যায়, তখন সিস্টেম অ্যাক্টিভিটিটিকে পজ করা অবস্থায় রাখে এবং অ্যাক্টিভিটির onPause() পদ্ধতিকে কল করে। ভিডিও প্লেব্যাক পজ করা উচিত নয় এবং এর পরিবর্তে বাজানো চালিয়ে যাওয়া উচিত যদি পিআইপি মোডে স্থানান্তর করার সময় কার্যকলাপ বিরাম দেওয়া হয়।

অ্যান্ড্রয়েড 7.0 এবং পরবর্তীতে, যখন সিস্টেম আপনার কার্যকলাপের onStop() এবং onStart() কল করে তখন আপনার ভিডিও প্লেব্যাককে বিরতি দেওয়া এবং পুনরায় শুরু করা উচিত৷ এটি করার মাধ্যমে, আপনি আপনার অ্যাপটি onPause() এ PiP মোডে আছে কিনা তা পরীক্ষা করা এবং স্পষ্টভাবে প্লেব্যাক চালিয়ে যাওয়া এড়াতে পারেন।

আপনি যদি setAutoEnterEnabled পতাকাটিকে true হিসাবে সেট না করে থাকেন এবং আপনার onPause() বাস্তবায়নে প্লেব্যাককে বিরতি দিতে হবে, isInPictureInPictureMode() কল করে PiP মোড পরীক্ষা করুন এবং যথাযথভাবে প্লেব্যাক পরিচালনা করুন৷ যেমন:

কোটলিন

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode) {
        // Continue playback.
    } else {
        // Use existing playback logic for paused activity behavior.
    }
}

জাভা

@Override
public void onPause() {
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode()) {
        // Continue playback.
        ...
    } else {
        // Use existing playback logic for paused activity behavior.
        ...
    }
}

যখন আপনার ক্রিয়াকলাপ PiP মোড থেকে পূর্ণ-স্ক্রীন মোডে ফিরে আসে, তখন সিস্টেমটি আপনার কার্যকলাপ পুনরায় শুরু করে এবং আপনার onResume() পদ্ধতিতে কল করে।

PiP এর জন্য একটি একক প্লেব্যাক কার্যকলাপ ব্যবহার করুন

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

ভিডিও প্লেব্যাক অনুরোধের জন্য একটি একক কার্যকলাপ ব্যবহার করা হয়েছে এবং প্রয়োজন অনুযায়ী PiP মোডে স্যুইচ করা হয়েছে তা নিশ্চিত করতে, আপনার ম্যানিফেস্টে কার্যকলাপের android:launchMode কে singleTask এ সেট করুন:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

আপনার কার্যকলাপে, onNewIntent() ওভাররাইড করুন এবং প্রয়োজনে বিদ্যমান ভিডিও প্লেব্যাক বন্ধ করে নতুন ভিডিও পরিচালনা করুন।

সর্বোত্তম অনুশীলন

কম RAM আছে এমন ডিভাইসগুলিতে PiP অক্ষম করা হতে পারে। আপনার অ্যাপ PiP ব্যবহার করার আগে, hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) কল করে এটি উপলব্ধ কিনা তা নিশ্চিত করুন।

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

যখন একটি কার্যকলাপ PiP মোডে থাকে, ডিফল্টরূপে এটি ইনপুট ফোকাস পায় না। PiP মোডে থাকাকালীন ইনপুট ইভেন্টগুলি পেতে, MediaSession.setCallback() ব্যবহার করুন। setCallback() ব্যবহার করার বিষয়ে আরও তথ্যের জন্য একটি Now Playing কার্ড প্রদর্শন দেখুন।

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

আপনার অ্যাপ যখন PiP-এ প্রবেশ করতে চলেছে, তখন মনে রাখবেন শুধুমাত্র শীর্ষ ক্রিয়াকলাপই ছবিতে প্রবেশ করে৷ কিছু পরিস্থিতিতে যেমন মাল্টি-উইন্ডো ডিভাইসে, এটা সম্ভব যে নীচের কার্যকলাপটি এখন দেখানো হবে এবং PiP কার্যকলাপের সাথে আবার দৃশ্যমান হবে। একটি onResume() বা একটি onPause() কলব্যাক পাওয়ার নিচের কার্যকলাপ সহ আপনার সেই অনুযায়ী এই কেসটি পরিচালনা করা উচিত। এটাও সম্ভব যে ব্যবহারকারী কার্যকলাপের সাথে যোগাযোগ করতে পারে। উদাহরণস্বরূপ, যদি আপনার একটি ভিডিও তালিকা কার্যকলাপ প্রদর্শিত হয় এবং PiP মোডে ভিডিও চালানোর কার্যকলাপ থাকে, তাহলে ব্যবহারকারী তালিকা থেকে একটি নতুন ভিডিও নির্বাচন করতে পারে এবং PiP কার্যকলাপ সেই অনুযায়ী আপডেট হওয়া উচিত।

অতিরিক্ত নমুনা কোড

Kotlin-এ লেখা একটি নমুনা অ্যাপ ডাউনলোড করতে, Android PictureInPicture Sample (Kotlin) দেখুন।

,

অ্যান্ড্রয়েড 8.0 (এপিআই লেভেল 26) থেকে শুরু করে, অ্যান্ড্রয়েড পিকচার-ইন-পিকচার (পিআইপি) মোডে ক্রিয়াকলাপ চালু করার অনুমতি দেয়। PiP হল একটি বিশেষ ধরনের মাল্টি-উইন্ডো মোড যা বেশিরভাগ ভিডিও প্লেব্যাকের জন্য ব্যবহৃত হয়। এটি ব্যবহারকারীকে অ্যাপের মধ্যে নেভিগেট করার সময় বা প্রধান স্ক্রিনে সামগ্রী ব্রাউজ করার সময় স্ক্রিনের একটি কোণায় পিন করা একটি ছোট উইন্ডোতে একটি ভিডিও দেখতে দেয়।

PiP পিন করা ভিডিও ওভারলে উইন্ডো প্রদান করার জন্য Android 7.0-এ উপলব্ধ মাল্টি-উইন্ডো API-গুলি ব্যবহার করে। আপনার অ্যাপ্লিকেশানে PiP যোগ করতে, আপনাকে আপনার ক্রিয়াকলাপগুলি নিবন্ধন করতে হবে যা PiP সমর্থন করে, আপনার কার্যকলাপকে প্রয়োজন অনুসারে PiP মোডে স্যুইচ করুন এবং নিশ্চিত করুন যে UI উপাদানগুলি লুকানো আছে এবং যখন কার্যকলাপটি PiP মোডে থাকে তখন ভিডিও প্লেব্যাক চলতে থাকে।

PiP উইন্ডোটি পর্দার উপরের স্তরে, সিস্টেম দ্বারা নির্বাচিত একটি কোণে উপস্থিত হয়।

Android 14 (API লেভেল 34) বা তার পরে চলমান সামঞ্জস্যপূর্ণ Android TV OS ডিভাইসগুলিতেও PiP সমর্থিত। যদিও অনেক মিল রয়েছে, টিভিতে PiP ব্যবহার করার সময় অতিরিক্ত বিবেচনা রয়েছে।

ব্যবহারকারীরা কিভাবে PiP উইন্ডোর সাথে ইন্টারঅ্যাক্ট করতে পারে

ব্যবহারকারীরা পিআইপি উইন্ডোটিকে অন্য স্থানে টেনে আনতে পারেন। অ্যান্ড্রয়েড 12 থেকে শুরু করে, ব্যবহারকারীরাও করতে পারেন:

  • একটি পূর্ণ-স্ক্রীন টগল, একটি বন্ধ বোতাম, একটি সেটিংস বোতাম, এবং আপনার অ্যাপ দ্বারা প্রদত্ত কাস্টম ক্রিয়াগুলি (উদাহরণস্বরূপ, প্লে নিয়ন্ত্রণ) প্রদর্শন করতে উইন্ডোটিতে একক-ট্যাপ করুন।

  • বর্তমান PiP আকার এবং সর্বাধিক বা সর্বনিম্ন PiP আকারের মধ্যে টগল করতে উইন্ডোটিকে ডবল-ট্যাপ করুন-উদাহরণস্বরূপ, একটি সর্বাধিক করা উইন্ডোকে ডবল-ট্যাপ করা এটিকে ছোট করে, এবং কথোপকথনটিও সত্য।

  • জানালাটিকে বাম বা ডান প্রান্তে টেনে টেনে লুকিয়ে রাখুন। উইন্ডোটি আনস্ট্যাশ করতে, হয় লুকিয়ে রাখা উইন্ডোর দৃশ্যমান অংশে আলতো চাপুন বা এটি টেনে আনুন।

  • পিঞ্চ-টু-জুম ব্যবহার করে PiP উইন্ডোর আকার পরিবর্তন করুন।

আপনার অ্যাপ নিয়ন্ত্রণ করে যখন বর্তমান কার্যকলাপ PiP মোডে প্রবেশ করে। এখানে কিছু উদাহরণ আছে:

  • ব্যবহারকারী যখন হোম বোতামে ট্যাপ করেন বা হোম পর্যন্ত সোয়াইপ করেন তখন একটি কার্যকলাপ PiP মোডে প্রবেশ করতে পারে। এইভাবে Google মানচিত্র নির্দেশনা প্রদর্শন করতে থাকে যখন ব্যবহারকারী একই সময়ে অন্য একটি কার্যকলাপ চালায়।

  • ব্যবহারকারী অন্যান্য বিষয়বস্তু ব্রাউজ করতে ভিডিও থেকে ফিরে নেভিগেট করলে আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে স্থানান্তর করতে পারে।

  • আপনার অ্যাপটি একটি ভিডিওকে PiP মোডে পরিবর্তন করতে পারে যখন একজন ব্যবহারকারী বিষয়বস্তুর একটি পর্বের শেষ দেখেন। মূল পর্দা সিরিজের পরবর্তী পর্ব সম্পর্কে প্রচারমূলক বা সারসংক্ষেপ তথ্য প্রদর্শন করে।

  • আপনার অ্যাপ ব্যবহারকারীদের একটি ভিডিও দেখার সময় অতিরিক্ত সামগ্রী সারিবদ্ধ করার একটি উপায় প্রদান করতে পারে। ভিডিওটি PiP মোডে চলতে থাকে যখন প্রধান স্ক্রীন একটি বিষয়বস্তু নির্বাচন কার্যকলাপ প্রদর্শন করে।

PiP সমর্থন ঘোষণা করুন

ডিফল্টরূপে, সিস্টেম স্বয়ংক্রিয়ভাবে অ্যাপগুলির জন্য PiP সমর্থন করে না। আপনি যদি আপনার অ্যাপে PiP সমর্থন করতে চান, true android:supportsPictureInPicture সেট করে আপনার ম্যানিফেস্টে আপনার ভিডিও কার্যকলাপ নিবন্ধন করুন। এছাড়াও, নির্দিষ্ট করুন যে আপনার কার্যকলাপ লেআউট কনফিগারেশন পরিবর্তনগুলি পরিচালনা করে যাতে PiP মোড পরিবর্তনের সময় লেআউট পরিবর্তনগুলি ঘটলে আপনার কার্যকলাপ পুনরায় চালু না হয়।

<activity android:name="VideoActivity"
    android:supportsPictureInPicture="true"
    android:configChanges=
        "screenSize|smallestScreenSize|screenLayout|orientation"
    ...

আপনার কার্যকলাপকে PiP-এ স্যুইচ করুন

Android 12 দিয়ে শুরু করে, আপনি setAutoEnterEnabled পতাকাটিকে true সেট করে PiP মোডে আপনার কার্যকলাপ স্যুইচ করতে পারেন। এই সেটিং দিয়ে, onUserLeaveHintenterPictureInPictureMode() স্পষ্টভাবে কল না করেই প্রয়োজন অনুযায়ী একটি কার্যকলাপ স্বয়ংক্রিয়ভাবে PiP মোডে স্যুইচ করে। এবং এটি অনেক মসৃণ রূপান্তর প্রদানের অতিরিক্ত সুবিধা রয়েছে। বিশদ বিবরণের জন্য, অঙ্গভঙ্গি নেভিগেশন থেকে পিআইপি মোডে রূপান্তরগুলিকে মসৃণ করুন দেখুন৷

আপনি যদি অ্যান্ড্রয়েড 11 বা তার নিচের সংস্করণকে টার্গেট করেন, তাহলে PiP মোডে স্যুইচ করতে একটি অ্যাক্টিভিটি অবশ্যই enterPictureInPictureMode() কল করতে হবে। উদাহরণস্বরূপ, ব্যবহারকারী যখন অ্যাপের UI-তে একটি ডেডিকেটেড বোতামে ক্লিক করেন তখন নিম্নলিখিত কোডটি একটি কার্যকলাপকে PiP মোডে স্যুইচ করে:

কোটলিন

override fun onActionClicked(action: Action) {
    if (action.id.toInt() == R.id.lb_control_picture_in_picture) {
        activity?.enterPictureInPictureMode()
        return
    }
}

জাভা

@Override
public void onActionClicked(Action action) {
    if (action.getId() == R.id.lb_control_picture_in_picture) {
        getActivity().enterPictureInPictureMode();
        return;
    }
    ...
}

আপনি যুক্তি অন্তর্ভুক্ত করতে চাইতে পারেন যা ব্যাকগ্রাউন্ডে যাওয়ার পরিবর্তে একটি কার্যকলাপকে পিআইপি মোডে পরিবর্তন করে। উদাহরণস্বরূপ, অ্যাপটি নেভিগেট করার সময় ব্যবহারকারী হোম বা সাম্প্রতিক বোতাম টিপলে Google মানচিত্র PiP মোডে স্যুইচ করে। আপনি onUserLeaveHint() ওভাররাইড করে এই কেসটি ধরতে পারেন:

কোটলিন

override fun onUserLeaveHint() {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode()
    }
}

জাভা

@Override
public void onUserLeaveHint () {
    if (iWantToBeInPipModeNow()) {
        enterPictureInPictureMode();
    }
}

প্রস্তাবিত: ব্যবহারকারীদের একটি পালিশ PiP রূপান্তর অভিজ্ঞতা প্রদান করুন

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

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

এই পরিবর্তন নিম্নলিখিত জড়িত.

  • অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে স্থানান্তরগুলিকে মসৃণ করা
  • PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করা হচ্ছে
  • অ-ভিডিও বিষয়বস্তুর জন্য বিরামবিহীন আকার পরিবর্তন অক্ষম করা হচ্ছে

একটি পলিশড ট্রানজিশন অভিজ্ঞতা সক্ষম করার জন্য রেফারেন্স হিসাবে Android Kotlin PictureInPicture নমুনা দেখুন।

অঙ্গভঙ্গি নেভিগেশন থেকে PiP মোডে রূপান্তরগুলিকে মসৃণ করুন৷

Android 12 থেকে শুরু করে, setAutoEnterEnabled পতাকা অঙ্গভঙ্গি নেভিগেশন ব্যবহার করে PiP মোডে ভিডিও সামগ্রীতে রূপান্তর করার জন্য অনেক মসৃণ অ্যানিমেশন প্রদান করে—উদাহরণস্বরূপ, ফুলস্ক্রিন থেকে বাড়িতে সোয়াইপ করার সময়।

এই পরিবর্তন করতে নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন এবং একটি রেফারেন্সের জন্য এই নমুনাটি দেখুন:

  1. PictureInPictureParams.Builder তৈরি করতে setAutoEnterEnabled ব্যবহার করুন:

    কোটলিন

    setPictureInPictureParams(PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build())

    জাভা

    setPictureInPictureParams(new PictureInPictureParams.Builder()
        .setAspectRatio(aspectRatio)
        .setSourceRectHint(sourceRectHint)
        .setAutoEnterEnabled(true)
        .build());
  2. আপ-টু-ডেট PictureInPictureParams সহ setPictureInPictureParams PictureInPictureParams কে তাড়াতাড়ি কল করুন। অ্যাপটি onUserLeaveHint কলব্যাকের জন্য অপেক্ষা করে না (যেমন এটি অ্যান্ড্রয়েড 11 এ করা হতো)।

    উদাহরণ স্বরূপ, আপনি হয়ত প্রথম প্লেব্যাকে setPictureInPictureParams কল করতে চাইতে পারেন এবং যদি অ্যাসপেক্ট রেশিও পরিবর্তন করা হয় তাহলে পরবর্তী যেকোনো প্লেব্যাকে।

  3. কল setAutoEnterEnabled(false) , কিন্তু শুধুমাত্র প্রয়োজন হিসাবে। উদাহরণ স্বরূপ, বর্তমান প্লেব্যাকটি বিরতি দেওয়া অবস্থায় থাকলে আপনি সম্ভবত PiP-এ প্রবেশ করতে চান না।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য একটি সঠিক sourceRectHint সেট করুন

Android 8.0-এ PiP-এর প্রবর্তনের সাথে শুরু করে, setSourceRectHint চিত্র-ইন-ছবিতে রূপান্তরিত হওয়ার পরে দৃশ্যমান কার্যকলাপের ক্ষেত্রটিকে নির্দেশ করে—উদাহরণস্বরূপ, ভিডিও ভিউ একটি ভিডিও প্লেয়ারে সীমাবদ্ধ।

অ্যান্ড্রয়েড 12-এর সাথে, পিআইপি মোডে প্রবেশ এবং প্রস্থান করার সময় সিস্টেমটি অনেক বেশি মসৃণ অ্যানিমেশন প্রয়োগ করতে sourceRectHint ব্যবহার করে।

PiP মোডে প্রবেশ এবং প্রস্থান করার জন্য sourceRectHint সঠিকভাবে সেট করতে:

  1. sourceRectHint হিসাবে সঠিক সীমানা ব্যবহার করে PictureInPictureParams তৈরি করুন। আমরা ভিডিও প্লেয়ারের সাথে একটি লেআউট পরিবর্তন শ্রোতা সংযুক্ত করার পরামর্শ দিই:

    কোটলিন

    val mOnLayoutChangeListener =
    OnLayoutChangeListener { v: View?, oldLeft: Int,
            oldTop: Int, oldRight: Int, oldBottom: Int, newLeft: Int, newTop:
            Int, newRight: Int, newBottom: Int ->
        val sourceRectHint = Rect()
        mYourVideoView.getGlobalVisibleRect(sourceRectHint)
        val builder = PictureInPictureParams.Builder()
            .setSourceRectHint(sourceRectHint)
        setPictureInPictureParams(builder.build())
    }
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener)

    জাভা

    private final View.OnLayoutChangeListener mOnLayoutChangeListener =
            (v, oldLeft, oldTop, oldRight, oldBottom, newLeft, newTop, newRight,
            newBottom) -> {
        final Rect sourceRectHint = new Rect();
        mYourVideoView.getGlobalVisibleRect(sourceRectHint);
        final PictureInPictureParams.Builder builder =
            new PictureInPictureParams.Builder()
                .setSourceRectHint(sourceRectHint);
        setPictureInPictureParams(builder.build());
    };
    
    mYourVideoView.addOnLayoutChangeListener(mOnLayoutChangeListener);
  2. যদি প্রয়োজন হয়, সিস্টেমটি প্রস্থান পরিবর্তন শুরু করার আগে sourceRectHint আপডেট করুন। যখন সিস্টেমটি PiP মোড থেকে প্রস্থান করতে চলেছে, তখন কার্যকলাপের ভিউ হায়ারার্কি তার গন্তব্য কনফিগারেশনে (উদাহরণস্বরূপ, পূর্ণ স্ক্রীন) রাখা হয়। অ্যাপটি একটি লেআউট পরিবর্তন শ্রোতাকে এর রুট ভিউ বা টার্গেট ভিউ (যেমন ভিডিও প্লেয়ার ভিউ) এর সাথে ইভেন্ট সনাক্ত করতে এবং অ্যানিমেশন শুরু হওয়ার আগে sourceRectHint আপডেট করতে পারে।

    কোটলিন

    // Listener is called immediately after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener { _, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom ->
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            val sourceRectHint = Rect()
            playerView.getGlobalVisibleRect(sourceRectHint)
            setPictureInPictureParams(
                PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build()
            )
        }
    }

    জাভা

    // Listener is called right after the user exits PiP but before animating.
    playerView.addOnLayoutChangeListener((v, left, top, right, bottom,
                        oldLeft, oldTop, oldRight, oldBottom) -> {
        if (left != oldLeft
            || right != oldRight
            || top != oldTop
            || bottom != oldBottom) {
            // The playerView's bounds changed, update the source hint rect to
            // reflect its new bounds.
            final Rect sourceRectHint = new Rect();
            playerView.getGlobalVisibleRect(sourceRectHint);
            setPictureInPictureParams(
                new PictureInPictureParams.Builder()
                    .setSourceRectHint(sourceRectHint)
                    .build());
        }
    });

নন-ভিডিও বিষয়বস্তুর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করুন

Android 12 setSeamlessResizeEnabled ফ্ল্যাগ যুক্ত করে, যা PiP উইন্ডোতে নন-ভিডিও সামগ্রীর আকার পরিবর্তন করার সময় একটি অনেক মসৃণ ক্রস-ফেডিং অ্যানিমেশন প্রদান করে। পূর্বে, একটি PiP উইন্ডোতে নন-ভিডিও বিষয়বস্তুর আকার পরিবর্তন করা হলে জর্জরিং ভিজ্যুয়াল আর্টিফ্যাক্ট তৈরি হতে পারে।

নন-ভিডিও সামগ্রীর জন্য বিরামহীন আকার পরিবর্তন অক্ষম করতে:

কোটলিন

setPictureInPictureParams(PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build())

জাভা

setPictureInPictureParams(new PictureInPictureParams.Builder()
    .setSeamlessResizeEnabled(false)
    .build());

PiP চলাকালীন UI হ্যান্ডেল করুন

যখন কার্যকলাপ Picture-in-Picture (PiP) মোডে প্রবেশ করে বা প্রস্থান করে, তখন সিস্টেমটি Activity.onPictureInPictureModeChanged() বা Fragment.onPictureInPictureModeChanged() কল করে।

Android 15 এমন পরিবর্তনগুলি প্রবর্তন করে যা PiP মোডে প্রবেশ করার সময় একটি আরও মসৃণ রূপান্তর নিশ্চিত করে৷ এটি এমন অ্যাপগুলির জন্য উপকারী যেগুলির মূল UI এর উপরে UI উপাদানগুলি ওভারলেড রয়েছে, যা PiP-তে যায়৷

বিকাশকারীরা লজিক সংজ্ঞায়িত করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করে যা ওভারলেড UI উপাদানগুলির দৃশ্যমানতা টগল করে। PiP এন্টার বা এক্সিট অ্যানিমেশন সম্পন্ন হলে এই কলব্যাকটি ট্রিগার হয়। অ্যান্ড্রয়েড 15 থেকে শুরু করে, PictureInPictureUiState ক্লাসে একটি নতুন রাজ্য অন্তর্ভুক্ত রয়েছে।

এই নতুন UI অবস্থার সাথে, Android 15 টার্গেট করা অ্যাপগুলি PiP অ্যানিমেশন শুরু হওয়ার সাথে সাথে Activity#onPictureInPictureUiStateChanged() কলব্যাক isTransitioningToPip() এর সাথে আহ্বান করা পর্যবেক্ষণ করে। এমন অনেক UI উপাদান রয়েছে যা অ্যাপটির জন্য প্রাসঙ্গিক নয় যখন এটি PiP মোডে থাকে, উদাহরণস্বরূপ, ভিউ বা লেআউট যাতে পরামর্শ, আসন্ন ভিডিও, রেটিং এবং শিরোনামের মতো তথ্য অন্তর্ভুক্ত থাকে। অ্যাপটি যখন PiP মোডে যায়, তখন এই UI উপাদানগুলি লুকানোর জন্য onPictureInPictureUiStateChanged() কলব্যাক ব্যবহার করুন। যখন অ্যাপটি PiP উইন্ডো থেকে ফুল স্ক্রিন মোডে যায়, তখন এই উপাদানগুলিকে আনহাইড করতে onPictureInPictureModeChanged() কলব্যাক ব্যবহার করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

কোটলিন

override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureUiStateChanged(PictureInPictureUiState pipState) {
        if (pipState.isTransitioningToPip()) {
          // Hide UI elements.
        }
    }

কোটলিন

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

জাভা

@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
        if (isInPictureInPictureMode) {
          // Unhide UI elements.
        }
    }

অপ্রাসঙ্গিক ইউআই উপাদানগুলির এই দ্রুত দৃশ্যমানতা টগল (একটি পিআইপি উইন্ডোর জন্য) একটি মসৃণ এবং ঝাঁকুনির মুক্ত পিআইপি প্রবেশ অ্যানিমেশন নিশ্চিত করতে সহায়তা করে।

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

যদি আপনার অ্যাপ্লিকেশনটিকে পিআইপি -র জন্য কাস্টম ক্রিয়া সরবরাহ করা প্রয়োজন, তবে এই পৃষ্ঠায় নিয়ন্ত্রণ যুক্ত করুন। আপনার ক্রিয়াকলাপ পিআইপিতে প্রবেশের আগে অন্যান্য ইউআই উপাদানগুলি সরিয়ে ফেলুন এবং যখন আপনার ক্রিয়াকলাপটি আবার পুরো স্ক্রিন হয়ে যায় তখন সেগুলি পুনরুদ্ধার করুন।

নিয়ন্ত্রণ যোগ করুন

পিআইপি উইন্ডোটি নিয়ন্ত্রণগুলি প্রদর্শন করতে পারে যখন ব্যবহারকারী উইন্ডোটির মেনুটি খুলবে (কোনও মোবাইল ডিভাইসে উইন্ডোটি আলতো চাপিয়ে, বা টিভি রিমোট থেকে মেনুটি নির্বাচন করে))

যদি কোনও অ্যাপ্লিকেশনটিতে একটি সক্রিয় মিডিয়া সেশন থাকে, তবে খেলুন, বিরতি দিন, পরবর্তী এবং পূর্ববর্তী নিয়ন্ত্রণগুলি উপস্থিত হবে।

আপনি পিআইপি মোডে প্রবেশের আগে PictureInPictureParams.Builder.setActions() দিয়ে PictureInPictureParams তৈরি করে স্পষ্টভাবে কাস্টম ক্রিয়াগুলি নির্দিষ্ট করতে পারেন, এবং আপনি যখন enterPictureInPictureMode(android.app.PictureInPictureParams) ব্যবহার করে পিআইপি মোডে প্রবেশ করেন setPictureInPictureParams(android.app.PictureInPictureParams) . সাবধান। আপনি যদি getMaxNumPictureInPictureActions() এর চেয়ে বেশি যুক্ত করার চেষ্টা করেন তবে আপনি কেবল সর্বাধিক সংখ্যা পাবেন।

পিআইপি -তে থাকাকালীন ভিডিও প্লেব্যাক চালিয়ে যাওয়া

যখন আপনার ক্রিয়াকলাপ পিআইপি -তে স্যুইচ করে, সিস্টেমটি ক্রিয়াকলাপটি বিরতিযুক্ত অবস্থায় রাখে এবং ক্রিয়াকলাপের onPause() পদ্ধতিটিকে কল করে। ভিডিও প্লেব্যাক বিরতি দেওয়া উচিত নয় এবং পরিবর্তে পিআইপি মোডে স্থানান্তরিত করার সময় ক্রিয়াকলাপটি বিরতি দেওয়া হলে খেলতে চালিয়ে যাওয়া উচিত।

অ্যান্ড্রয়েড .0.০ এবং তারপরে, সিস্টেমটি যখন আপনার ক্রিয়াকলাপের onStop() এবং onStart() কল করে তখন আপনার ভিডিও প্লেব্যাকটি বিরতি দেওয়া এবং পুনরায় শুরু করা উচিত। এটি করার মাধ্যমে, আপনি আপনার অ্যাপ্লিকেশনটি onPause() এ পিআইপি মোডে আছেন কিনা তা পরীক্ষা করে দেখতে এবং স্পষ্টভাবে প্লেব্যাক চালিয়ে যেতে পারেন।

আপনি যদি setAutoEnterEnabled পতাকাটি true সেট না করে থাকেন এবং আপনার onPause() বাস্তবায়নে আপনাকে প্লেব্যাক বিরতি দিতে হবে, তবে isInPictureInPictureMode() কে কল করে পিআইপি মোডের জন্য চেক করুন এবং যথাযথভাবে প্লেব্যাক পরিচালনা করুন। যেমন:

কোটলিন

override fun onPause() {
    super.onPause()
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode) {
        // Continue playback.
    } else {
        // Use existing playback logic for paused activity behavior.
    }
}

জাভা

@Override
public void onPause() {
    // If called while in PiP mode, do not pause playback.
    if (isInPictureInPictureMode()) {
        // Continue playback.
        ...
    } else {
        // Use existing playback logic for paused activity behavior.
        ...
    }
}

যখন আপনার ক্রিয়াকলাপটি পিআইপি মোডের বাইরে চলে যায় পূর্ণ-স্ক্রিন মোডে ফিরে আসে, সিস্টেমটি আপনার ক্রিয়াকলাপটি পুনরায় শুরু করে এবং আপনার onResume() পদ্ধতিটি কল করে।

পিআইপি জন্য একটি একক প্লেব্যাক ক্রিয়াকলাপ ব্যবহার করুন

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

ভিডিও প্লেব্যাক অনুরোধগুলির জন্য একটি একক ক্রিয়াকলাপ ব্যবহার করা হয়েছে এবং প্রয়োজন অনুসারে পিআইপি মোডে বা বাইরে স্যুইচ করা হয়েছে তা নিশ্চিত করার জন্য, ক্রিয়াকলাপটির android:launchMode সেট করুন: আপনার ম্যানিফেস্টে singleTask লঞ্চমোড: লঞ্চমোড:

<activity android:name="VideoActivity"
    ...
    android:supportsPictureInPicture="true"
    android:launchMode="singleTask"
    ...

আপনার ক্রিয়াকলাপে, ওভাররাইড onNewIntent() এবং নতুন ভিডিওটি পরিচালনা করুন, প্রয়োজনে কোনও বিদ্যমান ভিডিও প্লেব্যাক বন্ধ করে দিন।

সর্বোত্তম অনুশীলন

পিআইপি কম র‌্যাম রয়েছে এমন ডিভাইসগুলিতে অক্ষম হতে পারে। আপনার অ্যাপ্লিকেশন পিআইপি ব্যবহার করার আগে, এটি hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE) কল করে এটি উপলব্ধ রয়েছে তা নিশ্চিত হওয়ার জন্য পরীক্ষা করুন।

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

যখন কোনও ক্রিয়াকলাপ পিআইপি মোডে থাকে, ডিফল্টরূপে এটি ইনপুট ফোকাস পায় না। পিআইপি মোডে থাকাকালীন ইনপুট ইভেন্টগুলি পেতে, MediaSession.setCallback() ব্যবহার করুন। setCallback() ব্যবহার করার বিষয়ে আরও তথ্যের জন্য এখন একটি প্লে কার্ড প্রদর্শন করুন।

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

যখন আপনার অ্যাপ্লিকেশনটি পিআইপি প্রবেশ করতে চলেছে, কেবলমাত্র শীর্ষ ক্রিয়াকলাপটি চিত্র-ইন-চিত্রটিতে প্রবেশ করে নোট করুন। মাল্টি-উইন্ডো ডিভাইসে যেমন কিছু পরিস্থিতিতে, নীচের ক্রিয়াকলাপটি এখন পিআইপি ক্রিয়াকলাপের পাশাপাশি আবার দৃশ্যমান হয়ে উঠবে। আপনার এই কেসটি সেই অনুযায়ী পরিচালনা করা উচিত, নীচের ক্রিয়াকলাপ সহ একটি onResume() বা একটি onPause() কলব্যাক পাওয়া। এটিও সম্ভব যে ব্যবহারকারী ক্রিয়াকলাপের সাথে যোগাযোগ করতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে কোনও ভিডিও তালিকার ক্রিয়াকলাপ প্রদর্শিত হয় এবং পিআইপি মোডে ভিডিও ক্রিয়াকলাপ প্লে করা হয় তবে ব্যবহারকারী তালিকা থেকে একটি নতুন ভিডিও নির্বাচন করতে পারে এবং পিআইপি ক্রিয়াকলাপ সেই অনুযায়ী আপডেট করা উচিত।

অতিরিক্ত নমুনা কোড

কোটলিনে লিখিত একটি নমুনা অ্যাপ্লিকেশন ডাউনলোড করতে, অ্যান্ড্রয়েড পিকচার ইনপিকচার নমুনা (কোটলিন) দেখুন।