Проверьте, подключена ли гарнитура на разных уровнях API - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть приложение, предназначенное для API уровня 19+. Мне нужно проверить, подключена ли гарнитура (проводная или Bluetooth).

Я вижу, что AudioManager.isWiredHeadsetOn() устарело, начиная с API уровня 16, и в документации предлагается использовать AudioManager.getDevices(), которое было введено только начиная с API уровня 23.

Вопрос: Как правильно проверить, подключена ли гарнитура для уровней API 16 - 22?

Примечание: я знаю, что все еще могу использовать устаревший метод, но не хочу. Если бы они устарели, им следовало ввести заменяющий API (который я, хотя и не могу найти).

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

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

Из моего существующего кода у меня это в onCreate моего основного сервиса:

    // listen for headphone events so we can auto switch the audio output when headphones are plugged in
    myHeadphoneMonitor = new HeadphoneMonitor();
    android.content.IntentFilter headphone_filter = new 
    android.content.IntentFilter(Intent.ACTION_HEADSET_PLUG);
    registerReceiver(myHeadphoneMonitor, headphone_filter);

А мой монитор выглядит так:

  package com.myname.foo;

  import android.content.BroadcastReceiver;
  import android.content.Context;
  import android.content.Intent;
  import android.util.Log;
  import android.os.Message;


  public class HeadphoneMonitor extends BroadcastReceiver
  {
    public boolean headphonesActive=false;

    @Override
    public void onReceive(final Context context, final Intent intent)
    {
        if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG))
        {
            int state = intent.getIntExtra("state", -1);
            switch (state) {
                    case 0:
                        Log.d("HeadphoneMonitor", "Headset is unplugged");
                        headphonesActive=false;
                        break;
                    case 1:
                        Log.d("HeadphoneMonitor", "Headset is plugged in");
                        headphonesActive=true;
                        break;
                    default:
                        Log.d("HeadphoneMonitor", "I have no idea what the headset state is");
                        break;
            }

            // push this event onto the queue to be processed by the Handler
            Message msg = MyApp.uiHandler.obtainMessage(MyApp.HEADPHONE_EVENT);
            MyApp.uiHandler.sendMessage(msg);
        }
    }
  }

Ничего не нужно в манифесте для прослушивания этого широковещательного события.

0 голосов
/ 01 сентября 2018

Поскольку AndroidStudio предупреждает, что AudioManager.getDevices требует VersionCode M, лучший способ сделать проверку версии следующим образом:

    // ... some code
    boolean isWiredHeadsetOn=false;
    AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    Log.d(TAG, "onCreate:::: retrieved AudioManager instance");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        Log.d(TAG, "onCreate:::: BuildVersion>=M");
        AudioDeviceInfo[] mAudioDeviceInfos = mAudioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS);
        Log.d(TAG, "onCreate:::: got AudioDeviceInfo[]");
        for (int i = 0; i < mAudioDeviceInfos.length; i++) {
            if (mAudioDeviceInfos[i].getType() == AudioDeviceInfo.TYPE_WIRED_HEADSET) {
                Log.d(TAG, "onCreate:::: \n\nfind wiredHeadset!!!\n\n");
                isWiredHeadsetOn=true;
            } else {
                Log.d(TAG, "onCreate:::: find device type: " + mAudioDeviceInfos[i].getType() + ", id: " + mAudioDeviceInfos[i].getProductName());
            }
        }
    } else {
        Log.d(TAG, "onCreate:::: BuildVersion<M");
        isWiredHeadsetOn=mAudioManager.isWiredHeadsetOn();
    }
    // ... continue code

Надеюсь, я смогу помочь. С уважением, Cs

...