Como implementar o modo Android Open Accessory como um serviço?

Estou brincando com o Kit de desenvolvimento de acessórios abertos Android. Seguindoo exemplo do DemoKit fornecido pelo Google, Não tive problemas em adaptar a solução ao meu aplicativo. Consigo detectar, comunicar e desconectar o acessório muito bem.

No entanto, eu precisaria executar a coisa toda como um serviço. Eu tenho uma atividade base que é iniciada pela intenção USB_ACCESSORY_ATTACHED (ou seja, quando o acessório está conectado) e que funciona bem. Porém, assim que inicio meu serviço e executo um código idêntico, comparado à minha solução de trabalho em uma atividade regular, recebo umIOException ("esse dispositivo não existe") sempre que estou tentando me comunicar com o acessório (o lado de monitoramento do arduino mostra uma conexão USB bem-sucedida). Isso acontece mesmo que eu tenha especificado o BroadcastReceiver correto no serviço, registrado no método de retorno de chamada onStartCommand e configurado os pontos de extremidade de comunicação comopenAccessory(). O código relevante é o seguinte.

@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;
}

openAccessory method:

/**
 * 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();
    }
}

lguma idéia para uma possível soluçã

questionAnswers(2)

yourAnswerToTheQuestion