检测耳机 Android

2024-01-08

近年来我在 Android 上编程,我想知道一些事情:

如何检测耳机的存在?
有一个方法:isWiredHeadsetOn()但它不起作用。

我已经尝试过,但它不起作用:

AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
Log.i("am.isWiredHeadsetOn()", am.isWiredHeadsetOn() + "");

if (am.isWiredHeadsetOn()) {
   //code
}

谢谢(如果我犯了拼写错误,我很抱歉,我是法国人)


@Phil 回答于https://stackoverflow.com/a/19102661/4758255 https://stackoverflow.com/a/19102661/4758255是检测耳机的一个很好的实现。

这里我引用一下他的回答。请投票支持他的答案,而不是这个!

为答案点赞:https://stackoverflow.com/a/19102661/4758255 https://stackoverflow.com/a/19102661/4758255


我在商店里有一个应用程序已经三年了,它可以监控有线耳机和蓝牙状态,而且从来没有人抱怨电池耗尽。但那是因为我成功地使用单个服务和广播接收器来检测来自两者的事件。这是两个关键类:

public class HeadsetStateBroadcastReceiver extends BroadcastReceiver {

    public static final String[] HEADPHONE_ACTIONS = {
        Intent.ACTION_HEADSET_PLUG,
        "android.bluetooth.headset.action.STATE_CHANGED",
        "android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED"
    };

    @Override
    public void onReceive(final Context context, final Intent intent) {

        boolean broadcast = false;

        // Wired headset monitoring
        if (intent.getAction().equals(HEADPHONE_ACTIONS[0]) {
            final int state = intent.getIntExtra("state", 0);
            AudioPreferences.setWiredHeadphoneState(context, state > 0);
            broadcast = true;
        }

        // Bluetooth monitoring
        // Works up to and including Honeycomb
        if (intent.getAction().equals(HEADPHONE_ACTIONS[1])) {
            int state = intent.getIntExtra("android.bluetooth.headset.extra.STATE", 0);
            AudioPreferences.setBluetoothHeadsetState(context, state == 2);
            broadcast = true;
        }

        // Works for Ice Cream Sandwich
        if (intent.getAction().equals(HEADPHONE_ACTIONS[2])) {
            int state = intent.getIntExtra("android.bluetooth.profile.extra.STATE", 0);
            AudioPreferences.setBluetoothHeadsetState(context, state == 2);
            broadcast = true;
        }

        // Used to inform interested activities that the headset state has changed
        if (broadcast) {
            LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent("headsetStateChange"));
        }

    }

}

这是我用来注册广播接收器的服务:

public class HeadsetMonitoringService extends Service {

    HeadsetStateBroadcastReceiver headsetStateReceiver;

    @Override
    public void onCreate() {

        headsetStateReceiver = new HeadsetStateBroadcastReceiver();
        final IntentFilter filter = new IntentFilter();
        for (String action: HeadsetStateBroadcastReceiver.HEADPHONE_ACTIONS) {
            filter.addAction(action);
        }

        registerReceiver(headsetStateReceiver, filter);

    }

    @Override
    public int onStartCommand(final Intent intent, final int flags, final int startId) {
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        unregisterReceiver(headsetStateReceiver);
    }

    @Override
    public IBinder onBind(final Intent intent) {
        return null;
    }

}

这是我的清单条目:

    <service
        android:name=".services.HeadsetMonitoringService"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>
            <action android:name="initialiseHeadsetService" />
        </intent-filter>
    </service>

其工作原理如下:

我使用启动广播接收器向 HeadsetMonitoringService 发送启动服务消息(您不必这样做,您可以在应用程序启动时执行此操作)。 HeadsetMonitoringService 反过来注册一个广播侦听器的实例,该侦听器侦听我感兴趣的所有耳机​​事件 - 它们保存在 HEADPHONE_ACTIONS 数组中。因为服务是粘性的,所以它会一直徘徊 - 因此广播侦听器也是如此。但由于服务和广播侦听器都是事件驱动的,因此在耳机状态发生变化之前它们不会消耗任何电量。此外,由于服务是粘性的,如果它意外终止,操作系统将重新启动它。
每当我收到耳机状态更改事件时,我也会触发本地广播,以便感兴趣的活动可以检查新状态并在需要时采取行动。

为了完整起见,我应该指出,我使用另一个类(此处未显示)AudioPreferences 将蓝牙和有线耳机状态存储为首选项,然后每当我需要了解耳机状态时都可以访问它们。

如果您对蓝牙耳机的状态感兴趣,您的应用程序将需要 android.permission.BLUETOOTH 权限。如果没有,只需从 HEADPHONE_ACTIONS 数组中取出蓝牙相关操作,并从 onReceive 方法中删除关联的 if 块。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测耳机 Android 的相关文章

随机推荐

  • 错误:‘$’未定义。[no-undef]

    我想用一些 jQuery 来做一个粘性导航栏但我得到了错误 ERROR is not defined no undef ERROR document is not defined no undef 并且代码不起作用 有人可以帮助我为什么会出
  • 我可以在不使用好友的情况下从班级外部访问私人成员吗?

    免责声明 是的 我完全意识到我所问的问题是完全愚蠢的 任何希望在生产代码中尝试这样的事情的人都应该被解雇和 或枪杀 我主要是想看看是否can做完了 现在这已经不成问题了 有什么方法可以从类外部访问 C 中的私有类成员吗 例如 有什么方法可以
  • 解析 JSON 数组并加载到 hive 表中

    我有一个如下所示的 Json 数组 Name xxxx Machine Machine1 Name yyyy Machine Machine2 Name zzzz Machine Machine3 我需要解析该数据并加载到如下所示的配置单元
  • 循环内分配内存与循环外分配内存

    在循环的每次迭代中分配大块堆内存是否会带来明显的性能损失 当然 我在每次迭代结束时释放它 另一种方法是在进入循环之前分配一次 在所有迭代中重复使用它 并最终在退出循环后释放它 请参阅下面的代码 allocation inside loop
  • PowerMock java.lang.ClassCastException:sun.net.www.protocol.https.HttpsURLConnectionImpl 无法转换为 javax.net.ssl.HttpsURLConnection

    我创建了一个模拟HttpsURLConnection基于一个堆栈交换答案 https stackoverflow com a 25334710 939250 import java net URL import javax net ssl
  • 如何通过ajax调用获取JSON数据

    我想得到JSON来自 ajax 调用的 php 页面的数据 php 页面正在返回AJAX字符串 现在我必须得到它JSON数据和显示值分开 我怎样才能做到这一点 这是我正在使用的代码 当我运行此代码来获取数据product id 时 它显示警
  • Django 中如何发送电子邮件

    我有设置 py Email settings EMAIL BACKEND django core mail backends smtp EmailBackend EMAIL HOST smtp gmail com EMAIL HOST US
  • 通过Java从.class文件中获取ByteCode(依赖)信息

    我想分析一下 class文件并获取有关哪个类使用哪个其他类的信息 jdeps是一个命令行工具 它允许您在控制台中显示一些信息 但我想避免调用外部工具并抓取命令行输出 所有依赖项都记录在类文件的中心位置 即常量池 因此 为了有效地处理所有依赖
  • 格式化 C# 代码片段的文字参数

    有什么方法可以更改代码片段的文字在代码片段生成的代码中使用时的呈现方式吗 具体来说 我想知道是否可以有一个名为 PropertyName 的文字 然后让代码片段引擎渲染 PropertyName 其中第一个字符为小写 我买不起 R 请帮忙
  • 以一种独特且确定性的方式将两个整数映射到一个

    想象两个正整数 A 和 B 我想将这两个组合成一个整数 C 不能有其他整数 D 和 E 组合成 C 因此将它们与加法运算符结合起来是行不通的 例如 30 10 40 40 0 39 1 连接也不起作用 例如 31 2 312 3 12 这种
  • 如何让 localeCompare 的行为与 .sort() 类似,以便所有大写字母排在前面?

    我有一个要排序的字符数组 const arr z a Z A 我希望排序顺序为 按字母顺序排列大写字符 然后按字母顺序排列小写字符 A Z a z 使用以下方法来完成此操作很简单 sort 没有任何参数 const arr z a Z A
  • 如何使用 scipy optimization 找到 3 个参数和数据点列表的最小卡方?

    我有一个排序随机数的直方图和高斯叠加 https i stack imgur com dBqcU png 直方图表示每个箱的观察值 将此基本情况应用于更大的数据集 高斯是拟合数据的尝试 显然 这个高斯并不代表直方图的最佳拟合 下面的代码是高
  • android edittext货币格式不带美元符号

    我尝试在我的编辑文本中创建货币格式 我搜索并缠绕代码 我可以在我的编辑文本中添加货币格式 transfer maney addTextChangedListener new TextWatcher Override public void
  • 如何在 ipython 或 jupyter 笔记本中加载外部静态 Javascript 文件

    我试图在 ipython 笔记本中加载 d3 和 dimple js 但它抛出错误 我也尝试过 require 但无法加载请为我提供一些解决方法 在笔记本中运行此命令以找出您的 jupyter 目录 from jupyter core pa
  • 如何在我的 Flutter 应用中显示来自 Firebase 的用户数据?

    我是颤振新手 如何将用户数据从 Firebase 检索到我的个人资料页面 我的 Firebase 数据包含姓名 电子邮件 血型和出生日期 我想将此数据检索到我的应用程序的个人资料页面 这是我的个人资料页面代码 import package
  • 为什么不采用依赖类型呢?

    我看到几个消息来源都赞同 Haskell 正在逐渐成为一种依赖类型的语言 的观点 这似乎意味着 随着越来越多的语言扩展 Haskell 正在朝着这个大方向漂移 但还没有实现 基本上有两件事我想知道 第一个很简单 成为一种依赖类型的语言 实际
  • gst 浏览器无法启动

    我刚刚安装了gst browser VisualGST 通过 Canonical Ubuntu 存储库 因此我尝试通过运行来启动 VisualGSTgst browser在命令行上 但是 我立即收到一个错误 a Smalltalk Stre
  • 如何改进 mongodb 的 XML 导入?

    我有一些大型 XML 文件 每个 5GB 我正在将其导入到 mongodb 数据库中 我使用 Expat 来解析文档 进行一些数据操作 删除一些字段 单位转换等 然后插入数据库 我的脚本基于此 https github com bgianf
  • Firebase“符号链接”到另一个节点

    关于我关于建模真实的面向用户的树结构的另一个问题 使用firebase树结构直接表示 文档大纲 结构 https stackoverflow com questions 39112792 using firebase tree struct
  • 检测耳机 Android

    近年来我在 Android 上编程 我想知道一些事情 如何检测耳机的存在 有一个方法 isWiredHeadsetOn 但它不起作用 我已经尝试过 但它不起作用 AudioManager am AudioManager getSystemS