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



Answers

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

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

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

Question

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

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

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

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

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;
      }
   } 
}

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

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




ऐसा लगता है कि यह 1.6 पर काम कर रहा है।

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

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

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

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

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




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

    //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);



Links