इस दस्तावेज़ में, संभावित समस्याओं वाले दो क्षेत्रों के बारे में बताया गया है.
राज्य. "Medialayer` के साथ, कुछ कार्रवाइयां सिर्फ़ कुछ खास स्थितियों में ही मान्य होती हैं. गलत तरीके से कार्रवाइयां करने पर, अपवाद या अनचाहा व्यवहार हो सकता है.
संसाधन कॉन्फ़िगरेशन में बदलाव करने पर, जैसे कि स्क्रीन घुमाना, आपको सिस्टम के संसाधनों को खाली करने और संसाधनों के खत्म होने से बचने के लिए,
MediaPlayer
ऑब्जेक्ट को रिलीज़ करना होगा.
स्टेट मैनेज करना
MediaPlayer
, स्टेटस पर आधारित है. इसका मतलब है कि इसमें एक आंतरिक स्थिति होती है, जिसे कोड लिखते समय हमेशा ध्यान में रखना चाहिए. ऐसा इसलिए, क्योंकि कुछ कार्रवाइयां सिर्फ़ तब मान्य होती हैं, जब प्लेयर किसी खास स्थिति में हो. अगर गलत स्थिति में कोई कार्रवाई की जाती है, तो सिस्टम में कोई अपवाद दिख सकता है या कोई और गड़बड़ी हो सकती है.
MediaPlayer
क्लास के दस्तावेज़ में स्टेटस डायग्राम से यह पता चलता है कि कौनसे तरीके MediaPlayer
को एक स्टेटस से दूसरे स्टेटस में ले जाते हैं. उदाहरण के लिए:
- नया
MediaPlayer
बनाने पर, वह इनऐक्टिव स्थिति में होता है. - इसे
setDataSource()
को कॉल करके शुरू किया जाता है. इससे यह शुरू किया गया स्टेटस में बदल जाता है. - इसे
prepare()
याprepareAsync()
तरीका इस्तेमाल करके तैयार किया जाता है. MediaPlayer
तैयार होने के बाद, वहPrepared
स्थिति में चला जाता है. इसका मतलब है कि मीडिया चलाने के लिए,start()
को कॉल किया जा सकता है.
डायग्राम में दिखाए गए तरीके से, Started
, Paused
, और PlaybackCompleted
स्टेटस के बीच स्विच किया जा सकता है. इसके लिए, start()
, pause()
, और seekTo()
जैसे तरीकों का इस्तेमाल किया जा सकता है.
हालांकि, stop()
को कॉल करने के बाद, start()
को फिर से तब तक कॉल नहीं किया जा सकता, जब तक MediaPlayer
को फिर से तैयार नहीं किया जाता.
MediaPlayer
ऑब्जेक्ट के साथ इंटरैक्ट करने वाला कोड लिखते समय, स्टेटस डायग्राम को हमेशा ध्यान में रखें. ऐसा इसलिए, क्योंकि गलत स्टेटस से उसके तरीकों को कॉल करने की वजह से, अक्सर गड़बड़ियां होती हैं.
MediaPlayer को रिलीज़ करना
MediaPlayer
, सिस्टम के अहम संसाधनों का इस्तेमाल कर सकता है. इसलिए, आपको हमेशा यह पक्का करना चाहिए कि आप MediaPlayer
इंस्टेंस को ज़रूरत से ज़्यादा समय तक इस्तेमाल न कर रहे हों. काम पूरा होने के बाद, आपको हमेशा release()
को कॉल करना चाहिए, ताकि यह पक्का किया जा सके कि इसके लिए जोड़े गए सिस्टम संसाधन सही तरीके से रिलीज़ हो गए हैं.
उदाहरण के लिए, अगर MediaPlayer
का इस्तेमाल किया जा रहा है और आपकी गतिविधि को onStop()
का कॉल मिलता है, तो आपको MediaPlayer
को रिलीज़ करना होगा. ऐसा इसलिए, क्योंकि जब आपकी गतिविधि उपयोगकर्ता के साथ इंटरैक्ट नहीं कर रही है, तब इसे होल्ड करने का कोई मतलब नहीं है. हालांकि, अगर बैकग्राउंड में मीडिया चलाया जा रहा है, तो इसे रिलीज़ करने की ज़रूरत नहीं है. इस बारे में अगले सेक्शन में बताया गया है.
जब आपकी गतिविधि फिर से शुरू या फिर से चालू की जाती है, तो वीडियो चलाने से पहले आपको एक नया MediaPlayer
बनाना होगा और उसे फिर से तैयार करना होगा.
MediaPlayer
को रिलीज़ करने और फिर उसे रद्द करने का तरीका यहां बताया गया है:
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
उदाहरण के लिए, गतिविधि रुकने पर MediaPlayer
को रिलीज़ न करने और फिर से शुरू होने पर नया MediaPlayer
बनाने पर होने वाली समस्याओं पर विचार करें. जब उपयोगकर्ता स्क्रीन का ओरिएंटेशन बदलता है या डिवाइस के कॉन्फ़िगरेशन में किसी और तरह से बदलाव करता है, तो सिस्टम डिफ़ॉल्ट रूप से ऐक्टिविटी को रीस्टार्ट कर देता है. जब उपयोगकर्ता डिवाइस को पोर्ट्रेट और लैंडस्केप मोड के बीच बार-बार घुमाता है, तो हो सकता है कि आपके सिस्टम के सभी संसाधन जल्दी खत्म हो जाएं. ऐसा इसलिए होता है, क्योंकि ओरिएंटेशन में हर बदलाव के साथ, एक नया MediaPlayer
बनता है, जिसे कभी रिलीज़ नहीं किया जाता.
रनटाइम रीस्टार्ट के बारे में ज़्यादा जानकारी के लिए, रनटाइम में होने वाले बदलावों को मैनेज करना लेख पढ़ें.
आपको शायद यह जानना हो कि अगर उपयोगकर्ता आपकी गतिविधि छोड़ने के बाद भी, "बैकग्राउंड में मीडिया" चलाना जारी रखना है, तो क्या होगा. यह ठीक उसी तरह होगा जिस तरह डिवाइस में पहले से मौजूद Music ऐप्लिकेशन काम करता है. इस मामले में, आपको किसी सेवा के कंट्रोल में থাকা MediaPlayer
की ज़रूरत है. इस बारे में अगले सेक्शन में बताया गया है
ज़्यादा जानें
आपके ऐप्लिकेशन में मीडिया चलाने के लिए, Jetpack Media3 का सुझाव दिया जाता है. इसके बारे में ज़्यादा पढ़ें.
इन पेजों पर, ऑडियो और वीडियो रिकॉर्ड करने, सेव करने, और चलाने से जुड़े विषयों के बारे में बताया गया है: