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

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

মিডিয়া প্রজেকশন বন্ধ হয়ে গেলে সিস্টেম কলব্যাকের আহ্বান জানায়। এই সমাপ্তি বিভিন্ন কারণে ঘটতে পারে, যেমন:

  • ব্যবহারকারী অ্যাপের UI বা সিস্টেমের মিডিয়া প্রজেকশন স্ট্যাটাস বার চিপ ব্যবহার করে সেশন বন্ধ করে দেয়
  • পর্দা লক করা হচ্ছে
  • আরেকটি মিডিয়া প্রজেকশন সেশন শুরু হয়
  • অ্যাপ্লিকেশন প্রক্রিয়া নিহত হয়

যদি আপনার অ্যাপ কলব্যাক নিবন্ধন না করে, 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();

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

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

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

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

স্ক্রিন শেয়ারিং, কাস্টিং বা রেকর্ডিং শুরু করে মিডিয়া প্রজেকশন স্ট্যাটাস বার চিপের উপলব্ধতা পরীক্ষা করুন। চিপটি স্ট্যাটাস বারে উপস্থিত হওয়া উচিত।

স্ট্যাটাস বার চিপের সাথে ব্যবহারকারীর ইন্টারঅ্যাকশন বা লক স্ক্রিন অ্যাক্টিভেশনের মাধ্যমে যখন স্ক্রীন প্রজেকশন বন্ধ হয়ে যায় তখন আপনার অ্যাপ রিসোর্স প্রকাশ করে এবং তার UI আপডেট করে তা নিশ্চিত করতে, নিম্নলিখিতগুলি করুন:

  • MediaProjection.Callback এর একটি উদাহরণ তৈরি করুন।

  • কলব্যাক onStop() পদ্ধতি প্রয়োগ করুন। স্ক্রিন প্রজেকশন বন্ধ হয়ে গেলে পদ্ধতিটিকে বলা হয়। আপনার অ্যাপে থাকা যেকোন সংস্থান ছেড়ে দিন এবং প্রয়োজন অনুসারে অ্যাপ UI আপডেট করুন।

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

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

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