मीडिया प्रोजेक्शन

android.media.projection Android 5 (एपीआई लेवल 21) में पेश किए गए एपीआई की मदद से, कॉन्टेंट कैप्चर किया जा सकता है डिवाइस की स्क्रीन पर मीडिया स्ट्रीम के तौर पर दिखती है. इसे रिकॉर्ड या कास्ट करके, वापस चलाया जा सकता है अन्य डिवाइस, जैसे कि टीवी.

Android 14 (एपीआई लेवल 34) में, ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा दी गई है. इसकी मदद से, लोग ये काम कर सकते हैं डिवाइस की पूरी स्क्रीन शेयर करने के बजाय एक ही ऐप्लिकेशन की विंडो शेयर करें विंडोइंग मोड इस्तेमाल करना होगा. ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा में स्टेटस बार, नेविगेशन बार, और शेयर किए गए डिसप्ले से मिलने वाले दूसरे सिस्टम यूज़र इंटरफ़ेस (यूआई) एलिमेंट—यहां तक कि जब किसी ऐप्लिकेशन को फ़ुल स्क्रीन में कैप्चर करने के लिए, स्क्रीन शेयर करने की सुविधा का इस्तेमाल किया जाता है. सिर्फ़ चुने गए ऐप्लिकेशन का कॉन्टेंट शेयर किया जाता है.

ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा, उपयोगकर्ता की निजता को पक्का करती है, बेहतर काम करती है, और उपयोगकर्ताओं को एक से ज़्यादा ऐप्लिकेशन चलाने की सुविधा देकर, मल्टीटास्किंग को बेहतर बनाता है कॉन्टेंट शेयर करने की सुविधा मिलती है.

तीन डिसप्ले

मीडिया प्रोजेक्शन, डिवाइस की डिसप्ले या ऐप्लिकेशन विंडो के कॉन्टेंट को कैप्चर करता है और फिर कैप्चर की गई इमेज को वर्चुअल डिसप्ले पर प्रोजेक्ट करता है, जो इमेज को Surface.

रीयल डिवाइस डिसप्ले को वर्चुअल डिसप्ले पर प्रोजेक्ट किया गया. इसकी सामग्री
              ऐप्लिकेशन के दिए गए `Surface` पर लिखा गया वर्चुअल डिसप्ले.
पहली इमेज. डिवाइस की स्क्रीन या ऐप्लिकेशन की विंडो, जिस पर प्रोजेक्ट की गई हो वर्चुअल डिसप्ले. ऐप्लिकेशन के दिए गए पते पर लिखा गया वर्चुअल डिसप्ले Surface.

यह ऐप्लिकेशन, नीचे दिए गए तरीकों की मदद से Surface उपलब्ध कराता है: MediaRecorder, SurfaceTexture या ImageReader, जो कैप्चर किए गए डिसप्ले के कॉन्टेंट को ऐक्सेस करता है. साथ ही, रेंडर की गई इमेज को मैनेज करने की सुविधा देता है Surface पर रीयल टाइम में. इमेज को रिकॉर्डिंग या कास्ट के तौर पर सेव किया जा सकता है टीवी या अन्य डिवाइस पर कनेक्ट कर सकते हैं.

रीयल डिसप्ले

मीडिया प्रोजेक्शन सेशन शुरू करने के लिए ऐसा टोकन पाएं जो आपके ऐप्लिकेशन को डिवाइस के डिसप्ले या ऐप्लिकेशन विंडो के कॉन्टेंट को कैप्चर करने की सुविधा. टोकन को MediaProjection क्लास.

इसके getMediaProjection() तरीके का इस्तेमाल करें: MediaProjection इंस्टेंस बनाने के लिए, MediaProjectionManager सिस्टम सेवा आप कोई नई गतिविधि शुरू करते हैं. गतिविधि शुरू करने के लिए, स्क्रीन की जानकारी देने का createScreenCaptureIntent() तरीका कैप्चर कार्रवाई:

Kotlin

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())

Java

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());

वर्चुअल डिसप्ले

मीडिया प्रोजेक्शन का केंद्र हिस्सा वर्चुअल डिसप्ले होता है, जिसे आप बनाते हैं कॉल करके createVirtualDisplay() MediaProjection इंस्टेंस पर:

Kotlin

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

Java

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

width और height पैरामीटर से वर्चुअल डाइमेंशन की जानकारी मिलती है डिसप्ले. चौड़ाई और ऊंचाई की वैल्यू पाने के लिए, WindowMetrics एपीआई लॉन्च किए गए Android 11 (एपीआई लेवल 30) में. (जानकारी के लिए, मीडिया प्रोजेक्शन साइज़ सेक्शन.)

Surface

मीडिया प्रोजेक्शन सरफ़ेस का साइज़ इस तरह रखें कि आउटपुट सही हो का रिज़ॉल्यूशन. टीवी पर स्क्रीन कास्ट करने के लिए, स्क्रीन के सरफ़ेस को बड़ा (कम रिज़ॉल्यूशन) बनाएं या कंप्यूटर मॉनिटर और डिवाइस के डिसप्ले रिकॉर्डिंग के लिए छोटे (हाई रिज़ॉल्यूशन) का इस्तेमाल करें.

Android 12L (एपीआई लेवल 32) के बाद से, सिस्टम, कॉन्टेंट को एक जैसा स्केल करता है. इससे आसपेक्ट रेशियो (लंबाई-चौड़ाई का अनुपात) बना रहता है. ताकि कॉन्टेंट के दोनों डाइमेंशन (चौड़ाई और ऊंचाई) बराबर या कम हों डाइमेंशन की तुलना में आसानी से हो सकता है. इसके बाद, कैप्चर किया गया कॉन्टेंट केंद्र में रखा गया है.

Android 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 टोकन कॉल करने के लिए, इसका इस्तेमाल सिर्फ़ एक बार किया जाना चाहिए.

Android 14 या उसके बाद वाले वर्शन पर, createVirtualDisplay() तरीका SecurityException अगर आपके ऐप्लिकेशन इनमें से कोई एक काम करता है:

  • यह createScreenCaptureIntent() से getMediaProjection() पर लौटाए गए Intent इंस्टेंस को एक से ज़्यादा बार पास करता है
  • एक ही MediaProjection पर createVirtualDisplay() को एक से ज़्यादा बार कॉल किया जा रहा है इंस्टेंस

मीडिया प्रोजेक्शन साइज़

मीडिया प्रोजेक्शन, डिवाइस के पूरे डिसप्ले या ऐप्लिकेशन की विंडो को कैप्चर कर सकता है विंडोिंग मोड पर ध्यान दिए बिना.

शुरुआती साइज़

फ़ुल-स्क्रीन मीडिया प्रोजेक्शन के साथ, आपके ऐप्लिकेशन को डिवाइस की स्क्रीन. ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा के तहत, आपका ऐप्लिकेशन यह पता नहीं लगा पाएगा कि कैप्चर किए गए डिसप्ले का साइज़. इसलिए, किसी भी मीडिया प्रोजेक्शन का शुरुआती साइज़, डिवाइस की स्क्रीन का साइज़ होता है.

WindowManager प्लैटफ़ॉर्म का इस्तेमाल करें वैल्यू वापस करने का getMaximumWindowMetrics() तरीका WindowMetrics ऑब्जेक्ट के लिए डिवाइस की स्क्रीन, भले ही मीडिया प्रोजेक्शन होस्ट ऐप्लिकेशन मल्टी-विंडो में हो मोड की मदद से, डिसप्ले का सिर्फ़ कुछ हिस्सा इस्तेमाल किया जा रहा है.

एपीआई लेवल 14 के साथ काम करने के लिए, WindowMetricsCalculator computeMaximumWindowMetrics() का इस्तेमाल करें Jetpack WindowManager लाइब्रेरी से लिया गया तरीका शामिल है.

डिवाइस के डिसप्ले की चौड़ाई और ऊंचाई जानने के लिए, WindowMetrics getBounds() तरीके को कॉल करें.

साइज़ में बदलाव

डिवाइस को घुमाने पर मीडिया प्रोजेक्शन का आकार बदल सकता है या उपयोगकर्ता, ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा में कैप्चर क्षेत्र के तौर पर किसी ऐप्लिकेशन विंडो को चुनता है. मीडिया प्रोजेक्शन तब लेटरबॉक्स किया जा सकता है, जब कैप्चर की गई सामग्री जब मीडिया को रिपोर्ट करने के लिए चुना गया हो, तब मीडिया प्रोजेक्शन सेट अप किया गया.

यह सुनिश्चित करने के लिए कि मीडिया प्रोजेक्शन कैप्चर किए गए मीडिया के आकार के साथ सटीक रूप से अलाइन है कैप्चर किए गए किसी भी क्षेत्र और डिवाइस रोटेशन के लिए, कैप्चर की गई इमेज का साइज़ बदलने के लिए, onCapturedContentResize() कॉलबैक. (और ज़्यादा जानकारी के लिए, कस्टमाइज़ेशन सेक्शन देखें.

पसंद के मुताबिक बनाएं

आपका ऐप्लिकेशन नीचे दी गई चीज़ों के साथ मीडिया प्रोजेक्शन उपयोगकर्ता अनुभव को पसंद के मुताबिक बना सकता है MediaProjection.Callback एपीआई:

  • onCapturedContentVisibilityChanged(): होस्ट ऐप्लिकेशन (वह ऐप्लिकेशन जिसने मीडिया प्रोजेक्शन शुरू किया) को दिखाने या शेयर किया गया कॉन्टेंट छिपाने के लिए.

    कैप्चर किए गए क्षेत्र उपयोगकर्ता को दिखता है. उदाहरण के लिए, अगर आपका ऐप्लिकेशन और ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) में कैप्चर किया गया कॉन्टेंट दिखा रहा हो और उपयोगकर्ता को कैप्चर किया गया ऐप्लिकेशन भी दिखता है (जैसा कि यहां दिखाया गया है) कॉलबैक), उपयोगकर्ता को एक ही कॉन्टेंट दो बार दिखता है. अपडेट करने के लिए कॉलबैक का इस्तेमाल करें कैप्चर की गई सामग्री को छिपाने और आपके डिवाइस में लेआउट स्पेस खाली करने के लिए अपने ऐप्लिकेशन के यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल करें अन्य कॉन्टेंट के लिए ऐप्लिकेशन.

  • onCapturedContentResize(): इससे होस्ट ऐप्लिकेशन को वर्चुअल स्क्रीन पर मीडिया प्रोजेक्शन का साइज़ बदलने की अनुमति मिलती है कैप्चर किए गए साइज़ के आधार पर डिसप्ले और मीडिया प्रोजेक्शन Surface डिसप्ले क्षेत्र.

    यह तब ट्रिगर होता है, जब कैप्चर किया गया कॉन्टेंट—एक ऐप्लिकेशन विंडो या फ़ुल स्क्रीन मोड में हो डिवाइस का डिसप्ले—डिवाइस के रोटेशन या कैप्चर किए गए डिवाइस की वजह से साइज़ बदलता है ऐप किसी दूसरे विंडोिंग मोड में जा रहा है). दोनों का साइज़ बदलने के लिए इस एपीआई का इस्तेमाल करें वर्चुअल डिसप्ले और सरफ़ेस, ताकि यह पक्का किया जा सके कि आसपेक्ट रेशियो, कैप्चर किए गए आसपेक्ट रेशियो से मेल खाता हो और कैप्चर लेटरबॉक्स नहीं किया गया है.

संसाधन वापस पाना

आपके ऐप्लिकेशन को MediaProjection रजिस्टर करना चाहिए onStop() मीडिया प्रोजेक्शन सेशन बंद होने और बनने पर सूचना पाने के लिए कॉलबैक अमान्य. सेशन बंद होने पर, आपके ऐप्लिकेशन को उन रिसॉर्स को रिलीज़ करना चाहिए जो जैसे कि वर्चुअल डिस्प्ले और प्रोजेक्शन सतह. A रोका गया मीडिया प्रोजेक्शन सेशन में अब नया वर्चुअल डिसप्ले नहीं बनाया जा सकता, भले ही आपके ऐप्लिकेशन ने उस मीडिया प्रोजेक्शन के लिए पहले से कोई वर्चुअल डिसप्ले नहीं बनाया है.

कॉलबैक को तब कॉल किया जाता है जब मीडिया प्रोजेक्शन खत्म हो जाता है, या तो क्योंकि उपयोगकर्ता मैन्युअल रूप से सेशन को रोक देता है या सिस्टम इस सेशन को कोई वजह है.

अगर आपका ऐप्लिकेशन कॉलबैक रजिस्टर नहीं करता है, तो createVirtualDisplay() पर किया जाने वाला कोई भी कॉल थ्रो IllegalStateException.

ऑप्ट आउट करें

Android 14 या उसके बाद के वर्शन में, ऐप्लिकेशन की स्क्रीन शेयर करने की सुविधा डिफ़ॉल्ट रूप से चालू होती है. हर मीडिया प्रोजेक्शन सेशन से उपयोगकर्ताओं को ऐप्लिकेशन विंडो या पूरे डिसप्ले पर दिखेगा.

आपका ऐप्लिकेशन इस createScreenCaptureIntent(MediaProjectionConfig) तरीका को कॉल करके एक MediaProjectionConfig तर्क के साथ createConfigForDefaultDisplay().

createScreenCaptureIntent(MediaProjectionConfig) को कॉल किया गया को किए गए कॉल से MediaProjectionConfig तर्क लौटाया गया createConfigForUserChoice() एक जैसा है डिफ़ॉल्ट व्यवहार के रूप में किया जाता है, यानी createScreenCaptureIntent().

साइज़ बदलने की सुविधा वाले ऐप्लिकेशन

अपने मीडिया प्रोजेक्शन ऐप्लिकेशन का साइज़ बदलने की सुविधा हमेशा चालू रखें (resizeableActivity="true"). साइज़ बदलने की सुविधा ऐप्लिकेशन में, डिवाइस कॉन्फ़िगरेशन में बदलाव करने और मल्टी-विंडो मोड की सुविधा काम करती है (देखें मल्टी-विंडो (एक से ज़्यादा विंडो) की सुविधा).

अगर आपके ऐप्लिकेशन का साइज़ नहीं बदला जा सकता, तो उसे किसी विंडो से डिसप्ले की सीमा के लिए क्वेरी करनी चाहिए का संदर्भ इस्तेमाल करें और getMaximumWindowMetrics() का इस्तेमाल करके,WindowMetrics ऐप्लिकेशन के लिए ज़्यादा से ज़्यादा डिसप्ले एरिया :

Kotlin

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

Java

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

अन्य संसाधन

मीडिया प्रोजेक्शन के बारे में और जानकारी के लिए, देखें वीडियो और ऑडियो को कैप्चर करना.