私は Android Open Accessories Development Kit をいじっています。Google が提供する DemoKit の例に従うことで、問題なくソリューションをアプリケーションに適応させることができました。アクセサリの検出、通信、取り外しは問題なくできています。
ただし、すべてをサービスとして実行する必要があります。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();
}
}
可能な解決策のアイデアはありますか?