2

視覚障害者向けのファームウェアを構築しています。外部キーボードが接続されているときは、タッチスクリーンを無効にする必要があります。で切り替えますAlt + T。このためにstatic volatile、ビュー クラスに misTouchScreenEnabled というフラグがあります。外部キーボードを差し込むと、falseから戻りdispatchTouchEvent()ます。

ビュークラスで:

/*
* A register to hold the status of touch screen
*
*{@hide}
*/
public static volatile boolean misTouchScreenEnabled = false;

public boolean dispatchTouchEvent(MotionEvent event) {
    if(event == null)
    {
        return false;
    }
Log.d ("CnxsTA","View :: Into dispatchTouchEvent");
// Added by Harsh Vardhan 05102013 
Configuration config = getResources().getConfiguration();
    if (config.keyboard != Configuration.KEYBOARD_NOKEYS)
{
    // And if the device has a hard keyboard, even if it is
    // currently hidden, don't pass the touch events to the view
    if(!mIsTouchScreenEnabled)
    {
        Log.d ("CnxsTA","View :: Into dispatchTouchEvent :: Returning False");
        return false;
    }
    }
// Added By Harsh Vardhan
// Some Other Code...
}

Launcher で in をキャッチし、ALT + TリフレクションdispatchTouchEvent()を使用してフラグを切り替えます。

case KeyEvent.KEYCODE_T:
    {
        //Added By Harsh Vardhan 31052013
        Log.d ("CnxsTA","Launcher :: onKeyDown :: T pressed");

        if ((event.getMetaState() & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON)
        {
            Object s;
            try
            {
                Log.d ("CnxsTA","Launcher :: In onKeyDown :: In isAltPressed");
                s = ToogleTouchScreen(Class.forName("android.view.View"), "mIsTouchScreenEnabled");
                if (s instanceof Boolean)
                {
                    boolean v = ((Boolean) s).booleanValue();
                    //do something
                    Log.d ("CnxsTA","Launcher :: onKeyDown :: In isAltPressed :: Toggling touchscreen enable flag :: " + v);
                    if (accessibilityEnabled)
                    {
                        if (mTts != null)
                        {
                            if (v)
                                mTts.speak("Touch Screen enabled", TextToSpeech.QUEUE_FLUSH, null);
                            else
                                mTts.speak("Touch Screen disabled", TextToSpeech.QUEUE_FLUSH, null);
                        }
                    }
                }
                else if (s == null)
                {
                    //do something
                    Log.d ("CnxsTA","Launcher :: onKeyDown :: S is Null");
                }
            }
            catch (ClassNotFoundException e) 
            {
                e.printStackTrace();
            }
        }
        //return super.dispatchKeyEvent(event);
        return true;
        //break;
        //Added By Harsh Vardhan 31052013
    }

これは、ランチャーとそのワークスペースでうまく機能します。ALT + Tを押すと、タッチが有効または無効になります。ただし、戻る、ホーム、最近のアプリ、および通知を含む下部のパネルは、タッチしても反応しないままであり、アプリケーションの UI も同様です。探索モードでは、アイコン名はタッチで読み上げられますが、タッチは実装されていません。また、外部キーボードを取り外すと、すべてが通常の状態に保たれます。

Viewこの背後にある理由は、を拡張する StatusBar クラスとその他のクラスが、flagクラス全体または変数とメソッドのみをキャッシュし、フラグが切り替えられたメイン メモリを参照していないことが原因であると考えられます。私は旗を作ったことを認識していvolatileます。からこれを確認できたので、フラグがトグルされることを知っていますlogcat
これを解決できる方向を教えてください。事前に感謝します。

4

0 に答える 0