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

时间:2017-10-23 11:26:10

标签: android xamarin android-things

我在Raspberry Pi上安装了Android Things Developer Preview 5.1(OIR1.170720.017)。

该应用是使用Xamarin针对Android 8 Platform 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());
    }
}

主要活动:

    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参数,但我无法确定有关所连接设备的更多信息。许多属性似乎都是null: Content of intent argument 我想获取设备的/ dev节点(不是/ mnt或驱动器上有文件系统时可以使用的任何挂载点)。查看dmesg我可以看到块设备已分配给节点/dev/sda。有没有办法从代码中获取节点名称/路径?我需要一些额外的权限吗? 谢谢

1 个答案:

答案 0 :(得分:0)

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

您可能需要查看Android事件的USB Enumerator sample,以便更好地了解如何使用Android USB API检测设备插入并打开与设备的通信渠道。

具体而言,USB设备附件不会被应用程序作为广播处理。它是作为过滤给定设备类型的应用程序的活动意图触发的。 USB Host API Guide还可以为您提供有关如何运作的详细信息。