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

如何将Android Open Accessory模式作为服务实现?,第1张

概述我一直在玩 Android Open Accessory Development Kit.通过遵循 the DemoKit example provided by Google,我可以毫不费力地将解决方案应用到我的应用程序中.我可以很好地检测,通信和拆卸配件. 但是,我需要将整个事情作为一项服务来运行.我有一个基本活动,由USB_ACCESSORY_ATTACHED意图启动(即,当连接附件时),并 我一直在玩 Android Open Accessory Development Kit.通过遵循 the DemoKit example provided by Google,我可以毫不费力地将解决方案应用到我的应用程序中.我可以很好地检测,通信和拆卸配件.

但是,我需要将整个事情作为一项服务来运行.我有一个基本活动,由USB_ACCESSORY_ATTACHED意图启动(即,当连接附件时),并且工作正常.但是,一旦我开始我的服务并在其中运行与我在常规活动中的工作解决方案相同的代码,每当我尝试与附件通信时,我都会收到IOException(“没有这样的设备”)(监控arduino)侧显示USB连接成功).即使我在服务中指定了正确的broadcastReceiver,在onStartCommand回调方法中注册它,并使用openAccessory()设置通信端点,也会发生这种情况.相关代码如下.

@OverrIDepublic 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模式作为服务实现?所遇到的程序开发问题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1126959.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存