android 判断耳机是否插入的几种方式

      这篇文章写的是获取耳机连接状态的几种方式,不包括蓝牙耳机的连接,当然,声音从哪个设备中发出来也不管。


      耳机插入和拔出时会发出广播ACTION_HEADSET_PLUG,所以只要注册一个广播接受者就可以监听耳机的状态了

    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
            	if(intent.hasExtra("state")) {
            		if(intent.getIntExtra("state", 0) == 0) {
            			Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show();
            		} else if(intent.getIntExtra("state", 0) == 1) {
            			Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show();
            		}
            	}
            }
        }
    };

      但这样子写其实有的时候还是不能够满足我们的需求的,很明显,这个只能够监听插入和拔出的动作。但如果应用启动之后没有插入或拔出耳机,这个时候并不能够获得当前耳机是处于一个什么样的状态。


如何能够获取当前耳机处于连接还是断开的状态呢?

跟踪源代码可以发现耳机的状态保存在文件  /sys/class/switch/h2w/state 中,所以获取耳机状态还可以这样写

	
    private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";

    private boolean isHeadsetExists() {
        char[] buffer = new char[1024];

        int newState = 0;

        try {
            FileReader file = new FileReader(HEADSET_STATE_PATH);
            int len = file.read(buffer, 0, 1024);
            newState = Integer.valueOf((new String(buffer, 0, len)).trim());
        }
        catch (FileNotFoundException e) {
            Log.e("FMTest", "This kernel does not have wired headset support");
        }
        catch (Exception e) {
            Log.e("FMTest", "", e);
        }
        return newState != 0;
    }
    
 state取值

0:无插入,1:耳机和话筒均插入,2:仅插入话筒。

这样写也比较麻烦,还有另外一种方式  android源码中 android.media.AudioManager类有一个方法  isWiredHeadsetOn()  判断有线耳机是否连接,这个方法不是静态方法,所以不能直接调用。

首先声明成员变量

	private AudioManager audoManager;

然后在activity的oncreate() 方法中取得对象

       audoManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

然后可以直接调用   audoManager.isWiredHeadsetOn(); 

注意要加个权限

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

这样就可以在你需要的地方轻松地获得耳机的连接状态了。


你可能感兴趣的:(android 判断耳机是否插入的几种方式)