Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何将Android Open 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,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();
    }
}

对可能的解决方案有什么想法?

解决方法

解决方案很简单.

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

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

然后,在服务中继续完全像以前一样实现ADK的其余部分.

大佬总结

以上是大佬教程为你收集整理的如何将Android Open Accessory模式作为服务实现?全部内容,希望文章能够帮你解决如何将Android Open Accessory模式作为服务实现?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。