通过代码接收ACTION_USB_DEVICE_ATTACHED意图

7
我在使用usb api时遇到了麻烦。我正在尝试使用广播接收器来接收ACTION_USB_DEVICE_ATTACHED意图的广播,但是它无法正常工作。
为了澄清,我之前已经通过清单文件成功实现过这一点,但是这会创建一个新的活动(并添加到后退堆栈),我发现这很不理想,尤其是考虑到我的应用程序性质(终端)。
我猜测设备过滤器XML元数据需要添加到意图过滤器中,但我不知道该如何操作。
欢迎任何反馈!
编辑- 以下是一些代码。 这是来自清单文件的关键部分。请注意,为了让动态注册的BroadcastReceiver捕获意图,必须将意图过滤器注释掉。
//<intent-filter>
//    <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
//    <category android:name="android.intent.category.DEFAULT" />
//</intent-filter>

<meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
android:resource="@xml/device_filter"/>

这里是连接接收器的代码

//register for attachment
IntentFilter attachedFilter = new IntentFilter(UsbManager.ACTION_USB_DEVICE_ATTACHED);
registerReceiver(mUsbAttachedReceiver, attachedFilter);

这是广播接收器的声明。
private final BroadcastReceiver mUsbAttachedReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
    {
        //BREAKPOINT HERE IS NEVER HIT
        String action = intent.getAction();
        showDebugToast(action);

        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            synchronized(this)
            {
                UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                if (device != null){
                    getDevicePermission(device);
                }
            }
        }
    }
};

我在清单文件中避免声明接收器,因为我不确定在那里使用的惯例(接收器是独立于任何活动存在的)。我想知道是否正确地认为,即使在清单文件中声明了接收器,只要应用程序在运行,它就会一直运行,或者它只能在前台运行?如果有相关文献,敬请赐教。
后来,我通过给活动设置“singleTop”启动模式并实现onNewIntent()方法来解决了这个问题。这样既可以实现我想要的行为,也允许在没有运行活动的情况下启动应用程序(使用清单文件)。这是我的最终目标。然而,我真的希望能理解这种行为,并对解决方案保持高度关注!
进一步编辑:我的调试设备是三星Galaxy S3。我没有改变ROM。

你是否为你的BroadcastReciever声明了优先级?请同时发布你在清单文件中的接收器部分。 - Rafael T
我知道这很晚,但这似乎是 https://dev59.com/b2w05IYBdhLWcg3w3ViX#9814826 的重复。 - svachalek
1个回答

0

是的,您需要添加带有Activity的元数据:

<meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
               android:resource="@xml/accessory_filter" />

accessory_filter:

<resources>
    <usb-accessory manufacturer="Acme, Inc" model="Whiz Banger" version="7.0" />
</resources>

查看这个Android开发者博客 一个明智的想法:Android开放附件


我应该说得更清楚。我已经添加了元数据部分,但我不确定是否需要在过滤器中以编程方式添加它。 - Gusdor
@Gusdor,看一下这个链接:http://source-android.frandroid.com/frameworks/base/media/tests/CameraBrowser/src/com/android/camerabrowser/MtpClient.java,或许会有帮助。 - ρяσѕρєя K
嗨伊姆兰,谢谢你提供的链接。注册和接收部分看起来与我上面发布的代码示例非常相似。似乎这是很基础的东西,但我显然还缺少某些东西。 - Gusdor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接