简体   繁体   English

将耳机插入Android的耳机插孔时,可通过内置扬声器进行音频播放

[英]Audio through built-in speakers when earphones are plugged in headphone jack in Android

In my application, there is one Card Reader which uses Audio Jack of devices.Now, my problem is I want to produce sound from built-in speakers when Card Reader is intact in HeadPhone Jack of the device. 在我的应用程序中,有一个读卡器使用设备的音频插孔。现在,我的问题是当读卡器在设备的耳机插孔中完好无损时,我想从内置扬声器产生声音。

Here are the codes I have tried: 这是我尝试过的代码:

1) Using Reflection Methods 1)使用反射方法

Class audioSystemClass;
                try {
                     audioSystemClass = Class
                            .forName("android.media.AudioSystem");

                    Method setForceUse = audioSystemClass.getMethod(
                            "setForceUse", int.class, int.class);
                    // First 1 == FOR_MEDIA, second 1 == FORCE_SPEAKER. To go
                    // back to the default
                    // behavior, use FORCE_NONE (0).
                    setForceUse.invoke(null, 1, 1);
                    final float maxVolume = mAudioManager
                            .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
                    soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);


                } catch (ClassNotFoundException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (IllegalArgumentException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    Log.e("Test", e.toString());
                    e.printStackTrace();
                }

2) Using setMode method 2)使用setMode方法

mAudioManager.setMode(AudioManager.MODE_IN_CALL);
                mAudioManager.setSpeakerphoneOn(true);
                float maxVolume = mAudioManager
                        .getStreamMaxVolume(AudioManager.STREAM_RING);
                soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);

But these both codes are running in only those devices which have default FM application. 但是这两个代码仅在具有默认FM应用程序的设备中运行。 But I want to have this functionality in all devices. 但我想在所有设备中都具有此功能。

Please share your experience !! 请分享您的经验!

Your second approach setMode holds correct for phones with default Fm player. 第二种方法setMode适用于具有默认Fm播放器的电话。

However for devices without Default FM , I tried the following code: 但是对于没有Default FM的设备,我尝试了以下代码:

mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
mAudioManager.setSpeakerphoneOn(true);

This code worked fine for the phones without default Fm player.I used a OnePlus device with Oxygen OS and worked fine. 对于没有默认Fm播放器的手机,此代码可以正常工作。我在OneX设备上使用了Oxygen OS,并且运行良好。 Hope this helps. 希望这可以帮助。

Alternatively, if you initialize your SoundPool to STREAM_VOICE_CALL, as: 或者,如果将SoundPool初始化为STREAM_VOICE_CALL,则如下:

SoundPool spool = new SoundPool(1,AudioManager.STREAM_VOICE_CALL, 0)

then also your audio should be routed to loudspeaker with any of the way you have mentioned above. 那么您的音频也应该以上述任何一种方式路由到扬声器。 I tried and its working on phones even without default FM. 我尝试过,即使没有默认FM也可以在手机上使用它。

Here, I have initiated a SoundPool and loaded a beep. 在这里,我启动了SoundPool并发出了哔声。

 SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_VOICE_CALL, 0);

            soundPool
                    .setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

                        @Override
                        public void onLoadComplete(SoundPool soundPool,
                                                   int sampleId, int status) {
                            loaded = true;
                        }
                    });
            soundID = soundPool.load(ApplicationChexology.getContext(), R.raw.beep_single, 1);

Now, after loading sound , I am setting AudioManager to MODE_IN_COMMUNICATION and playing sound. 现在,在加载声音之后,我将AudioManager设置为MODE_IN_COMMUNICATION并播放声音。 When sound has played , setting Audio Manager's mode to MODE_NORMAL. 播放声音后,将音频管理器的模式设置为MODE_NORMAL。

 audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
 audioManager.setSpeakerphoneOn(true);

 float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
        if (loaded)
         soundPool.play(soundID, maxVolume, maxVolume, 1, 0, 1f);

        Timer timer = new Timer();

        TimerTask delayedThreadStartTask = new TimerTask() {
          @Override
          public void run() {
             audioManager.setMode(AudioManager.MODE_NORMAL);
             audioManager.setSpeakerphoneOn(false);

                }};
    timer.schedule(delayedThreadStartTask, 500);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM