Как проверить и перенаправить звук между проводной гарнитурой и спикерфоном?

Я разрабатываю простое приложение, которое должно переключаться между громкой связью и проводной гарнитурой для воспроизведения звука при нажатии кнопки. Я пытаюсь использовать функцию isWiredHeadsetOn(), но она говорит, что это устарело для Android API уровня 5 и выше. Итак, как мне проверить, воспроизводится ли сейчас звук через проводную гарнитуру, чтобы я мог перенаправить его на динамик телефона?

Примечание. Я запускаю свое приложение с наушниками, подключенными к 3,5-мм разъему телефона.

Это моя попытка кода до сих пор:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_audio_re_direct);
    redirect = (Button)findViewById(R.id.redirect);
    final AudioManager audio =(AudioManager)getApplicationContext().getSystemService(AUDIO_SERVICE);

    redirect.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings("deprecation")
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(audio.isWiredHeadsetOn())
            {
                audio.setWiredHeadsetOn(false);
                audio.setSpeakerphoneOn(true);
                Toast.makeText(getApplicationContext(), "SpeakerPhone On", Toast.LENGTH_LONG).show();
                redirect.setText("Turn on headset");

            }
            else 
            {
                audio.setSpeakerphoneOn(false);
                audio.setWiredHeadsetOn(true);
                Toast.makeText(getApplicationContext(), "Wired Headset On", Toast.LENGTH_LONG).show();
                redirect.setText("Turn off headset");
            }

            }

    });
        }

Но приложение вообще не переключается. Сначала он обнаруживает наличие проводной гарнитуры, показывает всплывающее сообщение SpeakerPhone On и все. Он не переключается между ними.

Кто-нибудь, пожалуйста, помогите мне сделать эту работу. Спасибо.


person SoulRayder    schedule 06.01.2014    source источник
comment
Ну, setWiredHeadsetOn устарел с уровня API 5, поэтому он не будет работать.   -  person ChuongPham    schedule 07.01.2014
comment
Любая альтернатива этому? Пожалуйста, напишите, если вы знаете   -  person SoulRayder    schedule 07.01.2014
comment
Вы можете просматривать исходные коды классов AudioManager и TelephonyManager, а затем использовать Reflection, чтобы делать то, что вы хотите. У меня нет примера Reflection, использующего эти классы, но вы можете найти SO для примера.   -  person ChuongPham    schedule 07.01.2014


Ответы (2)


вам нужно зарегистрировать приемник для намерения ACTION_HEADSET_PLUG и создать класс приемника, чтобы поймать эту трансляцию, из которой вы можете реализовать свою собственную логику пожалуйста, проверьте это

person Digit    schedule 06.01.2014
comment
да, но как программно включить и отключить проводную гарнитуру? - person SoulRayder; 06.01.2014

Наконец-то удалось решить мою собственную проблему, используя этот обходной путь (как было предложено @noelicus):

Как отключить звук в гарнитуре но позволить программно играть на динамике?

Опубликовано для справки другим, кто может застрять, как я. :)

person SoulRayder    schedule 08.01.2014
comment
Интересно, перенаправляете ли вы аудиовход (устройство микрофона) на наушники MIC, потому что я хотел бы, чтобы при подключении к разъему 3,5 мм что-то перенаправляло вход и выход звука на наушники. Ответить на stackoverflow.com/questions /38220365/ - person Sergio Antonio Snchez Camarero; 07.07.2016