إدارة حالة MediaPlayer وموارده
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
يتناول هذا المستند مجالَين يتضمّنان عيوبًا محتملة.
الحالة: باستخدام Medialayer، لا تكون بعض العمليات صالحة إلا في حالات
معيّنة. يمكن أن تؤدي العمليات غير الصحيحة إلى حدوث استثناءات أو سلوك غير متوقّع.
الموارد عند إجراء تغييرات على الإعدادات، مثل تدوير الشاشة،
يجب تحرير عنصر MediaPlayer
لإخلاء موارد النظام و
تجنُّب استنفاد الموارد.
إدارة الحالة
يستند مقياس MediaPlayer
إلى الحالة. وهذا يعني أنّه يحتوي على
حالة داخلية يجب
أن تكون على دراية بها دائمًا عند كتابة الرمز البرمجي، لأنّ بعض العمليات
صالحة فقط عندما يكون المشغّل في حالات معيّنة. إذا أجريت عملية في حالة غير صحيحة، قد يُرسِل النظام استثناءً أو يتسبب في سلوكيات أخرى غير مرغوب فيها.
يوضّح مخطّط الحالة في مستندات فئة MediaPlayer
الطرق التي تنقل MediaPlayer
من حالة
إلى أخرى. مثلاً:
في هذه المرحلة، كما يوضّح الرسم البياني، يمكنك التنقل بين الحالات 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
جديد لا يتم
إطلاقه مطلقًا.
لمزيد من المعلومات عن عمليات إعادة تشغيل وقت التشغيل، يُرجى الاطّلاع على معالجة تغييرات وقت التشغيل.
قد تتساءل ماذا يحدث إذا أردت مواصلة تشغيل "مواد الوسائط في الخلفية" حتى عندما يغادر المستخدم نشاطك، تمامًا مثل السلوك الذي يتبعه
تطبيق Music المضمّن. في هذه الحالة، ما تحتاج إليه هو
MediaPlayer
تتحكم فيه خدمة، كما هو موضّح في القسم التالي.
مزيد من المعلومات
Jetpack Media3 هو الحلّ المُقترَح لتشغيل الوسائط في تطبيقك. اطّلِع على
مزيد من المعلومات حوله.
تتناول هذه الصفحات مواضيع تتعلّق بتسجيل المحتوى الصوتي
والفيديو وتخزينه وتشغيله:
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Manage MediaPlayer state and resources\n\nThis document covers two areas with potential pitfalls.\n\n- **State.** With \"Medialayer\\`, certain operations are valid only in specific\n states. Incorrect operations can cause exceptions or unexpected behavior.\n\n- **Resources** When you make configuration changes, such as screen rotation,\n You must release a `MediaPlayer` object to free up system resources and\n avoid resource exhaustion.\n\nManage state\n------------\n\n[`MediaPlayer`](/reference/android/media/MediaPlayer) is state-based. That is, it has an\ninternal state that you must\nalways be aware of when you write your code, because certain operations are only\nvalid when the player is in specific states. If you perform an operation while\nin the wrong state, the system may throw an exception or cause other undesirable\nbehaviors.\n\nThe state diagram in the [`MediaPlayer`](/reference/android/media/MediaPlayer) class documentation clarifies\nwhich methods move the [`MediaPlayer`](/reference/android/media/MediaPlayer) from one state\nto another. For example:\n\n- When you create a new [`MediaPlayer`](/reference/android/media/MediaPlayer), it is in the *Idle* state.\n- You initialize it by calling[`setDataSource()`](/reference/android/media/MediaPlayer#setDataSource(android.content.Context,%20android.net.Uri)), which changes it to the *Initialized* state.\n- You prepare it using either the [`prepare()`](/reference/android/media/MediaPlayer#prepare()) or [`prepareAsync()`](/reference/android/media/MediaPlayer#prepareAsync()) method.\n- When the [`MediaPlayer`](/reference/android/media/MediaPlayer) is done preparing, it enters the `Prepared` state, which means you can call [`start()`](/reference/android/media/MediaPlayer#start()) to make it play the media.\n\nAt that point, as the diagram illustrates, you can move between the `Started`,\n`Paused` and `PlaybackCompleted` states by calling such methods as\n[`start()`](/reference/android/media/MediaPlayer#start()), [`pause()`](/reference/android/media/MediaPlayer#pause()), and [`seekTo()`](/reference/android/media/MediaPlayer#seekTo(int)), among others.\n\nWhen you call [`stop()`](/reference/android/media/MediaPlayer#stop()), however, notice that you cannot call [`start()`](/reference/android/media/MediaPlayer#start())\nagain until you prepare the [`MediaPlayer`](/reference/android/media/MediaPlayer) again.\n\nAlways keep [the state diagram](/static/images/mediaplayer_state_diagram.gif) in mind when writing code that interacts with\na [`MediaPlayer`](/reference/android/media/MediaPlayer) object, because calling its methods from the wrong state is\na common cause of bugs.\n\nRelease the MediaPlayer\n-----------------------\n\nA [`MediaPlayer`](/reference/android/media/MediaPlayer) can consume valuable system resources. Therefore, you\nshould always take extra precautions to make sure you are not hanging on to a\n[`MediaPlayer`](/reference/android/media/MediaPlayer) instance longer than necessary. When you are done with it,\nyou should always call [`release()`](/reference/android/media/MediaPlayer#release()) to make sure any system resources\nallocated to it are properly released.\n\nFor example, if you are using a [`MediaPlayer`](/reference/android/media/MediaPlayer) and your activity receives a\ncall to [`onStop()`](/reference/android/app/Activity#onStop()), you must release the [`MediaPlayer`](/reference/android/media/MediaPlayer), because it\nmakes little sense to hold on to it while your activity is not interacting with\nthe user (unless you are playing media in the background, which is discussed in\nthe next section).\n\nWhen your activity is resumed or restarted, of course, you need to create a new\n[`MediaPlayer`](/reference/android/media/MediaPlayer) and prepare it again before resuming playback.\n\nHere's how you should release and then nullify your [`MediaPlayer`](/reference/android/media/MediaPlayer): \n\n### Kotlin\n\n mediaPlayer?.release()\n mediaPlayer = null\n\n### Java\n\n mediaPlayer.release();\n mediaPlayer = null;\n\nAs an example, consider the problems that arise if you forget to release the\n[`MediaPlayer`](/reference/android/media/MediaPlayer) when your activity stops, but create a new one when the\nactivity starts again. When the user changes the screen orientation (or changes\nthe device configuration in another way), the system restarts the activity by\ndefault. You might quickly consume all of the system resources as the user\nrotates the device back and forth between portrait and landscape, because at\neach orientation change, you create a new [`MediaPlayer`](/reference/android/media/MediaPlayer) that you never\nrelease.\n\nFor more information about runtime restarts, see [Handling Runtime Changes](/guide/topics/resources/runtime-changes).\n\nYou may be wondering what happens if you want to continue playing \"background\nmedia\" even when the user leaves your activity, much in the same way that the\nbuilt-in Music application behaves. In this case, what you need is a\n[`MediaPlayer`](/reference/android/media/MediaPlayer) controlled by a Service, as discussed in the next section\n\nLearn more\n----------\n\nJetpack Media3 is the recommended solution for media playback in your app. [Read\nmore](/media/media3) about it.\n\nThese pages cover topics relating to recording, storing, and playing back audio\nand video:\n\n- [Supported Media Formats](/guide/topics/media/media-formats)\n- [MediaRecorder](/guide/topics/media/mediarecorder)\n- [Data Storage](/guide/topics/data/data-storage)"]]