Android - هل يمكنني كتم تشغيل تطبيقات الصوت حاليًا؟

StackOverflow https://stackoverflow.com/questions/1993471

سؤال

مرحبًا ، أنا جديد على هذا. مشروع التدريس الذاتي الخاص بي هو تطبيق صغير يلعب دفق أخبار صوتية. لكي تكون فعالة ، يحتاج التطبيق حقًا إلى مقاطعة أي مشغلات وسائط تشغيل حاليًا (على سبيل المثال: Last FM ، Imeem ، مشغل الموسيقى ، Spotify إلخ).

لا أعرف ما الذي سيلعب أو ما هو التطبيق الذي سيلعبه ، لكني أريد أن أطلب منهم جميعًا التوقف إلى أن أفعل. يبدو أن الأصوات جريئة إلى حد ما ، ولكن يجب أن يكون ذلك ممكنًا ، لأنه عندما تكون هناك مكالمة واردة ، فهذا ما يحدث بشكل أساسي.

هل يمكنني إرسال رسالة إلى جميع مشغلات الصوت التي تطلب منهم التوقف للحظة؟ هل يمكنني محاداة مكالمة واردة ، فقط للوقت الذي يستغرقه؟

شكرًا.

هل كانت مفيدة؟

المحلول

سيكون معالجة الصوت على Android فظيعة للغاية لفترة من الوقت. واجهات برمجة التطبيقات غريبة إلى حد ما ، موثقة بشكل سيئ ، وتستمر في تغيير/إهمال/كسر بين الإصدارات. حتى ال AudioManager الكود لديه إصلاحات فيه.

على أي حال ، هناك العديد من أنواع الدفق في Android (الموسيقى ، والإشعارات ، والمكالمات الهاتفية ، وما إلى ذلك) ، وتهدف التطبيقات إلى اختيار الأناقة المناسبة للتشغيل. أتصور أن غالبية تطبيقات Android يجب أن تستخدم نوع الموسيقى/الوسائط (STREAM_TYPE_MUSIC). قمت بتعيين هذا على الخاص بك MediaPlayer باستخدام setAudioStreamType طريقة.

يسمح لك SDK بتعيين دفق واحد يكتب بصفتي منفرداً - تسبب في صامتة جميع التدفقات الأخرى - لكنني لا أعتقد أنه يمكنك تحديد الصوت الذي يتم تشغيله من خلال تطبيقات معينة وإيقافها/إلغاء تنظيمها بطريقة أو بأخرى. سوف تستخدم تطبيقات الموسيقى بشكل عام PhoneStateListener لإيقاف أنفسهم عندما تأتي مكالمة.

لذلك في حالتك ، يمكنك "استعارة" دفق المكالمات الهاتفية لك MediaPlayer واستخدم استدعاء الطريقة AudioManager.setStreamSolo(AudioManager.STREAM_VOICE_CALL, true) عندما يبدأ التشغيل ، ثم قم بإلغاء سولو تيار مع false عند التشغيل أو الخاص بك Activity تم.

أستطيع أن أخبركم أن هذا يعمل ، لكن لا يمكنني تذكر ما إذا كنت بحاجة إلى ضبط الصوت أيضًا الوضع ل MODE_IN_CALL عند استخدام دفق المكالمات الصوتية (مثل هذا: AudioManager.setMode(AudioManager.MODE_IN_CALL)). إذا وجدت ذلك مطلوبًا ، فأنت بحاجة إلى التأكد من إرجاع الوضع إلى MODE_NORMAL بمجرد الانتهاء من التشغيل ، وإلا عندما تضغط على مفاتيح الصوت الصلبة ، سيقول "وحدة التخزين في الطلب"! ومع ذلك ، إذا كنت تريد العودة إلى MODE_NORMAL, ، يجب عليك التحقق من أن مكالمة هاتفية حقيقية لا تحدث في ذلك الوقت ...

ربما يمكنك استخدام نوع دفق آخر بدلاً من صوت الاتصال الصوتي ، لكنني أتحدث فقط من تجربة العمل على تطبيق يمكنه استخدام مكبر الصوت أو سماعة الأذن لتشغيل الصوت ، وهو ما يستوجب استخدام دفق المكالمة الصوتية.

كما قلت ، معالجة الصوت ليست ممتعة بشكل خاص ... ؛)

نصائح أخرى

لقد مر عامان. لكن آمل أن يساعد هذا شخص ما:

AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);

ملحوظة: إذا اتصلت setstreammute (int ، منطقية) لكتم الدفق ن مرات ، يجب أن تسميها ن مرات مرة أخرى لإلغاء كتم (الاستخدام false).

يمكنك المحاولة Audiomanager.adjustvolume طريقة:

AudioManager audioMan = 
    (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioMan.adjustVolume(AudioManager.ADJUST_LOWER,
    AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top