1

アプリケーションを開発しており、タブレットの USB ホスト モードを使用してデバイスを管理する必要があります。

この時点では、デバイスの接続時に USB のみを有効にすることができました。プロセスステップ:

  1. アプリの起動、デバイスの接続はありません。
  2. Android から、アプリケーションを起動しないかどうか尋ねられる
  3. 同意
    すると、アプリケーションが起動し、USB 接続が使用できるようになりました。

しかし、それは私がやりたいことではありません:

  1. タブレットをオフにして、デバイスを接続します
  2. タブレットの電源を入れる
  3. アプリケーションを手動で起動する
  4. デバイスとの USB 接続を初期化します。

実際には、接続を確立するには、タブレットの USB を手動で接続解除/接続する必要がありますが、私の場合、デバイスは既にタブレットに接続されているため、接続を解除せずに接続を初期化する必要があります。 /USBを再接続します。

ブロードキャスト レシーバーについて説明している USB ホスト接続ページで Google が提供する例を試しましたが、うまくいかないか、よくわかりません。

私の質問は:
既に接続されている USB ホスト デバイスへの接続を開く方法はありますか?
魔女のやり方で、このダムの解決策を見つけるために検索する必要があります:D

ここで、私の問題を理解するのに役立つコードが既に実装されています:

manifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="..."
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="13" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/..." 
        android:theme="@android:style/Theme.Holo.NoActionBar.Fullscreen" >

        <activity
            android:name="...Activity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:label="@string/app_name"
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            </intent-filter>

            <meta-data
                android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
                android:resource="@xml/device_filter" />
            </activity>
    </application>
</manifest>

ファイル res/xml/device_filter.xml :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <usb-device vendor-id="5455" product-id="8238" />
</resources>

次に、私の Activity の onResume() :

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    String action = intent.getAction();

    if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {

        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        UsbManager usbManager = (UsbManager) activity.getSystemService(Context.USB_SERVICE);

    } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
    }
}

そして最後に、接続を可能にする私の方法:

protected void open(Object o) throws DeviceException {
    if (device != null && device.getVendorId() == 5455 && device.getProductId() == 8238) {
        int nbEndPoint = 0;
        for (int i = 0; i < device.getInterfaceCount(); i++) {
            UsbInterface usbInterface = device.getInterface(i);

            for (int j = 0; j < usbInterface.getEndpointCount(); j++) {
                UsbEndpoint usbEndPoint = usbInterface.getEndpoint(j);
                nbEndPoint++;
                switch (nbEndPoint) {
                case 1:
                    this.pipeWriteData = usbEndPoint;
                case 2:
                    this.pipeReadCommandResult = usbEndPoint;
                case 3:
                    this.pipeReadAutoStatus = usbEndPoint;
                case 4:
                    this.pipeReadImageData = usbEndPoint;
                }
            }
        }

        usbConnection = manager.openDevice(device);
        if (usbConnection == null || !usbConnection.claimInterface(device.getInterface(0), true)) {
            usbConnection = null;
            throw new DeviceException(DeviceException.UNKNOW_ERROR);
        }
    }
}
4

1 に答える 1

0

私の推測では、あなたのアプリはおそらく、USB デバイスから作成されたばかりの接続を探すリスナーとの通信を確立しているのでしょう。プリンターが既に接続されていて、アプリがそのリスナーで待機している場合、コールバック関数は呼び出されず、USB プリンターはアプリが実行される前に既にそこにあるため、発生しません。あなたのコードを見ていないので、これは推測ですが、他のケースではそのような理由でそのような動作を見ました。

質問でより多くの情報を得た後に編集してください。コメントで述べたように、起動時にデバイスが既に接続されている場合、アプリを起動するイベント (...USB_DEVICE_ATTACHED) は発生していないと思います。それを証明するには、logcat (表示)(書き込み)で多くのトレースを追加する必要があります。コード内、onCreate、onResume 内、および他の場所にある可能性があります。それを行うと、各セクションが期待どおりに機能するかどうかがわかります。私の推測では、起動時にまったく実行されず、USB デバイスが既に接続されていると思われます。あなたが何を望んでいるのか理解できれば、これです。デバイスが接続されているときに、アプリを起動します。ただし、起動時にデバイスが既に存在する場合は、とにかくアプリを起動して USB に接続する必要があります。私がこれにアプローチする方法は、対象の USB デバイスの存在をアプリで検索することです。存在は、最後の数ミリ秒で接続されたことを意味する「USB_DEVICE_ATTACHED」とは異なります。また、デバイス接続でコードを起動する「USB_DEVICE_ATTACHED」にリスナーを登録し、「BOOT_COMPLETED」にもリスナーを設定します

于 2013-04-09T14:59:33.437 に答える