获取连接的 USB 设备的 /dev 设备路径

Get /dev device path of attached USB device

我在 Raspberry Pi.

上安装了 Android Things Developer Preview 5.1 (OIR1.170720.017)

该应用程序是使用 Xamarin 针对 Android 8 平台 API 级别 26 创建的。 我想在连接 USB 拇指驱动器时检测热插拔事件。我通过在我的代码中使用 Broadcast-Receiver 实现了这一点:

[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { UsbManager.ActionUsbDeviceAttached, UsbManager.ActionUsbDeviceDetached })]
public class MyBroadCastReceiver : BroadcastReceiver
{
    public event EventHandler UsbDeviceAttached;
    public event EventHandler UsbDeviceDetached;

    public override void OnReceive(Context context, Intent intent)
    {
        if (intent.Action.Equals(UsbManager.ActionUsbDeviceDetached)) UsbDeviceDetached?.Invoke(this, new EventArgs());
        if (intent.Action.Equals(UsbManager.ActionUsbDeviceAttached)) UsbDeviceAttached?.Invoke(this, new EventArgs());
    }
}

主要Activity:

    private MyBroadCastReceiver receiver;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.Main);

        this.receiver = new MyBroadCastReceiver();
    }

    protected override void OnResume()
    {
        base.OnResume();
        RegisterReceiver(this.receiver, new IntentFilter(UsbManager.ActionUsbDeviceAttached));
    }

    protected override void OnPause()
    {
        UnregisterReceiver(this.receiver);
        base.OnPause();
    }

现在,我有一个空的 USB 拇指驱动器,上面没有分区或文件系统,只有普通的块存储。附加或分离驱动器时,将调用 OnReceive(Context, Intent) 方法。我查看了 contextintent 参数,但无法确定有关所连接设备的更多信息。更多的属性似乎是空的: 我想获取设备的 /dev 节点(不是 /mnt 或当驱动器上有文件系统时可能使用的任何挂载点)。查看 dmesg 我可以看到块设备已分配给节点 /dev/sda。有什么方法可以从代码中获取节点 name/path 吗?我需要一些额外的权限吗? 谢谢

Android 的安全模型阻止应用程序访问原始设备资源,例如连接的 USB 设备的 /dev 节点。您将需要通过 USB API 与设备通信。

您可能想查看 USB Enumerator sample 的 Android 内容,以更好地了解如何使用 Android USB API 检测设备插入并打开通信通道到设备。

具体来说,USB 设备连接不会被应用程序处理为广播。对于在给定设备类型上过滤的应用程序,它作为 activity 意图触发。 USB Host API Guide 还可以为您提供有关所有这些工作原理的更多详细信息。