我一直在研究 Android 开放配件开发套件。依照指示Google 提供的 DemoKit 示例 http://developer.android.com/guide/topics/usb/accessory.html,我在使解决方案适应我的应用程序方面没有遇到任何困难。我可以很好地检测、通信和拆卸配件。
但是,我需要将整个事情作为服务来运行。我有一个由 USB_ACCESSORY_ATTACHED 意图(即连接附件时)启动的基本活动,并且工作正常。但是,一旦我启动服务并在其中运行与常规活动中的工作解决方案相同的代码,我就会收到IOException
(“没有这样的设备”)每当我尝试与配件通信时(监控arduino端显示USB连接成功)。即使我在服务中指定了正确的 BroadcastReceiver、在 onStartCommand 回调方法中注册它并使用以下命令设置通信端点,也会发生这种情况openAccessory()
。相关代码如下。
@Override
public void onCreate() {
Log.d(TAG, "ONCREATE");
manager = UsbManager.getInstance(this);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
// Register broadcastreceiver for filtering accessory events
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
registerReceiver(mUsbReceiver,filter);
super.onCreate();
}
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "ONSTARTCOMMAND METHOD ACCESSED");
if (mInputStream != null && mOutputStream != null) {
return START_NOT_STICKY;
}
UsbAccessory[] accessories = manager.getAccessoryList();
mAccessory = (accessories == null ? null : accessories[0]);
if (mAccessory != null) {
if (manager.hasPermission(mAccessory)) {
openAccessory();
} else {
synchronized (mUsbReceiver) {
if (!mPermissionRequestPending) {
manager.requestPermission(mAccessory,
mPermissionIntent);
mPermissionRequestPending = true;
}
}
}
} else {
Log.d(TAG, "mAccessory is null");
}
return START_NOT_STICKY;
}
打开附件方法:
/**
* Open the accessory
*/
private void openAccessory() {
Log.d(TAG, "openAccessory: "+mAccessory);
mFileDescriptor = manager.openAccessory(mAccessory);
if (mFileDescriptor != null) {
FileDescriptor fd = mFileDescriptor.getFileDescriptor();
mInputStream = new FileInputStream(fd);
mOutputStream = new FileOutputStream(fd);
Thread thread = new Thread(null,this,"AccessoryThread");
thread.start();
}
}
对于可能的解决方案有什么想法吗?