Аудио през вградени високоговорители, когато слушалките са включени в жака за слушалки в 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 да се държат по различен начин. Но това е само мое предположение. Като настроите soundpool на stream_voice call вероятно би трябвало да работи на по-голямата част от телефона, защото вие заменяте поведението на gsm разговора! - person Saurav; 11.06.2015

Вашият втори подход setMode е правилен за телефони с Fm плейър по подразбиране.

Въпреки това за устройства без FM по подразбиране, опитах следния код:

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

Този код работи добре за телефоните без Fm плейър по подразбиране. Използвах устройство OnePlus с Oxygen OS и работех добре. Надявам се това да помогне.

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