获取连接的 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)
方法。我查看了 context
和 intent
参数,但无法确定有关所连接设备的更多信息。更多的属性似乎是空的:
我想获取设备的 /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 还可以为您提供有关所有这些工作原理的更多详细信息。
我在 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)
方法。我查看了 context
和 intent
参数,但无法确定有关所连接设备的更多信息。更多的属性似乎是空的:
dmesg
我可以看到块设备已分配给节点 /dev/sda
。有什么方法可以从代码中获取节点 name/path 吗?我需要一些额外的权限吗?
谢谢
Android 的安全模型阻止应用程序访问原始设备资源,例如连接的 USB 设备的 /dev
节点。您将需要通过 USB API 与设备通信。
您可能想查看 USB Enumerator sample 的 Android 内容,以更好地了解如何使用 Android USB API 检测设备插入并打开通信通道到设备。
具体来说,USB 设备连接不会被应用程序处理为广播。对于在给定设备类型上过滤的应用程序,它作为 activity 意图触发。 USB Host API Guide 还可以为您提供有关所有这些工作原理的更多详细信息。