5

私は 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();
    }
}

可能な解決策のアイデアはありますか?

4

2 に答える 2

3

解決策は簡単でした。

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

基本的に、サービスの起動に使用するアクティビティの開始時に受け取ったインテントをコピーします。これは、インテントには ADK 実装に必要なアクセサリの詳細が含まれているためです。

次に、サービスで、ADK の残りの部分を以前とまったく同じように実装します。

于 2012-04-21T15:22:58.267 に答える
0

現時点では、あなたの問題に対する適切な解決策を提供することはできません. しかし、この github の例は、問題を解決する方法を示している可能性があります。

github で提供されているコードを分析して、あなたがやろうとしているのとまったく同じことを実装します。

于 2012-04-04T08:50:43.797 に答える