[問題の説明]
テストフィードバック部は、赤外線モードで、赤外線を覚ますだろう音声ボタンを押して、偽のスタンバイを入力するには、電源ボタンを押してください。
背景には、告白:赤外線言語キーは、当社のカスタムボタン、キー225です。赤外線モードで、キーを押してプロンプトボックスを果たしている「私も、ブルートゥース、Bluetoothは声もキーを使用してくださいませんでした
[結論]問題
ではない私たちはフレームワークATV9を変更しないので、ソースコード中のAndroidのフレームワークを特色に設定されている問題、そうでないトラブルシューティングの問題。異常な試験方法。
[解析]詳細
android9印刷キーが開いていない、フレームは、印刷ログを開くために、コードを変更する必要があります。
パス:Android9.0-SDK/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
プリントを開きます。
static final String TAG = "WindowManager";
static final boolean DEBUG_INPUT = true;//在这里,默认是false的,我们将它改为true,打开打印。
次の2つの関数を見て、主に印刷します。
@Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTi keyCode=" + keyCode + " down=" + down + " repeatCount="
+ repeatCount + " keyguardOn=" + keyguardOn + " mHomePressed=" + mHomePressed
+ " canceled=" + canceled);
}
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
if (DEBUG_INPUT) {
Log.d(TAG, "interceptKeyTq keycode=" + keyCode
+ " interactive=" + interactive + " keyguardActive=" + keyguardActive
+ " policyFlags=" + Integer.toHexString(policyFlags));
}
スタンバイボタンを加えた後--- >>声紋ボタン、実験:
console:/ # [ 227.863558@1] input: irdec, power_state: 1, power_key_state: 0
05-28 04:03:47.865 3115 3179 D WindowManager: interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
05-28 04:03:48.065 3115 3179 D WindowManager: interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
05-28 04:03:48.065 3115 3179 D WindowManager: powerPress: eventTime=227819 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
======
05-28 04:03:50.046 3115 3179 D WindowManager: interceptKeyTq keycode=225 interactive=false keyguardActive=false policyFlags=2000000
console:/ # 05-28 04:03:50.121 3115 3179 D WindowManager: interceptKeyTq keycode=225 interactive=true keyguardActive=false policyFlags=22000000
これらの結果は、基本的な枠組みに何の問題を説明しないように、キーを受け取ることができphonewindowmanagerフレームワーク層、その
電流方向がよう:フレームからキーがなくなって見つけるには?
Q1.globalキー:行くように設定されていませんか?
A:偽スタンバイは、設定が先にあり、その後、除外します。
Q2。キーでフレームワーク契約の他の部分、ウェイクの原因?
:分析
frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java
@Override
public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
======
boolean isWakeKey = (policyFlags & WindowManagerPolicy.FLAG_WAKE) != 0
|| event.isWakeKey();
======
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
}
と frameworks\base\core\java\android\view\KeyEvent.java
/** @hide */
public static final boolean isWakeKey(int keyCode) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
case KeyEvent.KEYCODE_MENU:
case KeyEvent.KEYCODE_WAKEUP:
case KeyEvent.KEYCODE_PAIRING:
case KeyEvent.KEYCODE_STEM_1:
case KeyEvent.KEYCODE_STEM_2:
case KeyEvent.KEYCODE_STEM_3:
return true;
}
return false;
}
コードはネイティブフレームセットは、キーボタンを覚ますことができているので、それは、実質的に透明な問題をペアリングしている、コードで確認された、今phonewindowmanager印刷認証を追加します。
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
Log.d(TAG, "line:6105,whz,voice key is global key & wakekey and going to wake up" );
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
if (isWakeKey) {
Log.d(TAG, "line:6422,whz, is wakekey and going to wake up" );
wakeUp(event.getEventTime(), mAllowTheaterModeWakeFromKey, "android.policy:KEY");
}
印刷検証ログを追加した後:
console:/sdcard # logcat -c && logcat -v time -s WindowManager
--------- beginning of main
--------- beginning of system
1.按power键进入假待机:
[ 312.423757@1] input: irdec, power_state: 1, power_key_state: 0
01-01 03:06:40.199 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:40.199 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:40.401 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:40.402 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:40.402 D/WindowManager( 3123): powerPress: eventTime=312377 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
2.按BACK键:唤醒了
01-01 03:06:43.025 D/WindowManager( 3123): interceptKeyTq keycode=4 interactive=false keyguardActive=false policyFlags=2000000
01-01 03:06:43.025 D/WindowManager( 3123): boolean isWakeKey =true
01-01 03:06:43.026 D/WindowManager( 3123): line:6422,whz, is wakekey and going to wake up
01-01 03:06:43.229 D/WindowManager( 3123): interceptKeyTq keycode=4 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:43.229 D/WindowManager( 3123): boolean isWakeKey =true
3.再次按Power键进入假待机:
[ 318.426929@1] input: irdec, power_state: 1, power_key_state: 0
01-01 03:06:46.202 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:46.202 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:46.405 D/WindowManager( 3123): interceptKeyTq keycode=26 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:46.406 D/WindowManager( 3123): boolean isWakeKey =false
01-01 03:06:46.406 D/WindowManager( 3123): powerPress: eventTime=318380 interactive=true count=1 beganFromNonInteractive=false mShortPressOnPowerBehavior=1
4.按语音键:也唤醒了,并且走的是globalkey&&iswakekey
if (isValidGlobalKey(keyCode)
&& mGlobalKeyManager.shouldHandleGlobalKey(keyCode, event)) {
if (isWakeKey) {
======
01-01 03:06:49.168 D/WindowManager( 3123): interceptKeyTq keycode=225 interactive=false keyguardActive=false policyFlags=2000000
01-01 03:06:49.168 D/WindowManager( 3123): boolean isWakeKey =true
01-01 03:06:49.168 D/WindowManager( 3123): line:6105,whz,voice key is global key & wakekey and going to wake up
01-01 03:06:49.249 D/WindowManager( 3123): interceptKeyTq keycode=225 interactive=true keyguardActive=false policyFlags=22000000
01-01 03:06:49.250 D/WindowManager( 3123): boolean isWakeKey =true