无法接收android.intent.action.USB_DGTL_麦克风_插头

无法接收android.intent.action.USB_DGTL_麦克风_插头,android,audio,usb,broadcastreceiver,microphone,Android,Audio,Usb,Broadcastreceiver,Microphone,这里有一个有趣的。安卓4.1.1。当USB麦克风连接状态=1/断开状态=0时,将发送以下广播: VERBOSE/WiredAccessoryObserver(260): android.intent.action.USB_DGTL_MIC_PLUG: state: 1 name: usb_audio_capture VERBOSE/AudioService(260): Broadcast Receiver: Got ACTION_USB_DGTL_MIC_PLUG, state = 1 为什么

这里有一个有趣的。安卓4.1.1。当USB麦克风连接状态=1/断开状态=0时,将发送以下广播:

VERBOSE/WiredAccessoryObserver(260): android.intent.action.USB_DGTL_MIC_PLUG: state: 1 name: usb_audio_capture
VERBOSE/AudioService(260): Broadcast Receiver: Got ACTION_USB_DGTL_MIC_PLUG, state = 1
为什么我的广播接收器接收不到这个?我会手动启动主要活动

<receiver android:name=".UsbMic" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.USB_DGTL_MIC_PLUG" />
    </intent-filter>
</receiver>


public class UsbMic extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("Test", "USB Mic");
    }
}
当USB麦克风连接状态=1/断开状态=0时,将发送以下广播


情况未必如此,所以你不应该依赖它。例如,在最近的高通平台上检测到主机供电的USB音频附件时,发送的意图是IIRC android.intent.action.ANALOG_audio_DOCK_PLUG。这并没有说明附件是否有麦克风,因为检查是由音频HAL内部完成的,不会导致任何意图被广播。

我在Android API中找不到USB_DGTL_mic_插件作为系统意图,因此我无法验证它是否是设备特定的东西。只有当您从代码而不是清单注册接收者时,才能接收某些意图。您是否尝试过创建自定义接收器并从活动中手动启动它

IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.USB_DGTL_MIC_PLUG");

receiver = new UsbMic();       
registerReceiver(receiver, filter); 

VERBOSE/WiredAccessoryObserver260:android.intent.action.USB_DGTL_麦克风_插头:状态:1名称:USB_音频_捕获VERBOSE/AudioService260:Broadcast接收器:获取操作_USB_DGTL_麦克风_插头,状态=1来自log cat。音响服务似乎收到了。事实上,我在插拔麦克风时观察到了这一点。为什么不是我?我不知道你为什么不被广播。我的观点是,有些安卓设备支持USB麦克风,而这种意图根本不会被发送出去。因此,作为检测USB麦克风是否已连接的通用方法,它没有用处。谢谢你,Michael,我的应用程序是学术性的,供我自己使用。我使用的麦克风将与设备结合。由于应用程序是无头无监视器,我希望我可以使用此广播,但无意中发现它在没有UI的情况下启动/停止服务。只是出于好奇,这些意图定义在哪里?智能感知不会带我去那里。这可能是原因吗?谢谢你,Thrakbad,看来这就是出路。我必须先启动服务,然后从中注册广播接收器。这个特别的意图似乎也是粘性的,所以我会知道服务开始时麦克风的状态。顺便说一句,谈论粘性广播。我使用在运行时在其他应用程序中注册的电池接收器。当在舱单中声明时,它无法发射。我在模拟器中通过打开/关闭交流电源来检查这一点。同一命令触发清单中声明的操作\u POWER\u CONNECTED/DISCONNECTED receiver。这个广播不粘人。所有这些都让我认为,粘性广播并不意味着或者只是无法调用接收器,除非它们在运行时注册。有人能证实这一点吗?我不能证实是否所有的粘性广播都只能从代码中接收,但有一些正常的广播,例如通过清单屏幕关闭、屏幕打开和用户在场声明时也无法接收