মিডিয়া অভিক্ষেপ

Android 5 (API লেভেল 21) এ প্রবর্তিত android.media.projection APIগুলি আপনাকে মিডিয়া স্ট্রীম হিসাবে একটি ডিভাইস প্রদর্শনের বিষয়বস্তু ক্যাপচার করতে সক্ষম করে যা আপনি টিভির মতো অন্যান্য ডিভাইসে প্লে ব্যাক, রেকর্ড বা কাস্ট করতে পারেন।

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

অ্যাপ স্ক্রিন শেয়ারিং ব্যবহারকারীর গোপনীয়তা নিশ্চিত করে, ব্যবহারকারীর উৎপাদনশীলতা বাড়ায় এবং ব্যবহারকারীদের একাধিক অ্যাপ চালাতে সক্ষম করে মাল্টিটাস্কিং বাড়ায় কিন্তু কন্টেন্ট শেয়ারিং শুধুমাত্র একটি অ্যাপে সীমাবদ্ধ করে।

তিনটি প্রদর্শন উপস্থাপনা

একটি মিডিয়া প্রজেকশন একটি ডিভাইস ডিসপ্লে বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করে এবং তারপর ক্যাপচার করা ছবিকে একটি ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করে যা একটি Surface ছবিটি রেন্ডার করে।

বাস্তব ডিভাইস প্রদর্শন ভার্চুয়াল প্রদর্শন সম্মুখের প্রক্ষিপ্ত. অ্যাপ্লিকেশন-প্রদত্ত `সারফেস`-এ লেখা ভার্চুয়াল প্রদর্শনের বিষয়বস্তু।
চিত্র 1. বাস্তব ডিভাইস স্ক্রীন বা অ্যাপ উইন্ডো ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করা হয়েছে। অ্যাপ্লিকেশন-প্রদত্ত Surface লেখা ভার্চুয়াল ডিসপ্লে।

অ্যাপ্লিকেশনটি একটি MediaRecorder , SurfaceTexture বা ImageReader এর মাধ্যমে Surface প্রদান করে, যা ক্যাপচার করা ডিসপ্লের বিষয়বস্তু ব্যবহার করে এবং আপনাকে রিয়েল টাইমে Surface রেন্ডার করা ছবিগুলি পরিচালনা করতে সক্ষম করে। আপনি ছবিগুলিকে একটি রেকর্ডিং হিসাবে সংরক্ষণ করতে পারেন বা একটি টিভি বা অন্য ডিভাইসে কাস্ট করতে পারেন৷

বাস্তব প্রদর্শন

একটি টোকেন প্রাপ্ত করে একটি মিডিয়া প্রজেকশন সেশন শুরু করুন যা আপনার অ্যাপকে ডিভাইস প্রদর্শন বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করার ক্ষমতা দেয়। টোকেনটি MediaProjection ক্লাসের একটি উদাহরণ দ্বারা প্রতিনিধিত্ব করা হয়।

আপনি একটি নতুন কার্যকলাপ শুরু করার সময় একটি MediaProjection দৃষ্টান্ত তৈরি করতে MediaProjectionManager সিস্টেম পরিষেবার getMediaProjection() পদ্ধতি ব্যবহার করুন। একটি স্ক্রিন ক্যাপচার অপারেশন নির্দিষ্ট করার জন্য createScreenCaptureIntent() পদ্ধতি থেকে একটি অভিপ্রায় দিয়ে কার্যকলাপ শুরু করুন:

কোটলিন

val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
var mediaProjection : MediaProjection

val startMediaProjection = registerForActivityResult(
    StartActivityForResult()
) { result ->
    if (result.resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager
            .getMediaProjection(result.resultCode, result.data!!)
    }
}

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())

জাভা

final MediaProjectionManager mediaProjectionManager =
    getSystemService(MediaProjectionManager.class);
final MediaProjection[] mediaProjection = new MediaProjection[1];

ActivityResultLauncher<Intent> startMediaProjection = registerForActivityResult(
    new StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            mediaProjection[0] = mediaProjectionManager
                .getMediaProjection(result.getResultCode(), result.getData());
        }
    }
);

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent());

ভার্চুয়াল ডিসপ্লে

একটি মিডিয়া প্রজেকশনের কেন্দ্রবিন্দু হল ভার্চুয়াল ডিসপ্লে, যা আপনি একটি MediaProjection উদাহরণে createVirtualDisplay() কল করে তৈরি করেন:

কোটলিন

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null)

জাভা

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null);

width এবং height পরামিতি ভার্চুয়াল প্রদর্শনের মাত্রা নির্দিষ্ট করে। প্রস্থ এবং উচ্চতার মান পেতে, Android 11 (API স্তর 30) এ চালু করা WindowMetrics APIs ব্যবহার করুন। (বিশদ বিবরণের জন্য, মিডিয়া প্রজেকশন আকার বিভাগটি দেখুন।)

সারফেস

উপযুক্ত রেজোলিউশনে আউটপুট তৈরি করতে মিডিয়া প্রজেকশন পৃষ্ঠের আকার করুন। টিভি বা কম্পিউটার মনিটরে স্ক্রিন কাস্ট করার জন্য পৃষ্ঠকে বড় (নিম্ন রেজোলিউশন) এবং ডিভাইস প্রদর্শন রেকর্ডিংয়ের জন্য ছোট (উচ্চ রেজোলিউশন) করুন।

Android 12L (API লেভেল 32) অনুযায়ী, পৃষ্ঠে ক্যাপচার করা বিষয়বস্তু রেন্ডার করার সময়, সিস্টেম আকৃতির অনুপাত বজায় রেখে বিষয়বস্তুকে সমানভাবে স্কেল করে, যাতে বিষয়বস্তুর উভয় মাত্রা (প্রস্থ এবং উচ্চতা) অনুরূপের সমান বা কম হয়। পৃষ্ঠের মাত্রা। ক্যাপচার করা বিষয়বস্তু তারপর পৃষ্ঠের উপর কেন্দ্রীভূত হয়।

অ্যান্ড্রয়েড 12L স্কেলিং পদ্ধতি টেলিভিশন এবং অন্যান্য বড় ডিসপ্লেতে স্ক্রিন কাস্টিং উন্নত করে এবং সঠিক আকৃতির অনুপাত নিশ্চিত করে পৃষ্ঠের চিত্রের আকার সর্বাধিক করে।

ফোরগ্রাউন্ড পরিষেবা অনুমতি

যদি আপনার অ্যাপটি Android 14 বা উচ্চতরকে লক্ষ্য করে, অ্যাপ ম্যানিফেস্টে অবশ্যই mediaProjection ফোরগ্রাউন্ড পরিষেবার প্রকারের জন্য একটি অনুমতি ঘোষণা অন্তর্ভুক্ত করতে হবে:

<manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <application ...>
        <service
            android:name=".MyMediaProjectionService"
            android:foregroundServiceType="mediaProjection"
            android:exported="false">
        </service>
    </application>
</manifest>

startForeground() এ কল দিয়ে মিডিয়া প্রজেকশন সার্ভিস শুরু করুন।

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

প্রতিটি মিডিয়া প্রজেকশন সেশনের আগে আপনার অ্যাপকে অবশ্যই ব্যবহারকারীর সম্মতির অনুরোধ করতে হবে। একটি সেশন হল createVirtualDisplay() জন্য একটি একক কল। একটি MediaProjection টোকেন শুধুমাত্র একবার কল করার জন্য ব্যবহার করতে হবে।

অ্যান্ড্রয়েড 14 বা উচ্চতর সংস্করণে, createVirtualDisplay() পদ্ধতিটি একটি SecurityException নিক্ষেপ করে যদি আপনার অ্যাপ নিম্নলিখিতগুলির মধ্যে একটি করে থাকে:

  • createScreenCaptureIntent() থেকে getMediaProjection() একাধিকবার ফেরত আসা একটি Intent উদাহরণ পাস করে
  • একই MediaProjection উদাহরণে createVirtualDisplay() একাধিকবার কল করে

মিডিয়া অভিক্ষেপের আকার

একটি মিডিয়া প্রজেকশন উইন্ডোিং মোড নির্বিশেষে সমগ্র ডিভাইস প্রদর্শন বা একটি অ্যাপ উইন্ডো ক্যাপচার করতে পারে।

প্রাথমিক আকার

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

প্ল্যাটফর্ম WindowManager getMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন ডিভাইস স্ক্রিনের জন্য একটি WindowMetrics অবজেক্ট ফেরত দিতে, এমনকি যদি মিডিয়া প্রজেকশন হোস্ট অ্যাপটি মাল্টি-উইন্ডো মোডে থাকে, প্রদর্শনের শুধুমাত্র অংশ দখল করে থাকে।

API স্তর 14 পর্যন্ত সামঞ্জস্যের জন্য, Jetpack WindowManager লাইব্রেরি থেকে WindowMetricsCalculator computeMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন।

ডিভাইস প্রদর্শনের প্রস্থ এবং উচ্চতা পেতে WindowMetrics getBounds() পদ্ধতিতে কল করুন।

আকার পরিবর্তন

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

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

কাস্টমাইজেশন

আপনার অ্যাপ নিম্নলিখিত MediaProjection.Callback APIগুলির সাথে মিডিয়া প্রজেকশন ব্যবহারকারীর অভিজ্ঞতা কাস্টমাইজ করতে পারে:

  • onCapturedContentVisibilityChanged() : হোস্ট অ্যাপকে সক্ষম করে (যে অ্যাপটি মিডিয়া প্রজেকশন শুরু করেছে) শেয়ার করা সামগ্রী দেখাতে বা লুকিয়ে রাখতে।

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

  • onCapturedContentResize() : ভার্চুয়াল ডিসপ্লেতে মিডিয়া প্রজেকশনের আকার পরিবর্তন করতে হোস্ট অ্যাপটিকে সক্ষম করে এবং ক্যাপচার করা ডিসপ্লে অঞ্চলের আকারের উপর ভিত্তি করে মিডিয়া প্রজেকশন Surface

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

সম্পদ পুনরুদ্ধার

মিডিয়া প্রজেকশন সেশন বন্ধ হয়ে গেলে এবং অবৈধ হয়ে গেলে জানানোর জন্য আপনার অ্যাপের MediaProjection onStop() কলব্যাক নিবন্ধন করা উচিত। সেশনটি বন্ধ হয়ে গেলে, আপনার অ্যাপের ভার্চুয়াল ডিসপ্লে এবং প্রজেকশন সারফেসের মতো রিসোর্সগুলি প্রকাশ করা উচিত। একটি বন্ধ মিডিয়া প্রজেকশন সেশন আর একটি নতুন ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে না, এমনকি যদি আপনার অ্যাপটি সেই মিডিয়া প্রজেকশনের জন্য একটি ভার্চুয়াল ডিসপ্লে তৈরি না করে থাকে।

যখন মিডিয়া প্রজেকশন বন্ধ হয়ে যায় তখন কলব্যাক বলা হয়, কারণ ব্যবহারকারী নিজে সেশন বন্ধ করে দেয়, অথবা সিস্টেম কোনো কারণে সেশন বন্ধ করে দেয়।

যদি আপনার অ্যাপ কলব্যাক নিবন্ধন না করে, createVirtualDisplay() যে কোনো কল IllegalStateException থ্রো করে।

অপ্ট আউট

Android 14 বা উচ্চতর ডিফল্টরূপে অ্যাপ স্ক্রিন শেয়ারিং সক্ষম করে। প্রতিটি মিডিয়া প্রজেকশন সেশন ব্যবহারকারীদের একটি অ্যাপ উইন্ডো বা পুরো ডিসপ্লে শেয়ার করার বিকল্প দেয়।

createConfigForDefaultDisplay() এ কল থেকে ফিরে আসা MediaProjectionConfig আর্গুমেন্ট সহ createScreenCaptureIntent(MediaProjectionConfig) পদ্ধতিতে কল করে আপনার অ্যাপ অ্যাপ স্ক্রিন শেয়ারিং থেকে অপ্ট আউট করতে পারে।

createScreenCaptureIntent(MediaProjectionConfig) একটি MediaProjectionConfig আর্গুমেন্ট সহ createConfigForUserChoice() এ কল থেকে ফিরে আসা একটি ডিফল্ট আচরণের মতোই, অর্থাৎ, createScreenCaptureIntent() এর জন্য একটি কল।

রিসাইজযোগ্য অ্যাপ

আপনার মিডিয়া প্রজেকশন অ্যাপ্লিকেশনগুলিকে সর্বদা আকার পরিবর্তনযোগ্য করুন ( resizeableActivity="true" )। পরিবর্তনযোগ্য অ্যাপগুলি ডিভাইস কনফিগারেশন পরিবর্তন এবং বহু-উইন্ডো মোড সমর্থন করে ( মাল্টি-উইন্ডো সমর্থন দেখুন)।

যদি আপনার অ্যাপটি রিসাইজ করা যায় না, তাহলে এটিকে অবশ্যই একটি উইন্ডো প্রেক্ষাপট থেকে ডিসপ্লে বাউন্ডগুলি জিজ্ঞাসা করতে হবে এবং অ্যাপে উপলব্ধ সর্বাধিক ডিসপ্লে এলাকার WindowMetrics পুনরুদ্ধার করতে getMaximumWindowMetrics() ব্যবহার করতে হবে:

কোটলিন

val windowContext = context.createWindowContext(context.display!!,
      WindowManager.LayoutParams.TYPE_APPLICATION, null)
val projectionMetrics = windowContext.getSystemService(WindowManager::class.java)
      .maximumWindowMetrics

জাভা

Context windowContext = context.createWindowContext(context.getDisplay(),
      WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class)
      .getMaximumWindowMetrics();

স্ট্যাটাস বার চিপ এবং অটো স্টপ

স্ক্রীন প্রজেকশন শোষণ ব্যক্তিগত ব্যবহারকারীর ডেটা যেমন আর্থিক তথ্য প্রকাশ করে কারণ ব্যবহারকারীরা বুঝতে পারে না যে তাদের ডিভাইসের স্ক্রিন ভাগ করা হচ্ছে।

Android 15 (API লেভেল 35) QPR1 একটি নতুন স্ট্যাটাস বার চিপ প্রবর্তন করেছে যা বড় এবং বিশিষ্ট, যা ব্যবহারকারীদের যেকোনও অগ্রগতি স্ক্রীন প্রজেকশন সম্পর্কে সতর্ক করবে। ব্যবহারকারীরা তাদের স্ক্রীন শেয়ার করা, কাস্ট করা বা রেকর্ড করা থেকে বন্ধ করতে চিপটিতে ট্যাপ করতে পারেন।

Android 15 QPR1 এবং উচ্চতর সংস্করণে, ডিভাইসের স্ক্রিন লক হয়ে গেলে স্ক্রিন প্রজেকশন স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

চিত্র 2. স্ক্রিন শেয়ারিং, স্ক্রিন কাস্টিং এবং স্ক্রিন রেকর্ডিংয়ের জন্য স্ট্যাটাস বার চিপ।

অতিরিক্ত সম্পদ

মিডিয়া প্রজেকশন সম্পর্কে আরও তথ্যের জন্য, ভিডিও এবং অডিও প্লেব্যাক ক্যাপচার দেখুন।

,

Android 5 (API লেভেল 21) এ প্রবর্তিত android.media.projection APIগুলি আপনাকে মিডিয়া স্ট্রীম হিসাবে একটি ডিভাইস প্রদর্শনের বিষয়বস্তু ক্যাপচার করতে সক্ষম করে যা আপনি টিভির মতো অন্যান্য ডিভাইসে প্লে ব্যাক, রেকর্ড বা কাস্ট করতে পারেন।

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

অ্যাপ স্ক্রিন শেয়ারিং ব্যবহারকারীর গোপনীয়তা নিশ্চিত করে, ব্যবহারকারীর উৎপাদনশীলতা বাড়ায় এবং ব্যবহারকারীদের একাধিক অ্যাপ চালাতে সক্ষম করে মাল্টিটাস্কিং বাড়ায় কিন্তু কন্টেন্ট শেয়ারিং শুধুমাত্র একটি অ্যাপে সীমাবদ্ধ করে।

তিনটি প্রদর্শন উপস্থাপনা

একটি মিডিয়া প্রজেকশন একটি ডিভাইস ডিসপ্লে বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করে এবং তারপর ক্যাপচার করা ছবিকে একটি ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করে যা একটি Surface ছবিটি রেন্ডার করে।

বাস্তব ডিভাইস প্রদর্শন ভার্চুয়াল প্রদর্শন সম্মুখের প্রক্ষিপ্ত. অ্যাপ্লিকেশন-প্রদত্ত `সারফেস`-এ লেখা ভার্চুয়াল প্রদর্শনের বিষয়বস্তু।
চিত্র 1. বাস্তব ডিভাইস স্ক্রীন বা অ্যাপ উইন্ডো ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করা হয়েছে। অ্যাপ্লিকেশন-প্রদত্ত Surface লেখা ভার্চুয়াল ডিসপ্লে।

অ্যাপ্লিকেশনটি একটি MediaRecorder , SurfaceTexture বা ImageReader এর মাধ্যমে Surface প্রদান করে, যা ক্যাপচার করা ডিসপ্লের বিষয়বস্তু ব্যবহার করে এবং আপনাকে রিয়েল টাইমে Surface রেন্ডার করা ছবিগুলি পরিচালনা করতে সক্ষম করে। আপনি ছবিগুলিকে একটি রেকর্ডিং হিসাবে সংরক্ষণ করতে পারেন বা একটি টিভি বা অন্য ডিভাইসে কাস্ট করতে পারেন৷

বাস্তব প্রদর্শন

একটি টোকেন প্রাপ্ত করে একটি মিডিয়া প্রজেকশন সেশন শুরু করুন যা আপনার অ্যাপকে ডিভাইস প্রদর্শন বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করার ক্ষমতা দেয়। টোকেনটি MediaProjection ক্লাসের একটি উদাহরণ দ্বারা প্রতিনিধিত্ব করা হয়।

আপনি একটি নতুন কার্যকলাপ শুরু করার সময় একটি MediaProjection দৃষ্টান্ত তৈরি করতে MediaProjectionManager সিস্টেম পরিষেবার getMediaProjection() পদ্ধতি ব্যবহার করুন। একটি স্ক্রিন ক্যাপচার অপারেশন নির্দিষ্ট করার জন্য createScreenCaptureIntent() পদ্ধতি থেকে একটি অভিপ্রায় দিয়ে কার্যকলাপ শুরু করুন:

কোটলিন

val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
var mediaProjection : MediaProjection

val startMediaProjection = registerForActivityResult(
    StartActivityForResult()
) { result ->
    if (result.resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager
            .getMediaProjection(result.resultCode, result.data!!)
    }
}

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())

জাভা

final MediaProjectionManager mediaProjectionManager =
    getSystemService(MediaProjectionManager.class);
final MediaProjection[] mediaProjection = new MediaProjection[1];

ActivityResultLauncher<Intent> startMediaProjection = registerForActivityResult(
    new StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            mediaProjection[0] = mediaProjectionManager
                .getMediaProjection(result.getResultCode(), result.getData());
        }
    }
);

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent());

ভার্চুয়াল ডিসপ্লে

একটি মিডিয়া প্রজেকশনের কেন্দ্রবিন্দু হল ভার্চুয়াল ডিসপ্লে, যা আপনি একটি MediaProjection উদাহরণে createVirtualDisplay() কল করে তৈরি করেন:

কোটলিন

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null)

জাভা

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null);

width এবং height পরামিতি ভার্চুয়াল প্রদর্শনের মাত্রা নির্দিষ্ট করে। প্রস্থ এবং উচ্চতার মান পেতে, Android 11 (API স্তর 30) এ চালু করা WindowMetrics APIs ব্যবহার করুন। (বিশদ বিবরণের জন্য, মিডিয়া প্রজেকশন আকার বিভাগটি দেখুন।)

সারফেস

উপযুক্ত রেজোলিউশনে আউটপুট তৈরি করতে মিডিয়া প্রজেকশন পৃষ্ঠের আকার করুন। টিভি বা কম্পিউটার মনিটরে স্ক্রিন কাস্ট করার জন্য পৃষ্ঠকে বড় (নিম্ন রেজোলিউশন) এবং ডিভাইস প্রদর্শন রেকর্ডিংয়ের জন্য ছোট (উচ্চ রেজোলিউশন) করুন।

Android 12L (API লেভেল 32) অনুযায়ী, পৃষ্ঠে ক্যাপচার করা বিষয়বস্তু রেন্ডার করার সময়, সিস্টেম আকৃতির অনুপাত বজায় রেখে বিষয়বস্তুকে সমানভাবে স্কেল করে, যাতে বিষয়বস্তুর উভয় মাত্রা (প্রস্থ এবং উচ্চতা) অনুরূপের সমান বা কম হয়। পৃষ্ঠের মাত্রা। ক্যাপচার করা বিষয়বস্তু তারপর পৃষ্ঠের উপর কেন্দ্রীভূত হয়।

অ্যান্ড্রয়েড 12L স্কেলিং পদ্ধতি টেলিভিশন এবং অন্যান্য বড় ডিসপ্লেতে স্ক্রিন কাস্টিং উন্নত করে এবং সঠিক আকৃতির অনুপাত নিশ্চিত করে পৃষ্ঠের চিত্রের আকার সর্বাধিক করে।

ফোরগ্রাউন্ড পরিষেবা অনুমতি

যদি আপনার অ্যাপটি Android 14 বা উচ্চতরকে লক্ষ্য করে, অ্যাপ ম্যানিফেস্টে অবশ্যই mediaProjection ফোরগ্রাউন্ড পরিষেবার প্রকারের জন্য একটি অনুমতি ঘোষণা অন্তর্ভুক্ত করতে হবে:

<manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <application ...>
        <service
            android:name=".MyMediaProjectionService"
            android:foregroundServiceType="mediaProjection"
            android:exported="false">
        </service>
    </application>
</manifest>

startForeground() এ কল দিয়ে মিডিয়া প্রজেকশন সার্ভিস শুরু করুন।

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

প্রতিটি মিডিয়া প্রজেকশন সেশনের আগে আপনার অ্যাপকে অবশ্যই ব্যবহারকারীর সম্মতির অনুরোধ করতে হবে। একটি সেশন হল createVirtualDisplay() জন্য একটি একক কল। একটি MediaProjection টোকেন শুধুমাত্র একবার কল করার জন্য ব্যবহার করতে হবে।

অ্যান্ড্রয়েড 14 বা উচ্চতর সংস্করণে, createVirtualDisplay() পদ্ধতিটি একটি SecurityException নিক্ষেপ করে যদি আপনার অ্যাপ নিম্নলিখিতগুলির মধ্যে একটি করে থাকে:

  • createScreenCaptureIntent() থেকে getMediaProjection() একাধিকবার ফেরত আসা একটি Intent উদাহরণ পাস করে
  • একই MediaProjection উদাহরণে createVirtualDisplay() একাধিকবার কল করে

মিডিয়া অভিক্ষেপের আকার

একটি মিডিয়া প্রজেকশন উইন্ডোিং মোড নির্বিশেষে সমগ্র ডিভাইস প্রদর্শন বা একটি অ্যাপ উইন্ডো ক্যাপচার করতে পারে।

প্রাথমিক আকার

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

প্ল্যাটফর্ম WindowManager getMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন ডিভাইস স্ক্রিনের জন্য একটি WindowMetrics অবজেক্ট ফেরত দিতে, এমনকি যদি মিডিয়া প্রজেকশন হোস্ট অ্যাপটি মাল্টি-উইন্ডো মোডে থাকে, প্রদর্শনের শুধুমাত্র অংশ দখল করে থাকে।

API স্তর 14 পর্যন্ত সামঞ্জস্যের জন্য, Jetpack WindowManager লাইব্রেরি থেকে WindowMetricsCalculator computeMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন।

ডিভাইস প্রদর্শনের প্রস্থ এবং উচ্চতা পেতে WindowMetrics getBounds() পদ্ধতিতে কল করুন।

আকার পরিবর্তন

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

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

কাস্টমাইজেশন

আপনার অ্যাপ নিম্নলিখিত MediaProjection.Callback APIগুলির সাথে মিডিয়া প্রজেকশন ব্যবহারকারীর অভিজ্ঞতা কাস্টমাইজ করতে পারে:

  • onCapturedContentVisibilityChanged() : হোস্ট অ্যাপকে সক্ষম করে (যে অ্যাপটি মিডিয়া প্রজেকশন শুরু করেছে) শেয়ার করা সামগ্রী দেখাতে বা লুকিয়ে রাখতে।

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

  • onCapturedContentResize() : ভার্চুয়াল ডিসপ্লেতে মিডিয়া প্রজেকশনের আকার পরিবর্তন করতে হোস্ট অ্যাপটিকে সক্ষম করে এবং ক্যাপচার করা ডিসপ্লে অঞ্চলের আকারের উপর ভিত্তি করে মিডিয়া প্রজেকশন Surface

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

সম্পদ পুনরুদ্ধার

মিডিয়া প্রজেকশন সেশন বন্ধ হয়ে গেলে এবং অবৈধ হয়ে গেলে জানানোর জন্য আপনার অ্যাপের MediaProjection onStop() কলব্যাক নিবন্ধন করা উচিত। সেশনটি বন্ধ হয়ে গেলে, আপনার অ্যাপের ভার্চুয়াল ডিসপ্লে এবং প্রজেকশন সারফেসের মতো রিসোর্সগুলি প্রকাশ করা উচিত। একটি বন্ধ মিডিয়া প্রজেকশন সেশন আর একটি নতুন ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে না, এমনকি যদি আপনার অ্যাপটি সেই মিডিয়া প্রজেকশনের জন্য একটি ভার্চুয়াল ডিসপ্লে তৈরি না করে থাকে।

যখন মিডিয়া প্রজেকশন বন্ধ হয়ে যায় তখন কলব্যাক বলা হয়, কারণ ব্যবহারকারী নিজে সেশন বন্ধ করে দেয়, অথবা সিস্টেম কোনো কারণে সেশন বন্ধ করে দেয়।

যদি আপনার অ্যাপ কলব্যাক নিবন্ধন না করে, createVirtualDisplay() যে কোনো কল IllegalStateException থ্রো করে।

অপ্ট আউট

Android 14 বা উচ্চতর ডিফল্টরূপে অ্যাপ স্ক্রিন শেয়ারিং সক্ষম করে। প্রতিটি মিডিয়া প্রজেকশন সেশন ব্যবহারকারীদের একটি অ্যাপ উইন্ডো বা পুরো ডিসপ্লে শেয়ার করার বিকল্প দেয়।

createConfigForDefaultDisplay() এ কল থেকে ফিরে আসা MediaProjectionConfig আর্গুমেন্ট সহ createScreenCaptureIntent(MediaProjectionConfig) পদ্ধতিতে কল করে আপনার অ্যাপ অ্যাপ স্ক্রিন শেয়ারিং থেকে অপ্ট আউট করতে পারে।

createScreenCaptureIntent(MediaProjectionConfig) একটি MediaProjectionConfig আর্গুমেন্ট সহ createConfigForUserChoice() এ কল থেকে ফিরে আসা একটি ডিফল্ট আচরণের মতোই, অর্থাৎ, createScreenCaptureIntent() এর জন্য একটি কল।

রিসাইজযোগ্য অ্যাপস

আপনার মিডিয়া প্রজেকশন অ্যাপ্লিকেশনগুলিকে সর্বদা আকার পরিবর্তনযোগ্য করুন ( resizeableActivity="true" )। পরিবর্তনযোগ্য অ্যাপগুলি ডিভাইস কনফিগারেশন পরিবর্তন এবং বহু-উইন্ডো মোড সমর্থন করে ( মাল্টি-উইন্ডো সমর্থন দেখুন)।

যদি আপনার অ্যাপটি রিসাইজ করা যায় না, তাহলে এটিকে অবশ্যই একটি উইন্ডো প্রেক্ষাপট থেকে ডিসপ্লে বাউন্ডগুলি জিজ্ঞাসা করতে হবে এবং অ্যাপে উপলব্ধ সর্বাধিক ডিসপ্লে এলাকার WindowMetrics পুনরুদ্ধার করতে getMaximumWindowMetrics() ব্যবহার করতে হবে:

কোটলিন

val windowContext = context.createWindowContext(context.display!!,
      WindowManager.LayoutParams.TYPE_APPLICATION, null)
val projectionMetrics = windowContext.getSystemService(WindowManager::class.java)
      .maximumWindowMetrics

জাভা

Context windowContext = context.createWindowContext(context.getDisplay(),
      WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class)
      .getMaximumWindowMetrics();

স্ট্যাটাস বার চিপ এবং অটো স্টপ

স্ক্রীন প্রজেকশন শোষণ ব্যক্তিগত ব্যবহারকারীর ডেটা যেমন আর্থিক তথ্য প্রকাশ করে কারণ ব্যবহারকারীরা বুঝতে পারে না যে তাদের ডিভাইসের স্ক্রীন ভাগ করা হচ্ছে।

Android 15 (API লেভেল 35) QPR1 একটি নতুন স্ট্যাটাস বার চিপ প্রবর্তন করেছে যা বড় এবং বিশিষ্ট, যা ব্যবহারকারীদের যেকোনও অগ্রগতি স্ক্রীন প্রজেকশন সম্পর্কে সতর্ক করবে। ব্যবহারকারীরা তাদের স্ক্রীন শেয়ার করা, কাস্ট করা বা রেকর্ড করা থেকে বন্ধ করতে চিপটিতে ট্যাপ করতে পারেন।

Android 15 QPR1 এবং উচ্চতর সংস্করণে, ডিভাইসের স্ক্রিন লক হয়ে গেলে স্ক্রিন প্রজেকশন স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

চিত্র 2. স্ক্রিন শেয়ারিং, স্ক্রিন কাস্টিং এবং স্ক্রিন রেকর্ডিংয়ের জন্য স্ট্যাটাস বার চিপ।

অতিরিক্ত সম্পদ

মিডিয়া প্রজেকশন সম্পর্কে আরও তথ্যের জন্য, ভিডিও এবং অডিও প্লেব্যাক ক্যাপচার দেখুন।

,

Android 5 (API লেভেল 21) এ প্রবর্তিত android.media.projection APIগুলি আপনাকে মিডিয়া স্ট্রীম হিসাবে একটি ডিভাইস প্রদর্শনের বিষয়বস্তু ক্যাপচার করতে সক্ষম করে যা আপনি টিভির মতো অন্যান্য ডিভাইসে প্লে ব্যাক, রেকর্ড বা কাস্ট করতে পারেন।

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

অ্যাপ স্ক্রিন শেয়ারিং ব্যবহারকারীর গোপনীয়তা নিশ্চিত করে, ব্যবহারকারীর উৎপাদনশীলতা বাড়ায় এবং ব্যবহারকারীদের একাধিক অ্যাপ চালাতে সক্ষম করে মাল্টিটাস্কিং বাড়ায় কিন্তু কন্টেন্ট শেয়ারিং শুধুমাত্র একটি অ্যাপে সীমাবদ্ধ করে।

তিনটি প্রদর্শন উপস্থাপনা

একটি মিডিয়া প্রজেকশন একটি ডিভাইস ডিসপ্লে বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করে এবং তারপর ক্যাপচার করা ছবিকে একটি ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করে যা একটি Surface ছবিটি রেন্ডার করে।

বাস্তব ডিভাইস প্রদর্শন ভার্চুয়াল প্রদর্শন সম্মুখের প্রক্ষিপ্ত. অ্যাপ্লিকেশন-প্রদত্ত `সারফেস`-এ লেখা ভার্চুয়াল প্রদর্শনের বিষয়বস্তু।
চিত্র 1. বাস্তব ডিভাইস স্ক্রীন বা অ্যাপ উইন্ডো ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করা হয়েছে। অ্যাপ্লিকেশন-প্রদত্ত Surface লেখা ভার্চুয়াল ডিসপ্লে।

অ্যাপ্লিকেশনটি একটি MediaRecorder , SurfaceTexture বা ImageReader এর মাধ্যমে Surface প্রদান করে, যা ক্যাপচার করা ডিসপ্লের বিষয়বস্তু ব্যবহার করে এবং আপনাকে রিয়েল টাইমে Surface রেন্ডার করা ছবিগুলি পরিচালনা করতে সক্ষম করে। আপনি ছবিগুলিকে একটি রেকর্ডিং হিসাবে সংরক্ষণ করতে পারেন বা একটি টিভি বা অন্য ডিভাইসে কাস্ট করতে পারেন৷

বাস্তব প্রদর্শন

একটি টোকেন প্রাপ্ত করে একটি মিডিয়া প্রজেকশন সেশন শুরু করুন যা আপনার অ্যাপকে ডিভাইস প্রদর্শন বা অ্যাপ উইন্ডোর বিষয়বস্তু ক্যাপচার করার ক্ষমতা দেয়। টোকেনটি MediaProjection ক্লাসের একটি উদাহরণ দ্বারা প্রতিনিধিত্ব করা হয়।

আপনি একটি নতুন কার্যকলাপ শুরু করার সময় একটি MediaProjection দৃষ্টান্ত তৈরি করতে MediaProjectionManager সিস্টেম পরিষেবার getMediaProjection() পদ্ধতি ব্যবহার করুন। একটি স্ক্রিন ক্যাপচার অপারেশন নির্দিষ্ট করার জন্য createScreenCaptureIntent() পদ্ধতি থেকে একটি অভিপ্রায় দিয়ে কার্যকলাপ শুরু করুন:

কোটলিন

val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
var mediaProjection : MediaProjection

val startMediaProjection = registerForActivityResult(
    StartActivityForResult()
) { result ->
    if (result.resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager
            .getMediaProjection(result.resultCode, result.data!!)
    }
}

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())

জাভা

final MediaProjectionManager mediaProjectionManager =
    getSystemService(MediaProjectionManager.class);
final MediaProjection[] mediaProjection = new MediaProjection[1];

ActivityResultLauncher<Intent> startMediaProjection = registerForActivityResult(
    new StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            mediaProjection[0] = mediaProjectionManager
                .getMediaProjection(result.getResultCode(), result.getData());
        }
    }
);

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent());

ভার্চুয়াল ডিসপ্লে

একটি মিডিয়া প্রজেকশনের কেন্দ্রবিন্দু হল ভার্চুয়াল ডিসপ্লে, যা আপনি একটি MediaProjection উদাহরণে createVirtualDisplay() কল করে তৈরি করেন:

কোটলিন

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null)

জাভা

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null);

width এবং height পরামিতি ভার্চুয়াল প্রদর্শনের মাত্রা নির্দিষ্ট করে। প্রস্থ এবং উচ্চতার মান পেতে, Android 11 (API স্তর 30) এ চালু করা WindowMetrics APIs ব্যবহার করুন। (বিশদ বিবরণের জন্য, মিডিয়া প্রজেকশন আকার বিভাগটি দেখুন।)

সারফেস

উপযুক্ত রেজোলিউশনে আউটপুট তৈরি করতে মিডিয়া প্রজেকশন পৃষ্ঠের আকার করুন। টিভি বা কম্পিউটার মনিটরে স্ক্রিন কাস্ট করার জন্য পৃষ্ঠকে বড় (নিম্ন রেজোলিউশন) এবং ডিভাইস প্রদর্শন রেকর্ডিংয়ের জন্য ছোট (উচ্চ রেজোলিউশন) করুন।

Android 12L (API লেভেল 32) অনুযায়ী, পৃষ্ঠে ক্যাপচার করা বিষয়বস্তু রেন্ডার করার সময়, সিস্টেম আকৃতির অনুপাত বজায় রেখে বিষয়বস্তুকে সমানভাবে স্কেল করে, যাতে বিষয়বস্তুর উভয় মাত্রা (প্রস্থ এবং উচ্চতা) অনুরূপের সমান বা কম হয়। পৃষ্ঠের মাত্রা। ক্যাপচার করা বিষয়বস্তু তারপর পৃষ্ঠের উপর কেন্দ্রীভূত হয়।

অ্যান্ড্রয়েড 12L স্কেলিং পদ্ধতি টেলিভিশন এবং অন্যান্য বড় ডিসপ্লেতে স্ক্রিন কাস্টিং উন্নত করে এবং সঠিক আকৃতির অনুপাত নিশ্চিত করে পৃষ্ঠের চিত্রের আকার সর্বাধিক করে।

ফোরগ্রাউন্ড পরিষেবা অনুমতি

যদি আপনার অ্যাপটি Android 14 বা উচ্চতরকে লক্ষ্য করে, অ্যাপ ম্যানিফেস্টে অবশ্যই mediaProjection ফোরগ্রাউন্ড পরিষেবার প্রকারের জন্য একটি অনুমতি ঘোষণা অন্তর্ভুক্ত করতে হবে:

<manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <application ...>
        <service
            android:name=".MyMediaProjectionService"
            android:foregroundServiceType="mediaProjection"
            android:exported="false">
        </service>
    </application>
</manifest>

startForeground() এ কল দিয়ে মিডিয়া প্রজেকশন সার্ভিস শুরু করুন।

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

প্রতিটি মিডিয়া প্রজেকশন সেশনের আগে আপনার অ্যাপকে অবশ্যই ব্যবহারকারীর সম্মতির অনুরোধ করতে হবে। একটি সেশন হল createVirtualDisplay() জন্য একটি একক কল। একটি MediaProjection টোকেন শুধুমাত্র একবার কল করার জন্য ব্যবহার করতে হবে।

অ্যান্ড্রয়েড 14 বা উচ্চতর সংস্করণে, createVirtualDisplay() পদ্ধতিটি একটি SecurityException নিক্ষেপ করে যদি আপনার অ্যাপ নিম্নলিখিতগুলির মধ্যে একটি করে থাকে:

  • createScreenCaptureIntent() থেকে getMediaProjection() একাধিকবার ফেরত আসা একটি Intent উদাহরণ পাস করে
  • একই MediaProjection উদাহরণে createVirtualDisplay() একাধিকবার কল করে

মিডিয়া অভিক্ষেপের আকার

একটি মিডিয়া প্রজেকশন উইন্ডোিং মোড নির্বিশেষে সমগ্র ডিভাইস প্রদর্শন বা একটি অ্যাপ উইন্ডো ক্যাপচার করতে পারে।

প্রাথমিক আকার

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

প্ল্যাটফর্ম WindowManager getMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন ডিভাইস স্ক্রিনের জন্য একটি WindowMetrics অবজেক্ট ফেরত দিতে, এমনকি যদি মিডিয়া প্রজেকশন হোস্ট অ্যাপটি মাল্টি-উইন্ডো মোডে থাকে, প্রদর্শনের শুধুমাত্র অংশ দখল করে থাকে।

API স্তর 14 পর্যন্ত সামঞ্জস্যের জন্য, Jetpack WindowManager লাইব্রেরি থেকে WindowMetricsCalculator computeMaximumWindowMetrics() পদ্ধতি ব্যবহার করুন।

ডিভাইস প্রদর্শনের প্রস্থ এবং উচ্চতা পেতে WindowMetrics getBounds() পদ্ধতিতে কল করুন।

আকার পরিবর্তন

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

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

কাস্টমাইজেশন

আপনার অ্যাপ নিম্নলিখিত MediaProjection.Callback APIগুলির সাথে মিডিয়া প্রজেকশন ব্যবহারকারীর অভিজ্ঞতা কাস্টমাইজ করতে পারে:

  • onCapturedContentVisibilityChanged() : হোস্ট অ্যাপকে সক্ষম করে (যে অ্যাপটি মিডিয়া প্রজেকশন শুরু করেছে) শেয়ার করা সামগ্রী দেখাতে বা লুকিয়ে রাখতে।

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

  • onCapturedContentResize() : ভার্চুয়াল ডিসপ্লেতে মিডিয়া প্রজেকশনের আকার পরিবর্তন করতে হোস্ট অ্যাপটিকে সক্ষম করে এবং ক্যাপচার করা ডিসপ্লে অঞ্চলের আকারের উপর ভিত্তি করে মিডিয়া প্রজেকশন Surface

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

সম্পদ পুনরুদ্ধার

মিডিয়া প্রজেকশন সেশন বন্ধ হয়ে গেলে এবং অবৈধ হয়ে গেলে জানানোর জন্য আপনার অ্যাপের MediaProjection onStop() কলব্যাক নিবন্ধন করা উচিত। সেশনটি বন্ধ হয়ে গেলে, আপনার অ্যাপের ভার্চুয়াল ডিসপ্লে এবং প্রজেকশন পৃষ্ঠের মতো সংস্থানগুলিকে প্রকাশ করা উচিত। একটি বন্ধ মিডিয়া প্রজেকশন সেশন আর একটি নতুন ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে না, এমনকি যদি আপনার অ্যাপটি সেই মিডিয়া প্রজেকশনের জন্য একটি ভার্চুয়াল ডিসপ্লে তৈরি না করে থাকে।

যখন মিডিয়া প্রজেকশন বন্ধ হয়ে যায় তখন কলব্যাক বলা হয়, কারণ ব্যবহারকারী নিজে সেশন বন্ধ করে দেয়, অথবা সিস্টেম কোনো কারণে সেশন বন্ধ করে দেয়।

যদি আপনার অ্যাপ কলব্যাক নিবন্ধন না করে, createVirtualDisplay() যে কোনো কল IllegalStateException থ্রো করে।

অপ্ট আউট

Android 14 বা উচ্চতর ডিফল্টরূপে অ্যাপ স্ক্রিন শেয়ারিং সক্ষম করে। প্রতিটি মিডিয়া প্রজেকশন সেশন ব্যবহারকারীদের একটি অ্যাপ উইন্ডো বা পুরো ডিসপ্লে শেয়ার করার বিকল্প দেয়।

createConfigForDefaultDisplay() এ কল থেকে ফিরে আসা MediaProjectionConfig আর্গুমেন্ট সহ createScreenCaptureIntent(MediaProjectionConfig) পদ্ধতিতে কল করে আপনার অ্যাপ অ্যাপ স্ক্রিন শেয়ারিং থেকে অপ্ট আউট করতে পারে।

createScreenCaptureIntent(MediaProjectionConfig) একটি MediaProjectionConfig আর্গুমেন্ট সহ createConfigForUserChoice() এ কল থেকে ফিরে আসা একটি ডিফল্ট আচরণের মতোই, অর্থাৎ, createScreenCaptureIntent() এর জন্য একটি কল।

রিসাইজযোগ্য অ্যাপস

আপনার মিডিয়া প্রজেকশন অ্যাপ্লিকেশনগুলিকে সর্বদা আকার পরিবর্তনযোগ্য করুন ( resizeableActivity="true" )। পরিবর্তনযোগ্য অ্যাপগুলি ডিভাইস কনফিগারেশন পরিবর্তন এবং বহু-উইন্ডো মোড সমর্থন করে ( মাল্টি-উইন্ডো সমর্থন দেখুন)।

যদি আপনার অ্যাপটি রিসাইজ করা যায় না, তাহলে এটিকে অবশ্যই একটি উইন্ডো প্রেক্ষাপট থেকে ডিসপ্লে বাউন্ডগুলি জিজ্ঞাসা করতে হবে এবং অ্যাপে উপলব্ধ সর্বাধিক ডিসপ্লে এলাকার WindowMetrics পুনরুদ্ধার করতে getMaximumWindowMetrics() ব্যবহার করতে হবে:

কোটলিন

val windowContext = context.createWindowContext(context.display!!,
      WindowManager.LayoutParams.TYPE_APPLICATION, null)
val projectionMetrics = windowContext.getSystemService(WindowManager::class.java)
      .maximumWindowMetrics

জাভা

Context windowContext = context.createWindowContext(context.getDisplay(),
      WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class)
      .getMaximumWindowMetrics();

স্ট্যাটাস বার চিপ এবং অটো স্টপ

স্ক্রীন প্রজেকশন শোষণ ব্যক্তিগত ব্যবহারকারীর ডেটা যেমন আর্থিক তথ্য প্রকাশ করে কারণ ব্যবহারকারীরা বুঝতে পারে না যে তাদের ডিভাইসের স্ক্রিন ভাগ করা হচ্ছে।

Android 15 (API লেভেল 35) QPR1 একটি নতুন স্ট্যাটাস বার চিপ প্রবর্তন করেছে যা বড় এবং বিশিষ্ট, যা ব্যবহারকারীদের যেকোনও অগ্রগতি স্ক্রীন প্রজেকশন সম্পর্কে সতর্ক করবে। ব্যবহারকারীরা তাদের স্ক্রীন শেয়ার করা, কাস্ট করা বা রেকর্ড করা থেকে বন্ধ করতে চিপটিতে ট্যাপ করতে পারেন।

অ্যান্ড্রয়েড 15 কিউপিআর 1 এবং উচ্চতর, স্ক্রিন প্রক্ষেপণ ডিভাইসের স্ক্রিনটি লক হয়ে গেলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

চিত্র 2। স্ক্রিন ভাগ করে নেওয়া, স্ক্রিন কাস্টিং এবং স্ক্রিন রেকর্ডিংয়ের জন্য স্ট্যাটাস বার চিপ।

অতিরিক্ত সম্পদ

মিডিয়া প্রক্ষেপণ সম্পর্কে আরও তথ্যের জন্য, ক্যাপচার ভিডিও এবং অডিও প্লেব্যাক দেখুন।

,

android.media.projection এপিআইগুলি অ্যান্ড্রয়েড 5 এ প্রবর্তিত (এপিআই স্তর 21) আপনাকে একটি মিডিয়া স্ট্রিম হিসাবে কোনও ডিভাইস প্রদর্শনের বিষয়বস্তু ক্যাপচার করতে সক্ষম করে যা আপনি টিভিগুলির মতো অন্যান্য ডিভাইসে ফিরে, রেকর্ড করতে বা কাস্ট করতে পারেন।

অ্যান্ড্রয়েড 14 (এপিআই স্তর 34) অ্যাপ স্ক্রিন ভাগ করে নেওয়ার পরিচয় করিয়ে দেয়, যা ব্যবহারকারীদের উইন্ডোয়িং মোড নির্বিশেষে পুরো ডিভাইস স্ক্রিনের পরিবর্তে একটি একক অ্যাপ্লিকেশন উইন্ডো ভাগ করতে সক্ষম করে। অ্যাপ্লিকেশন স্ক্রিন ভাগ করে নেওয়া স্ট্যাটাস বার, নেভিগেশন বার, বিজ্ঞপ্তিগুলি এবং অন্যান্য সিস্টেম ইউআই উপাদানগুলি ভাগ করে নেওয়া ডিসপ্লে থেকে বাদ দেয় - এমনকি অ্যাপ্লিকেশন স্ক্রিন শেয়ারিং পুরো স্ক্রিনে একটি অ্যাপ্লিকেশন ক্যাপচার করতে ব্যবহৃত হয়। কেবলমাত্র নির্বাচিত অ্যাপের সামগ্রীগুলি ভাগ করা হয়।

অ্যাপ্লিকেশন স্ক্রিন ভাগ করে নেওয়া ব্যবহারকারীর গোপনীয়তা নিশ্চিত করে, ব্যবহারকারীর উত্পাদনশীলতা বৃদ্ধি করে এবং ব্যবহারকারীদের একাধিক অ্যাপ্লিকেশন চালাতে সক্ষম করে মাল্টিটাস্কিং বাড়ায় তবে কেবল একটি একক অ্যাপ্লিকেশনটিতে সামগ্রী ভাগ করে নেওয়া সীমাবদ্ধ করে।

তিনটি প্রদর্শন উপস্থাপনা

একটি মিডিয়া প্রক্ষেপণ কোনও ডিভাইস ডিসপ্লে বা অ্যাপ্লিকেশন উইন্ডোর বিষয়বস্তু ক্যাপচার করে এবং তারপরে ক্যাপচার করা চিত্রটিকে ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করে যা চিত্রটিকে কোনও Surface উপরে উপস্থাপন করে।

আসল ডিভাইস প্রদর্শন ভার্চুয়াল ডিসপ্লেতে প্রজেক্ট করা হয়েছে। অ্যাপ্লিকেশন সরবরাহিত `সারফেস` এ লিখিত ভার্চুয়াল প্রদর্শনের বিষয়বস্তু `
চিত্র 1। রিয়েল ডিভাইস স্ক্রিন বা অ্যাপ্লিকেশন উইন্ডো ভার্চুয়াল ডিসপ্লেতে অনুমান করা হয়েছে। ভার্চুয়াল ডিসপ্লে অ্যাপ্লিকেশন সরবরাহিত Surface লেখা।

অ্যাপ্লিকেশনটি একটি MediaRecorder , SurfaceTexture বা ImageReader মাধ্যমে Surface সরবরাহ করে, যা ক্যাপচারড ডিসপ্লেটির সামগ্রীগুলি গ্রাস করে এবং আপনাকে বাস্তব সময়ে Surface উপর রেন্ডার করা চিত্রগুলি পরিচালনা করতে সক্ষম করে। আপনি চিত্রগুলি রেকর্ডিং হিসাবে সংরক্ষণ করতে পারেন বা সেগুলি কোনও টিভি বা অন্য ডিভাইসে কাস্ট করতে পারেন।

বাস্তব প্রদর্শন

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

আপনি যখন কোনও নতুন ক্রিয়াকলাপ শুরু করেন তখন MediaProjection উদাহরণ তৈরি করতে MediaProjectionManager সিস্টেম পরিষেবার getMediaProjection() পদ্ধতিটি ব্যবহার করুন। একটি স্ক্রিন ক্যাপচার অপারেশন নির্দিষ্ট করতে createScreenCaptureIntent() পদ্ধতি থেকে একটি অভিপ্রায় দিয়ে ক্রিয়াকলাপটি শুরু করুন:

কোটলিন

val mediaProjectionManager = getSystemService(MediaProjectionManager::class.java)
var mediaProjection : MediaProjection

val startMediaProjection = registerForActivityResult(
    StartActivityForResult()
) { result ->
    if (result.resultCode == RESULT_OK) {
        mediaProjection = mediaProjectionManager
            .getMediaProjection(result.resultCode, result.data!!)
    }
}

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent())

জাভা

final MediaProjectionManager mediaProjectionManager =
    getSystemService(MediaProjectionManager.class);
final MediaProjection[] mediaProjection = new MediaProjection[1];

ActivityResultLauncher<Intent> startMediaProjection = registerForActivityResult(
    new StartActivityForResult(),
    result -> {
        if (result.getResultCode() == Activity.RESULT_OK) {
            mediaProjection[0] = mediaProjectionManager
                .getMediaProjection(result.getResultCode(), result.getData());
        }
    }
);

startMediaProjection.launch(mediaProjectionManager.createScreenCaptureIntent());

ভার্চুয়াল প্রদর্শন

একটি মিডিয়া প্রক্ষেপণের কেন্দ্রবিন্দু হ'ল ভার্চুয়াল ডিসপ্লে, যা আপনি একটি MediaProjection উদাহরণে createVirtualDisplay() কল করে তৈরি করেন:

কোটলিন

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null)

জাভা

virtualDisplay = mediaProjection.createVirtualDisplay(
                     "ScreenCapture",
                     width,
                     height,
                     screenDensity,
                     DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                     surface,
                     null, null);

width এবং height পরামিতিগুলি ভার্চুয়াল ডিসপ্লেটির মাত্রা নির্দিষ্ট করে। প্রস্থ এবং উচ্চতার জন্য মানগুলি পেতে, অ্যান্ড্রয়েড 11 (এপিআই স্তর 30) এ প্রবর্তিত WindowMetrics এপিআইগুলি ব্যবহার করুন। (বিশদগুলির জন্য, মিডিয়া প্রক্ষেপণ আকার বিভাগটি দেখুন))

সারফেস

উপযুক্ত রেজোলিউশনে আউটপুট উত্পাদন করতে মিডিয়া প্রক্ষেপণ পৃষ্ঠকে আকার দিন। ডিভাইস ডিসপ্লে রেকর্ডিংয়ের জন্য টিভি বা কম্পিউটার মনিটরগুলিতে স্ক্রিন কাস্টিংয়ের জন্য পৃষ্ঠটিকে বৃহত্তর (কম রেজোলিউশন) তৈরি করুন।

অ্যান্ড্রয়েড 12 এল (এপিআই স্তর 32) হিসাবে, যখন পৃষ্ঠের উপর ক্যাপচার করা সামগ্রীটি রেন্ডারিং করা হয়, সিস্টেমটি সামগ্রীটিকে সমানভাবে স্কেল করে, দিক অনুপাতটি বজায় রাখে, যাতে সামগ্রীর উভয় মাত্রা (প্রস্থ এবং উচ্চতা) এর সাথে সম্পর্কিত বা এর চেয়ে কম হয় পৃষ্ঠের মাত্রা। ক্যাপচার করা সামগ্রীটি তখন পৃষ্ঠের উপর কেন্দ্রীভূত হয়।

অ্যান্ড্রয়েড 12 এল স্কেলিং পদ্ধতির যথাযথ দিক অনুপাতটি নিশ্চিত করার সময় পৃষ্ঠের চিত্রের আকার সর্বাধিক করে টেলিভিশন এবং অন্যান্য বৃহত প্রদর্শনগুলিতে স্ক্রিন কাস্টিংয়ের উন্নতি করে।

অগ্রভাগ পরিষেবা অনুমতি

যদি আপনার অ্যাপ্লিকেশনটি অ্যান্ড্রয়েড 14 বা তার বেশি লক্ষ্য করে তবে অ্যাপ্লিকেশন ম্যানিফেস্টে অবশ্যই mediaProjection ফোরগ্রাউন্ড পরিষেবা ধরণের জন্য একটি অনুমতি ঘোষণা অন্তর্ভুক্ত করতে হবে:

<manifest ...>
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
    <application ...>
        <service
            android:name=".MyMediaProjectionService"
            android:foregroundServiceType="mediaProjection"
            android:exported="false">
        </service>
    </application>
</manifest>

startForeground() এ কল দিয়ে মিডিয়া প্রজেকশন পরিষেবাটি শুরু করুন।

আপনি যদি কলটিতে অগ্রভাগের পরিষেবা প্রকারটি নির্দিষ্ট না করেন তবে প্রকারটি ম্যানিফেস্টে সংজ্ঞায়িত অগ্রভাগের পরিষেবা প্রকারের বিটওয়াইজ পূর্ণসংখ্যার সাথে ডিফল্ট হয়। যদি ম্যানিফেস্টটি কোনও পরিষেবার প্রকার নির্দিষ্ট না করে তবে সিস্টেমটি MissingForegroundServiceTypeException ছুড়ে দেয়।

আপনার অ্যাপ্লিকেশন অবশ্যই প্রতিটি মিডিয়া প্রক্ষেপণ সেশনের আগে ব্যবহারকারীর সম্মতির জন্য অনুরোধ করতে হবে। একটি সেশন হ'ল createVirtualDisplay() এর একক কল। একটি MediaProjection টোকেন কলটি করতে কেবল একবার ব্যবহার করতে হবে।

অ্যান্ড্রয়েড 14 বা ততোধিক উপর, createVirtualDisplay() পদ্ধতিটি যদি আপনার অ্যাপ্লিকেশনটি নিম্নলিখিতগুলির মধ্যে একটি করে তবে একটি SecurityException ছুঁড়ে দেয়:

  • createScreenCaptureIntent() থেকে getMediaProjection() থেকে একাধিকবার ফিরে আসা একটি Intent উদাহরণ পাস করে
  • একই MediaProjection উদাহরণে createVirtualDisplay() একাধিকবার কল করে

মিডিয়া প্রক্ষেপণ আকার

একটি মিডিয়া প্রজেকশন উইন্ডোয়িং মোড নির্বিশেষে পুরো ডিভাইস প্রদর্শন বা একটি অ্যাপ্লিকেশন উইন্ডো ক্যাপচার করতে পারে।

প্রাথমিক আকার

পূর্ণ-স্ক্রিন মিডিয়া প্রক্ষেপণ সহ, আপনার অ্যাপ্লিকেশনটি অবশ্যই ডিভাইসের স্ক্রিনের আকার নির্ধারণ করতে হবে। অ্যাপ্লিকেশন স্ক্রিন ভাগ করে নেওয়ার ক্ষেত্রে, আপনার অ্যাপ্লিকেশনটি ক্যাপচার অঞ্চলটি নির্বাচন না করা পর্যন্ত ক্যাপচার ডিসপ্লেটির আকার নির্ধারণ করতে সক্ষম হবে না। সুতরাং, যে কোনও মিডিয়া প্রক্ষেপণের প্রাথমিক আকার হ'ল ডিভাইস স্ক্রিনের আকার।

মিডিয়া প্রজেকশন হোস্ট অ্যাপ্লিকেশনটি প্রদর্শনের কেবলমাত্র কিছু অংশ দখল করে থাকলেও ডিভাইস স্ক্রিনের জন্য WindowMetrics অবজেক্টটি ফেরত দেওয়ার জন্য প্ল্যাটফর্ম WindowManager getMaximumWindowMetrics() পদ্ধতিটি ব্যবহার করুন।

এপিআই স্তর 14 এর সামঞ্জস্যের জন্য, জেটপ্যাক WindowManager লাইব্রেরি থেকে WindowMetricsCalculator computeMaximumWindowMetrics() পদ্ধতিটি ব্যবহার করুন।

ডিভাইস প্রদর্শনের প্রস্থ এবং উচ্চতা পেতে WindowMetrics getBounds() পদ্ধতিতে কল করুন।

আকার পরিবর্তন

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

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

কাস্টমাইজেশন

আপনার অ্যাপ্লিকেশনটি নিম্নলিখিত MediaProjection.Callback এপিআইগুলির সাথে মিডিয়া প্রজেকশন ব্যবহারকারীর অভিজ্ঞতা কাস্টমাইজ করতে পারে:

  • onCapturedContentVisibilityChanged() : ভাগ করা সামগ্রীটি দেখাতে বা আড়াল করতে হোস্ট অ্যাপ্লিকেশন (মিডিয়া প্রক্ষেপণ শুরু করা অ্যাপ্লিকেশন) সক্ষম করে।

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

  • onCapturedContentResize() : ক্যাপচারড ডিসপ্লে অঞ্চলের আকারের উপর ভিত্তি করে ভার্চুয়াল ডিসপ্লে এবং মিডিয়া প্রজেকশন Surface মিডিয়া প্রক্ষেপণের আকার পরিবর্তন করতে হোস্ট অ্যাপটিকে সক্ষম করে।

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

সম্পদ পুনরুদ্ধার

আপনার অ্যাপ্লিকেশনটিতে মিডিয়া প্রজেকশন সেশনটি বন্ধ হয়ে গেলে এবং অবৈধ হয়ে যাওয়ার সময় অবহিত করার জন্য MediaProjection onStop() কলব্যাকটি নিবন্ধিত করা উচিত। যখন সেশনটি বন্ধ হয়ে যায়, আপনার অ্যাপ্লিকেশনটি ভার্চুয়াল ডিসপ্লে এবং প্রজেকশন পৃষ্ঠের মতো যে সংস্থানগুলি ধারণ করে তা প্রকাশ করা উচিত। আপনার অ্যাপ্লিকেশনটি আগে সেই মিডিয়া প্রক্ষেপণের জন্য ভার্চুয়াল ডিসপ্লে তৈরি না করেও একটি বন্ধ মিডিয়া প্রক্ষেপণ সেশন আর নতুন ভার্চুয়াল প্রদর্শন তৈরি করতে পারে না।

মিডিয়া প্রজেকশনটি শেষ হয়ে গেলে কলব্যাকটি ডাকা হয়, কারণ ব্যবহারকারী ম্যানুয়ালি সেশনটি বন্ধ করে দেয়, বা কারণ সিস্টেমটি কোনও কারণে সেশনটি বন্ধ করে দেয়।

যদি আপনার অ্যাপ্লিকেশনটি কলব্যাকটি নিবন্ধন না করে তবে createVirtualDisplay() এ কোনও কল IllegalStateException ছুড়ে দেয়।

অপ্ট আউট

অ্যান্ড্রয়েড 14 বা উচ্চতর ডিফল্টরূপে অ্যাপ্লিকেশন স্ক্রিন ভাগ করে নেওয়া সক্ষম করে। প্রতিটি মিডিয়া প্রক্ষেপণ সেশন ব্যবহারকারীদের একটি অ্যাপ্লিকেশন উইন্ডো বা পুরো প্রদর্শন ভাগ করে নেওয়ার বিকল্প দেয়।

আপনার অ্যাপ্লিকেশনটি ক্রিয়েটেকনফেকশন কনফিগ আর্গুমেন্টের সাথে createConfigForDefaultDisplay() এ ফিরে এসেছিল একটি MediaProjectionConfig আর্গুমেন্টের সাথে createScreenCaptureIntent(MediaProjectionConfig) পদ্ধতিটি কল করে অ্যাপ্লিকেশন স্ক্রিন ভাগ করে নেওয়ার বিকল্প বেছে নিতে পারে।

ক্রিয়েটেকনফেকশন কনফিগ আর্গুমেন্টের সাথে ক্রিয়েটস্ক্রেঙ্কাপচারিন্টেন্ট ( MediaProjectionConfig createScreenCaptureIntent(MediaProjectionConfig) এর একটি কল একটি কল থেকে createConfigForUserChoice() এ ফিরে এসেছিল ডিফল্ট আচরণের সমান, অর্থাৎ, createScreenCaptureIntent() এর কল।

পুনর্নির্মাণযোগ্য অ্যাপ্লিকেশন

সর্বদা আপনার মিডিয়া প্রজেকশন অ্যাপ্লিকেশনগুলি পুনরায় আকারযোগ্য করুন ( resizeableActivity="true" )। পুনর্নির্মাণযোগ্য অ্যাপ্লিকেশনগুলি ডিভাইস কনফিগারেশন পরিবর্তন এবং মাল্টি-ওয়াইন্ডো মোড সমর্থন করে ( মাল্টি-উইন্ডো সমর্থন দেখুন)।

যদি আপনার অ্যাপ্লিকেশনটি পুনরায় আকারযোগ্য না হয় তবে এটি অবশ্যই একটি উইন্ডো প্রসঙ্গ থেকে ডিসপ্লে সীমাটি জিজ্ঞাসা করতে হবে এবং অ্যাপটিতে উপলব্ধ সর্বাধিক ডিসপ্লে অঞ্চলের WindowMetrics পুনরুদ্ধার করতে getMaximumWindowMetrics() ব্যবহার করতে হবে:

কোটলিন

val windowContext = context.createWindowContext(context.display!!,
      WindowManager.LayoutParams.TYPE_APPLICATION, null)
val projectionMetrics = windowContext.getSystemService(WindowManager::class.java)
      .maximumWindowMetrics

জাভা

Context windowContext = context.createWindowContext(context.getDisplay(),
      WindowManager.LayoutParams.TYPE_APPLICATION, null);
WindowMetrics projectionMetrics = windowContext.getSystemService(WindowManager.class)
      .getMaximumWindowMetrics();

স্ট্যাটাস বার চিপ এবং অটো স্টপ

স্ক্রিন প্রজেকশন শোষণগুলি ব্যক্তিগত ব্যবহারকারীর ডেটা যেমন আর্থিক তথ্য প্রকাশ করে কারণ ব্যবহারকারীরা বুঝতে পারেন না যে তাদের ডিভাইসের স্ক্রিনটি ভাগ করা হচ্ছে।

অ্যান্ড্রয়েড 15 (এপিআই স্তর 35) কিউপিআর 1 একটি নতুন স্ট্যাটাস বার চিপ প্রবর্তন করেছে যা বৃহত্তর এবং বিশিষ্ট, যা ব্যবহারকারীদের - প্রগ্রেস স্ক্রিন প্রক্ষেপণে যে কোনও বিষয়ে সতর্ক করতে হবে। ব্যবহারকারীরা তাদের স্ক্রিনটি ভাগ করে নেওয়া, কাস্ট করা বা রেকর্ড করা বন্ধ করতে চিপটি ট্যাপ করতে পারে।

অ্যান্ড্রয়েড 15 কিউপিআর 1 এবং উচ্চতর, স্ক্রিন প্রক্ষেপণ ডিভাইসের স্ক্রিনটি লক হয়ে গেলে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।

চিত্র 2। স্ক্রিন ভাগ করে নেওয়া, স্ক্রিন কাস্টিং এবং স্ক্রিন রেকর্ডিংয়ের জন্য স্ট্যাটাস বার চিপ।

অতিরিক্ত সম্পদ

মিডিয়া প্রক্ষেপণ সম্পর্কে আরও তথ্যের জন্য, ক্যাপচার ভিডিও এবং অডিও প্লেব্যাক দেখুন।