我在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)
方法。我查看了context
和intent
参数,但我无法确定有关所连接设备的更多信息。许多属性似乎都是null:
我想获取设备的/ dev节点(不是/ mnt或驱动器上有文件系统时可以使用的任何挂载点)。查看
dmesg
我可以看到块设备已分配给节点/dev/sda
。有没有办法从代码中获取节点名称/路径?我需要一些额外的权限吗?
谢谢
答案 0 :(得分:0)
Android的安全模型可防止应用访问原始设备资源,例如连接的USB设备的/dev
节点。您需要通过USB API与设备进行通信。
您可能需要查看Android事件的USB Enumerator sample,以便更好地了解如何使用Android USB API检测设备插入并打开与设备的通信渠道。
具体而言,USB设备附件不会被应用程序作为广播处理。它是作为过滤给定设备类型的应用程序的活动意图触发的。 USB Host API Guide还可以为您提供有关如何运作的详细信息。