2012-12-19 12 views
16

से ऑडियो मैं फ़ोन के इयरपीस में एक फ़ाइल से ऑडियो खेलने के लिए चाहते हैं (या इस बात का हैडसेट कनेक्ट होने पर) एंड्रॉयड MediaPlayer का उपयोग कर। मैंने इस थ्रेड में सुझाए गए MODE_IN_CALL हैक का उपयोग करने का प्रयास किया - Android - Getting audio to play through earpiece लेकिन इससे मदद नहीं मिली। एप्लिकेशन भी android.permission.MODIFY_AUDIO_SETTINGS की अनुमति है, लेकिन m_amAudioManager.setSpeakerphoneOn(false); के लिए किसी भी कॉल को नजरअंदाज कर दिया जाता है।एंड्रॉयड - प्ले इयरपीस

private AudioManager m_amAudioManager; 
m_amAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
m_amAudioManager.setMode(AudioManager.MODE_IN_CALL); 
m_amAudioManager.setSpeakerphoneOn(false); 

MediaPlayer पर setMode(AudioManager.STREAM_VOICE_CALL); को एक कॉल या तो मदद नहीं की।

mediaPlayer.reset(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
mediaPlayer.setDataSource(path); 
mediaPlayer.prepare(); 

क्या इस कोड को तोड़ने के लिए एंड्रॉइड 2.3 के बाद से कुछ बदल गया है? मैंने बिना किसी सफलता के एंड्रॉइड आईसीएस पर कोड की कोशिश की। क्या कोई मुझे सही दिशा दिखा सकता है ? ऑडियो अब तक स्पीकर फोन से हमेशा खेलता है।

+0

कृपया मेरा उत्तर यहाँ की जाँच करें: http://stackoverflow.com/a/29881184/672773 आशा है कि इसकी मदद करता है :) – Machete

उत्तर

27

यह यह करने के लिए सही तरीके से पता चला है निम्नलिखित कोड के माध्यम से है।

कान टुकड़ा

mediaPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

प्ले के माध्यम से खेलने के स्पीकर फोन

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

कि यह है के माध्यम से। कोई अन्य समाधान (यहां पोस्ट किए गए एक सहित ->Android - Getting audio to play through earpiece) लगातार डिवाइस पर काम नहीं करता है। वास्तव में MODE_IN_CALL का उपयोग करके यह सुनिश्चित करता है कि आपका ऑडियो कभी भी कुछ डिवाइसों पर नहीं चलाएगा।

नोट: आपको मीडिया प्लेयर को स्ट्रीम बदलने के लिए फिर से तैयार करने की आवश्यकता होगी।

+0

मुझे इसे आजमा देना होगा। मैं उस पोस्ट से समाधान का उपयोग कर रहा हूं जिसे आपने वास्तविक मुद्दे के बिना वर्षों तक संदर्भित किया है। मेरे पास अन्य ऐप्स में ऑडियो में अजीब परिवर्तनों की कुछ यादृच्छिक शिकायतें हैं, लेकिन इन्हें कभी पुष्टि नहीं की जा सकती है। मैं इसे देख लूंगा, यह निश्चित रूप से एक बेहतर समाधान की तरह लगता है। मुझे कभी पसंद नहीं आया कि मेरा समाधान कैसे देखा, इसके माध्यम से भी काम किया। – Piwaf

+0

विशेष रूप से, सैमसंग गैलेक्सी एस 2 और माइक्रोमैक्स पर चल रहे फर्मवेयर के कुछ संस्करण दूसरे पोस्ट में समाधान के साथ परेशानी में भाग लेते हैं। यदि आप अभी भी इसका उपयोग कर रहे हैं, तो मैं इस कोड खंड में जाने का सुझाव दूंगा। यह अब तक मुझे असफल नहीं रहा है। –

+0

यह इस दृष्टिकोण के साथ प्रकट होता है कि आपको मोड स्विच करते समय मेडियलप्लेयर को फिर से तैयार करने की आवश्यकता होती है। क्या यह आपका अनुभव भी है? – Piwaf

0

कैसे तो इस बारे में:

// Make sure that streams following the PHONE routing strategy aren't forced 
// to play in the speaker. 
Class audioSystemClass = Class.forName("android.media.AudioSystem"); 
Method setForceUse = audioSystemClass.getMethod("setForceUse", 
    int.class, 
    int.class); 
// First 0 == FOR_COMMUNICATION, second 0 == FORCE_NONE. 
setForceUse.invoke(null, 0, 0); 

फिर अपने MediaPlayer के लिए STREAM_VOICE_CALL का उपयोग करें।

यदि setForceUse कॉल सफल होता है और आपके मीडियाप्लेयर से ऑडियो अभी भी लाउडस्पीकर में चलता है, तो मैं कहूंगा कि आप जिस फोन/टैबलेट पर परीक्षण कर रहे हैं उस पर ऑडियो पॉलिसी मैनेजर कार्यान्वयन में कुछ गड़बड़ है।

+0

फोन अन्य एप्लिकेशन पर इयरपीस से खेलने के लिए सक्षम है। मैं इसे अकेले अपने ऐप पर काम नहीं कर पा रहा हूं। –

+0

@Gaffi: लगता है जैसे आप रनटाइम त्रुटियों के बजाय संकलित समय त्रुटियां प्राप्त कर रहे हैं। शायद आपने प्रतिबिंब पैकेज आयात नहीं किया है? यदि आप ग्रहण का उपयोग करते हैं तो इसे स्वचालित रूप से उन मुद्दों को हल करने के सुझावों को सुझाव देना चाहिए। – Michael

3

मैं सिर्फ के लिए दीपक बाला की उत्तर पूर्ण उदाहरण जोड़ना चाहते थे। यह काम करता है जब MediaPlayer.create() विधि का उपयोग नहीं:

this.player = new MediaPlayer(); 
    this.player.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 

    try { 
     this.player.setDataSource(getContext(), Uri.fromFile(new File(m.localFileUrl))); 
     this.player.prepare(); 
    } catch (IllegalStateException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
0

मैंने पाया मैं दोनों मीडियाप्लेयर और Audiomanager

स्थापित करने के लिए
private MediaPlayer mp = new MediaPlayer(); 
AudioManager mAudioManager = (AudioManager) v.getContext() 
           .getSystemService(Context.AUDIO_SERVICE); 
         mAudioManager.setSpeakerphoneOn(false); 
         mp.setAudioStreamType(AudioManager.STREAM_VOICE_CALL); 
0

This method मेरे लिए ठीक काम कर रहा है की जरूरत है।

आप ऑडियो प्रबंधक मोड भी सेट करना होगा। और फिर audiomgr.setSpeakerphoneOn (false) api का उपयोग करके आप टॉगल कर सकते हैं।

AudioManager audiomgr = (AudioManager) 
    context.getSystemService(Context.AUDIO_SERVICE); 
audiomgr.setMode(AudioManager.STREAM_MUSIC); 
audiomgr.setSpeakerphoneOn(false); 
0

निम्नलिखित कोड मेरे लिए ठीक काम करता है और मैं कई उपकरणों पर में परीक्षण किया है: आप के लिए मात्रा सेट करना चाहते हैं

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing); 
AudioManager mAudioManager = ((AudioManager).getSystemService(Context.AUDIO_SERVICE)); 

2-:

1- बनाने उदाहरणों अधिकतम (वैकल्पिक)

int maxVolumeMusic = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolumeMusic, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE); 
mAudioManager.setMode(AudioManager.STREAM_MUSIC); 

3- ऑडियो सेट करें इयरपीस से खेलने:

mAudioManager.setSpeakerphoneOn(false); 

4- खेलने:

mPlayer.setLooping(true); 
mPlayer.start(); 

हो गया !!!! लेकिन वहाँ कुछ सुझाव है मैं आपके साथ साझा करने के लिए जा रहा हूँ:

1- चरण 2 में, यदि आप AudioManager.setStreamVolume से पहले Audiomanager.setMode() सेट() तो मात्रा अधिकतम करने के लिए सेट नहीं होता!

2- यदि आप mPlayer.setLooping (true) से पहले mPlayer.prepare() जोड़ते हैं; यह दुर्घटना का कारण बन !, आप mPlayer.prepare() का उपयोग नहीं करना चाहिए MPlayer इस तरह के आरंभ होने पर:

MediaPlayer mPlayer = MediaPlayer.create(MainActivity.this, R.raw.skype_call_dialing); 

3- चरण 2 में, mAudioManager.setMode() मैं AudioManager.STREAM_MUSIC इस्तेमाल किया, जब मैं कोशिश अन्य तरीके, कई मामलों में मैं स्पीकर को चालू और बंद करने में सक्षम नहीं था!