gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:07:46 25 4
gpt4 key购买 nike

我一直在研究 Android Open Accessory Development Kit。通过关注the DemoKit example provided by Google ,我在使解决方案适应我的应用程序方面没有遇到任何问题。我可以很好地检测、通信和分离附件。

但是,我需要将整个事情作为一项服务来运行。我有一个由 USB_ACCESSORY_ATTACHED Intent 启动的基本 Activity (即,当附件连接时),并且工作正常。但是,一旦我启动我的服务并在其中运行与我在常规 Activity 中的工作解决方案相同的代码,每当我尝试与附件通信(监控 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;
}

打开附件方法:

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

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

然后,在服务中继续像以前一样实现其余的 ADK。

关于android - 如何将 Android Open Accessory 模式实现为服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com