視覚障害者向けのファームウェアを構築しています。外部キーボードが接続されているときは、タッチスクリーンを無効にする必要があります。で切り替えます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
。
これを解決できる方向を教えてください。事前に感謝します。