[Android] एंड्रॉइड - इयरपीस के माध्यम से खेलने के लिए ऑडियो प्राप्त करना


Answers

इस हालिया प्रश्न में कुछ संबंधित चर्चा हुई थी:
एंड्रॉइड - क्या मैं वर्तमान में ऑडियो एप्लिकेशन चला रहा हूं?

AudioManager स्रोत कोड के आधार पर, ऐसा लगता है कि setSpeakerphoneOn से पहले कोई भी प्रभाव setSpeakerphoneOn से पहले आपको "कॉल मोड" में होना चाहिए।

हालांकि, मैंने हाल ही में एक आवेदन देखा है, जो वर्तमान में मौजूदा स्ट्रीम को "मीडिया" स्ट्रीम के रूप में दिखाते समय ईमानदारी और स्पीकरफ़ोन के बीच स्विच कर सकता है, इसलिए मुझे आगे के उत्तर में दिलचस्पी होगी।

Question

मेरे पास वर्तमान में कोड है जो AudioRecord क्लास का उपयोग करते हुए डिवाइस माइक से एक रिकॉर्डिंग पढ़ता है और फिर ऑडियोट्रैक क्लास का उपयोग करके इसे वापस चलाता है

मेरी समस्या यह है कि जब मैं इसे खेलता हूं तो यह स्पीकर फोन के माध्यम से खेलता है

मैं इसे डिवाइस पर कान टुकड़े के माध्यम से खेलना चाहता हूं।

यहां मेरा कोड है:

public class LoopProg extends Activity {

 boolean isRecording; //currently not used
 AudioManager am;
 int count = 0;

 /** Called when the activity is first created. */
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        am.setMicrophoneMute(true);
        while(count <= 1000000){
        Record record = new Record();  
        record.run();
        count ++;
        Log.d("COUNT", "Count is : " + count);
        }
    } 

   public class Record extends Thread{
      static final int bufferSize = 200000;
      final short[] buffer = new short[bufferSize];
      short[] readBuffer = new short[bufferSize];

      public void run() {  
      isRecording = true;
      android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);

      int buffersize = AudioRecord.getMinBufferSize(11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT);
      AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize);
      AudioTrack atrack = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, buffersize, AudioTrack.MODE_STREAM);
      am.setRouting(AudioManager.MODE_NORMAL,1, AudioManager.STREAM_MUSIC);
      int ok = am.getRouting(AudioManager.ROUTE_EARPIECE);
      Log.d("ROUTING", "getRouting = " + ok);
      setVolumeControlStream(AudioManager.STREAM_VOICE_CALL);
      //am.setSpeakerphoneOn(true);
      Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn());
      am.setSpeakerphoneOn(false);
      Log.d("SPEAKERPHONE", "Is speakerphone on? : " + am.isSpeakerphoneOn());
      atrack.setPlaybackRate(11025);

      byte[] buffer = new byte[buffersize];
      arec.startRecording();
      atrack.play();

      while(isRecording) {
                         arec.read(buffer, 0, buffersize);
                         atrack.write(buffer, 0, buffer.length);
                         }
      arec.stop();
      atrack.stop();
      isRecording = false;
      }
   } 
}

जैसा कि आप देख सकते हैं कि मैंने जिस ऑडीओ मैनेजर क्लास का उपयोग करने की कोशिश की है और जिस तरीके से अपवर्तित सेटरूटिंग विधि और कुछ भी काम नहीं किया है, सेट स्पीकरफोनऑन पद्धति में कोई प्रभाव नहीं पड़ता है, न ही रूटिंग विधि भी है।

क्या किसी को यह पता चलता है कि स्पाकर फोन की बजाय इयरपीस के माध्यम से इसे खेलने के लिए कैसे मिलता है?




कृपया इस कोड का उपयोग करें, अच्छी तरह से काम करता है:

    //PLAY ON EARPIECE
    mPlayer.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setSpeakerphoneOn(false);

    //PLAY ON SPEAKER
    mPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    audioManager.setMode(AudioManager.MODE_IN_CALL);
    audioManager.setSpeakerphoneOn(true);



मुझे लगता है कि यह 1.6 पर काम कर रहा है।

इसलिए मैंने कहा था कि मैं यहाँ पोस्ट करूंगा कि मैंने यह कैसे किया।

इसे 1.6 में काम करने के लिए I:

setSpeakerphoneOn(false) सेट करने के लिए AudioManager वर्ग का उपयोग किया, फिर मैंने Voice_Call_Stream उपयोग किया और Voice_Call_Stream वॉल्यूम नियंत्रण जोड़ Voice_Call_Stream

setSpeakerphoneOn(false) पद्धति का उपयोग गतिविधि के setSpeakerphoneOn(false) में किया जाता है और यह हेडसेट पर मार्ग के रूप में दिखाई देता है, तब मैंने एक बटन का उपयोग किया था और setSpeakerphoneOn(true) विधि का इस्तेमाल किया था और ऑडियो स्पीकर के लिए भेजा जाता था।

यह विधि केवल तब काम करती है जब इसे मेरे लिए onCreate() में उपयोग किया जाता है और मैंने बड़े पैमाने पर इसका परीक्षण नहीं किया है, लेकिन फिलहाल यह मुझे एक 1.6 डिवाइस पर हेडसेट और स्पीकर के बीच स्विच करने की अनुमति देता है