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

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


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

[java]  view plain copy
  1. private final BroadcastReceiver mReceiver = new BroadcastReceiver() {  
  2.     @Override  
  3.     public void onReceive(Context context, Intent intent) {  
  4.         String action = intent.getAction();  
  5.         if (action.equals(Intent.ACTION_HEADSET_PLUG)) {  
  6.             if(intent.hasExtra("state")) {  
  7.                 if(intent.getIntExtra("state"0) == 0) {  
  8.                     Toast.makeText(context, "headset not connected", Toast.LENGTH_LONG).show();  
  9.                 } else if(intent.getIntExtra("state"0) == 1) {  
  10.                     Toast.makeText(context, "headset connected", Toast.LENGTH_LONG).show();  
  11.                 }  
  12.             }  
  13.         }  
  14.     }  
  15. };  

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


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

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

[java]  view plain copy
  1. private static final String HEADSET_STATE_PATH = "/sys/class/switch/h2w/state";  
  2.   
  3. nbsp;private boolean isHeadsetExists() {  
  4.     char[] buffer = new char[1024];  
  5.   
  6.     int newState = 0;  
  7.   
  8.     try {  
  9.         FileReader file = new FileReader(HEADSET_STATE_PATH);  
  10.         int len = file.read(buffer, 01024);  
  11.         newState = Integer.valueOf((new String(buffer, 0, len)).trim());  
  12.     }  
  13.     catch (FileNotFoundException e) {  
  14.         Log.e("FMTest""This kernel does not have wired headset support");  
  15.     }  
  16.     catch (Exception e) {  
  17.         Log.e("FMTest""", e);  
  18.     }  
  19.     return newState != 0;  
  20. }  
 state取值

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

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

首先声明成员变量

[java]  view plain copy
  1. private AudioManager audoManager;  

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

[java]  view plain copy
  1. audoManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);  

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

注意要加个权限

[html]  view plain copy
  1.     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />  

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

转自:http://blog.csdn.net/qinghua0706/article/details/8296276

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android实现多线程的几种方式有以下几种方法。首先,可以使用Java的Thread类来创建和管理线程。这种方式需要手动创建线程对象,并在run()方法中编写线程的逻辑。其次,可以使用Java的Runnable接口来实现多线程。这种方式需要创建一个实现了Runnable接口的类,并将其作为参数传递给Thread类的构造函数。然后,可以使用Handler类来实现多线程。通过Handler的post()或postDelayed()方法,可以将任务添加到主线程的消息队列中,从而在主线程中执行异步操作。此外,还可以使用AsyncTask类来实现多线程。AsyncTask是Android提供的一个封装好的线程池,可以方便地在后台执行耗时操作,并在主线程中更新UI。通过重写AsyncTask的doInBackground()方法来执行耗时操作,并通过onPostExecute()方法来更新UI。需要注意的是,AsyncTask必须在主线程中创建实例,并且execute()方法也必须在主线程中调用。另外,Android 3.0之后,可以使用executeOnExecutor()方法来实现并发执行多个AsyncTask任务。总结起来,Android实现多线程的几种方式包括使用Thread类、Runnable接口、Handler类和AsyncTask类。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Android——多线程的多种实现方式](https://blog.csdn.net/abliudede/article/details/104891324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android开发中四种常用的多线程实现方式](https://blog.csdn.net/star_nwe/article/details/130140238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值