1

ほとんどすべての返信には電話をポインターとして使用する必要があるため、これを検索するのは簡単な質問ではありませんが、私がやりたいのは、マウス/プレゼンター/ポインターを使用してAndroidタブレットを制御することです。このTargusBluetooghPresenter (Amazon)を購入しましたが、7インチタブレットのアプリに接続したいと思います。Googleとstackoverflowの検索に2時間失敗したので、助けを求めるべきだと思いました。

Bluetoothプレゼンターは正常に動作します。マウスのように機能し、スクロールしてクリックし、アプリを正常に実行できます。しかし、これはタブレットが移動中のボートに白昼にマウントされ、マウスポインターのこの微調整を使用しても機能しないアプリケーションです。ポインタを操作できたとしても、見えなかったと思います。これは、黒の背景に1インチの高さの白い文字を使用した実行可能性の高いアプリです。小さなマウスポインタが見えません。

必要なのは、プレゼンターの2つのプログラム可能なボタンを取得して、アプリのいくつかのボタンに焦点を合わせ、もう1つのボタンでそれらを押すことです。現在、プレゼンターのプログラム可能なボタンの1つが、アプリのボタンの1つを強調表示していますが、右クリックを使用すると、マウスポインターの下にあるボタンが起動します。前進して入るには2つのプログラム可能なボタンが必要だと思っていますが、それは単なる推測です。私はうまくいくどんな解決策にもオープンです。

どこから始めればいいのかわからない。アプリで何かをプログラミングする必要がありますか?ボタンをプログラムするためのインターフェースアプリが必要ですか?Playストアに私がやりたいことをするだけの何かがありますか?Bluetoothマウスで検索すると、電話を使用してコンピューターを制御するアプリしか表示されません。私が望む方向ではありません。助けや指示が必要です。

4

1 に答える 1

2

わかりました。私はあなたのために実用的な解決策を持っていると思います。いくつか間違っていたことがわかりました。1つdispatchKeyEvent()は、音量ボタンの押下がシステムに到達するのを停止するためよりも優れonKeyDown()ています(私のデバイスでは、ビープ音が鳴りましたが、音量は変化しませんでした)。また、手動でを呼び出す代わりに、 Instrumentationクラスを使用してなりすましのKeyEventsを送信する必要があることもわかりましdispatchKeyEvent()た。Instrumentationクラスはメインスレッドからもメソッド呼び出しを行わないため、呼び出しを独自のスレッドでラップする必要があります。

また、デバイスの一部のボタンが2つのキーイベント117と71を送信している理由も学びました。これらはshift+まで一致し[ます。私たちの目的では、シフトプレスを無視し、を使用し[てアクションを実行できます。

これは、私のために機能しているように見えるオーバーライドされたdispatchKeyEvent()メソッドです。

@Override
public boolean dispatchKeyEvent(KeyEvent ke){
int keyCode = ke.getKeyCode();
if(ke.getAction() == KeyEvent.ACTION_DOWN){
    if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * volume down button on your presenter
         * device
         **************************************/
        return true;
    }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
    { 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * volume up button on your presenter
         * device
         **************************************/
        return true;
    }else if (keyCode == 30){ 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * left programmable button on your 
         * presenter device
         **************************************/
         return true;
        }
    else if (keyCode == 59){
        /************************************** 
         * This was an attempt to get it to ignore
         * the shift keypress coming from the
         * left/right arrow keys on the devices
         * ignoring that would in theory make
         * those keys function as up/down focus
         * movers. Didn't seem to work though.
         * you could probably remove this branch
         * of the if statement if you want.
         * However since those buttons do send 
         * key events to the device it should 
         * should still be possible override these
         * buttons somehow.
         **************************************/
        return true;
    }
}else if(ke.getAction() == KeyEvent.ACTION_UP){
    /************************************** 
     * This section will catche the "release"
     * events from all of the keys we are using
     * and tell the system that we've handled
     * them. So that the system will not pass
     * the events along to anything else.
     **************************************/
    if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
        /************************************** 
         * If you had any reason / desire to
         * you could put a code snipet here and it
         * would be run when you let go after 
         * pressing the volume down button on your
         * presenter device.
         **************************************/
        return true;
    }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
    { 
        return true;
    }else if (keyCode == 59){
        return true;
    }else if (keyCode == 30) {
        return true;
    }
}

/************************************** 
 * The following line is needed so that
 * the system will treat any key events 
 * that we aren't interested in normally.
 * i.e. the back button on the tablet, by
 * by calling super.dispatchKeyEvent(), we
 * ensure that the back button still behaves
 * like normal.
 **************************************/
return super.dispatchKeyEvent(ke);
}

これにより、コードスニペットをifステートメントの適切なブランチに配置することで、プレゼンターデバイスの3つのボタン(音量大、音量小、左のプログラム可能なボタン)を制御できるようになります。これらの3つのボタンのいずれかを実行できます。あなたが望むものなら、なんでも。

これを実装するテストプロジェクトを作成しました。全体を確認したい場合は、ここからzip形式のプロジェクトフォルダーをダウンロードできます。このテストプロジェクトでは、vol up/downがd-padup/ downとして機能するように設定しました。これにより、アクティビティ内のさまざまなビューにフォーカスを移動できます。

十字キーの矢印ボタンをスプーフィングするためにifステートメントのブランチの1つに入れることができるコードは次のとおりです。

new Thread(new Runnable() {         
    @Override
    public void run() {                 
        new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
    }   
}).start();

たとえば、KeyEvent.KEYCODE_DPAD_DOWNを必要な他のキーイベントに置き換えることができます。後者は、現在フォーカスがあるボタンにクリックイベントを送信する選択ボタンとして機能します。KeyEvent.KEYCODE_DPAD_UPKeyEvent.KEYCODE_DPAD_CENTER

于 2012-07-22T19:15:09.987 に答える