Звук через встроенные динамики, когда наушники подключены к разъему для наушников в Android

В моем приложении есть один кард-ридер, который использует аудиоразъем устройств. Теперь моя проблема заключается в том, что я хочу воспроизводить звук из встроенных динамиков, когда кард-ридер не поврежден в разъеме для наушников устройства.

Вот коды, которые я пробовал:

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) Использование метода 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);

Но эти оба кода работают только на тех устройствах, на которых установлено приложение FM по умолчанию. Но я хочу, чтобы эта функция была на всех устройствах.

Поделитесь опытом!!


person lifelongLearner    schedule 10.06.2015    source источник
comment
возможно, это поможет вам, это немного отличается от того, что у вас есть пытался.   -  person Strider    schedule 10.06.2015


Ответы (3)


В качестве альтернативы, если вы инициализируете свой SoundPool для STREAM_VOICE_CALL, как:

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

тогда также ваш звук должен быть направлен на громкоговоритель любым способом, который вы упомянули выше. Я попробовал, и он работает на телефонах даже без FM по умолчанию.

person Saurav    schedule 10.06.2015
comment
Эй, можете ли вы предложить какую-либо возможную причину, по которой приведенный выше код не работает в версии Samsung 4.4.2, но работает на устройствах Nexus ?? - person lifelongLearner; 11.06.2015
comment
В устройствах Samsung, возможно, они настроили параметр звука, поэтому API-интерфейсы звука ведут себя по-разному. Но это только мое предположение. Установив звуковой пул для вызова stream_voice, возможно, он должен работать на большинстве телефонов, потому что вы переопределяете поведение вызова GSM! - person Saurav; 11.06.2015

Ваш второй подход setMode верен для телефонов с Fm-плеером по умолчанию.

Однако для устройств без Default FM я попробовал следующий код:

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

Этот код отлично работал на телефонах без проигрывателя Fm по умолчанию. Я использовал устройство OnePlus с ОС Oxygen и работал нормально. Надеюсь это поможет.

person Saurav    schedule 10.06.2015

Здесь я инициировал 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);

Теперь, после загрузки звука, я устанавливаю AudioManager в MODE_IN_COMMUNICATION и воспроизводю звук. Когда звук воспроизводится, установите режим Audio Manager в 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);
person lifelongLearner    schedule 15.06.2015