如何将Android Open Accessory模式作为服务实现?

时间:2011-11-01 05:15:20

标签: android service arduino accessory

我一直在玩Android Open Accessory Development Kit。通过关注the DemoKit example provided by Google,我可以毫不费力地将解决方案应用到我的应用程序中。我可以很好地检测,通信和拆卸附件。

但是,我需要将整个事情作为一项服务来运行。我有一个基本活动,由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;
}

openAccessory方法:

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

有关可能解决方案的任何想法吗?

2 个答案:

答案 0 :(得分:3)

解决方案很简单。

if (intent.getAction().equals(USB_ACCESSORY_ATTACHED)) {
    Intent i = new Intent(this, YourServiceName.class);
    i.putExtras(intent);
    startService(i);
}

基本上,复制您在启动用于启动服务的活动时收到的意图,因为意图包含ADK实现所需的附件的详细信息。

然后,在服务中继续执行ADK的其余部分。

答案 1 :(得分:0)

目前,我无法为您解决问题。但可能会this github example向您展示如何解决您的问题:

我将分析github上给出的代码,以实现您将要执行的相同操作。