MediaSessionCompat FLAG_IMMUTABLE/FLAG_MUTABLE: Kotlin में पूर्ण समाधान

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Android 12 और उससे ऊपर का "टूटा हुआ" प्लेयर

\n

कल्पना करें: आप गर्व से अपने प्लेयर या पॉडकास्ट क्लाइंट ऐप का अपडेट प्रकाशित करते हैं। कुछ दिन बीतते हैं, और समीक्षा अनुभाग में गुस्से भरी टिप्पणियाँ आने लगती हैं: "अपडेट के बाद संगीत बजना बंद हो गया!", "लॉक स्क्रीन पर बटन काम नहीं कर रहे!", "ट्रैक चलाने की कोशिश करने पर ऐप क्रैश हो जाता है!"। परिचित लगता है? सबसे अधिक संभावना है, आप उसी त्रुटि का सामना कर रहे हैं जो दुनिया भर के हजारों डेवलपर्स को परेशान करती है:

\n
MediaSessionCompat: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent
\n

यह समस्या Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है (दसियों हज़ार व्यूज़), और यह सीधे Android 12 (API level 31) में बदलावों से संबंधित है। अच्छी खबर: समाधान सरल है और इसमें आपको 10 मिनट से अधिक नहीं लगेंगे। इस लेख में हम त्रुटि के कारणों, Kotlin में सही समाधान और सर्वोत्तम प्रथाओं पर चर्चा करेंगे, ताकि आपका ऐप फिर से सुचारू रूप से काम करे।

\n\n

त्रुटि क्यों होती है? PendingIntent को समझना

\n

समस्या की जड़ को समझने के लिए, हमें यह याद रखना होगा कि MediaSessionCompat कैसे काम करता है। यह एक घटक है जो आपके ऐप को सिस्टम मीडिया नियंत्रणों: हेडसेट बटन, लॉक स्क्रीन, नोटिफिकेशन पैनल के साथ इंटरैक्ट करने की अनुमति देता है। इसके लिए, यह एक PendingIntent बनाता है - सिस्टम सेवाओं के लिए एक प्रकार का "विलंबित कॉल"। सिस्टम इस Intent का उपयोग आपके ऐप को यह बताने के लिए करता है: "उपयोगकर्ता ने Play/Pause/Next दबाया"।

\n

Android 12 (API 31) से शुरू करके, Google ने PendingIntent के लिए सुरक्षा आवश्यकताओं को कड़ा कर दिया है। पहले, डेवलपर्स FLAG_IMMUTABLE या FLAG_MUTABLE फ़्लैग निर्दिष्ट नहीं कर सकते थे, और सिस्टम डिफ़ॉल्ट रूप से परिवर्तनीय (mutable) विकल्प का उपयोग करता था। अब आपको स्पष्ट रूप से बताना होगा कि क्या सिस्टम आपके Intent की सामग्री को बनाने के बाद बदल सकता है। यदि आप ऐसा नहीं करते हैं - तो आपको ऐप क्रैश मिलेगा। Android 12+ ऐसे PendingIntent को बनाने की अनुमति ही नहीं देगा।

\n\n

FLAG_IMMUTABLE बनाम FLAG_MUTABLE: क्या चुनें?

\n
    \n
  • FLAG_IMMUTABLE (अनुशंसित): बनाने के बाद Intent को बदला नहीं जा सकता। यह अधिक सुरक्षित है, क्योंकि कोई दुर्भावनापूर्ण व्यक्ति डेटा को प्रतिस्थापित नहीं कर सकता है। इस फ़्लैग का उपयोग 90% मामलों में करें, जिसमें MediaSessionCompat भी शामिल है।
  • \n
  • FLAG_MUTABLE: Intent को बदला जा सकता है। केवल विशेष मामलों में आवश्यक है, उदाहरण के लिए, यदि आप गतिशील डेटा की आवश्यकता वाली क्रियाओं के साथ NotificationCompat का उपयोग कर रहे हैं, या AlarmManager के साथ काम कर रहे हैं।
  • \n
\n

MediaSessionCompat और मीडिया सूचनाओं के लिए हमेशा FLAG_IMMUTABLE का उपयोग करें। इससे आपके ऐप की सुरक्षा और स्थिरता बढ़ती है।

\n\n

Kotlin में चरण-दर-चरण सुधार

\n

आइए देखें कि विशिष्ट कोड कैसा दिखता है जो त्रुटि का कारण बनता है, और इसे कैसे ठीक किया जाए। अक्सर, समस्या आपकी सेवा या मीडिया ब्राउज़र की onCreate() विधि में उत्पन्न होती है।

\n\n

गलत कोड (Android 12+ पर क्रैश का कारण बनेगा)

\n
// पुराना तरीका - बिना फ़्लैग निर्दिष्ट किए\nval pendingIntent = PendingIntent.getActivity(\n    this,\n    0,\n    Intent(this, MainActivity::class.java),\n    0 // <-- त्रुटि! कोई FLAG_IMMUTABLE या FLAG_MUTABLE नहीं\n)
\n\n

Kotlin में सही कोड (सुधार)

\n

बस अंतिम पैरामीटर में PendingIntent.FLAG_IMMUTABLE जोड़ें:

\n
val pendingIntent = PendingIntent.getActivity(\n    this,\n    0,\n    Intent(this, MainActivity::class.java),\n    PendingIntent.FLAG_IMMUTABLE // <-- समाधान!\n)
\n

यदि आपका ऐप Android के पुराने संस्करणों (API 31 से नीचे) का समर्थन करता है, तो पुराने उपकरणों पर क्रैश से बचने के लिए सशर्त जाँच का उपयोग करें:

\n
val flags = if (Build.VERS                

ब्लॉग

पुस्तक अनुशंसाएँ