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çã