Android TVホットキー(ショートカットキー、コンビネーションキー)実現
TV上のいくつかの特殊な機能入口、シリアルポート印刷スイッチ、adbデバッグスイッチ、一部のメニューの表示隠しなどはホットキーで制御できます.
一般的な組み合わせキーは、ある機能キー+数字の列を選択すればいいです.ツールクラスにカプセル化することができます.ここでは、ショートカットキーを使用して、F 1といくつかの数字キーの組み合わせを使用します.
どのように使いますか?一般的に、テレビアプリケーションのメインインタフェースで上のツールクラスを呼び出します.
ステップ1:メインインタフェースActivityのonKeyDown()メソッドを書き換え、デジタルキーイベントをメソッドにカプセル化し、F 1キーであれば上記のホットキーツールクラスをインスタンス化し、Handlerを使用してホットキーメッセージを送信する.
ステップ2:テンキー処理関数でホットキーを処理する必要がある場合は、テンキーイベントをホットキーツールクラスのsetInputKeyNumber()メソッドに渡します.そうしないと、イベントをメインインタフェースに返します.
ステップ3:ホットキーメッセージを処理するHandlerを実現する.CallbackのhandleMessage()メソッド.
ステップ4:メインインタフェースはSpecialKeyCallBackの2つのコールバック方法を実現する.
bSpecialKeyという変数はホットキーの処理が必要か否かを判断するためにfalseに初期化する.
一般的な組み合わせキーは、ある機能キー+数字の列を選択すればいいです.ツールクラスにカプセル化することができます.ここでは、ショートカットキーを使用して、F 1といくつかの数字キーの組み合わせを使用します.
public class SpecialKey implements Constants {
private static SpecialKey instance = null;
private Context mContext;
private SpecialKeyCallBack mSpecialKeyCallBack;
private StringBuffer strBuffer;
private boolean hasSpecialKeyCode = true;
private SpecialKey(Context context) {
mContext = context;
initData();
}
public synchronized static SpecialKey getInstance(Context context) {
if (instance == null) {
instance = new SpecialKey(context);
}
return instance;
}
private void initData() {
strBuffer = new StringBuffer();
strBuffer.setLength(0);
}
public void setInputKeyNumber(int keyCode, KeyEvent event) {
int iDigital;
switch (keyCode) {
case KEY_0:
iDigital = 0;
break;
case KEY_1:
iDigital = 1;
break;
case KEY_2:
iDigital = 2;
break;
case KEY_3:
iDigital = 3;
break;
case KEY_4:
iDigital = 4;
break;
case KEY_5:
iDigital = 5;
break;
case KEY_6:
iDigital = 6;
break;
case KEY_7:
iDigital = 7;
break;
case KEY_8:
iDigital = 8;
break;
case KEY_9:
iDigital = 9;
break;
default:
iDigital = -1;
break;
}
if (iDigital != -1) {
strBuffer.append(String.valueOf(iDigital));
setSpecialMenu(strBuffer);
}
}
private void setSpecialMenu(StringBuffer strBuffer) {
int iNumber = Integer.parseInt(strBuffer.toString());
switch (iNumber) {
case 000:
// patch_enable
break;
case 111:
// show uart
break;
case 222:
// show SDSMenu
break;
case 333:
// ChangeLauncher();
break;
case 987:
// updateNetUpdateEnableStatus();
break;
case 135:
break;
case 789:
// PowerReboot
break;
case 8280:
break;
case 12500:
// adb switcher
break;
case 12459:
// print switcher
break;
case 8281:
// PatchMenu
break;
case 234:
// sendPVRRecTP();
break;
default:
hasSpecialKeyCode = false;
break;
}
setDataClear();
}
public void setDataClear() {
strBuffer.setLength(0);
if (mSpecialKeyCallBack != null) {
mSpecialKeyCallBack.onChangeSpecialKeyStatus(false);
mSpecialKeyCallBack.dismissNoChannelDLG(hasSpecialKeyCode);
hasSpecialKeyCode = true;
}
}
public void setSpecialKeyListener(SpecialKeyCallBack finish) {
this.mSpecialKeyCallBack = finish;
}
public interface SpecialKeyCallBack {
void onChangeSpecialKeyStatus(boolean status);
void dismissNoChannelDLG(boolean isDismiss);
}
}
どのように使いますか?一般的に、テレビアプリケーションのメインインタフェースで上のツールクラスを呼び出します.
ステップ1:メインインタフェースActivityのonKeyDown()メソッドを書き換え、デジタルキーイベントをメソッドにカプセル化し、F 1キーであれば上記のホットキーツールクラスをインスタンス化し、Handlerを使用してホットキーメッセージを送信する.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (onChangePIPKey(keyCode, event)) {
return true;
}
if (onChangePVRKey(keyCode, event)) {
return true;
}
if (isNumberKeyDown(keyCode, event)) {
return true;
}
switch (keyCode) {
case KEY_F1:
Log.d(CLASS_NAME, "bSpecialKey = " + bSpecialKey);
if (!bSpecialKey) {
bSpecialKey = true;
mSpecialKey = SpecialKey.getInstance(HomeActivity.this);
mSpecialKey.setSpecialKeyListener(this);
if (handler.hasMessages(RESPONSE_SPECIAL_KEY_DOWN)) {
handler.removeMessages(RESPONSE_SPECIAL_KEY_DOWN);
}
handler.sendEmptyMessageDelayed(RESPONSE_SPECIAL_KEY_DOWN, 5000);
} else {
}
break;
default:
break;
}
Log.d(CLASS_NAME, " " + event.getAction());
return super.onKeyDown(keyCode, event);
}
ステップ2:テンキー処理関数でホットキーを処理する必要がある場合は、テンキーイベントをホットキーツールクラスのsetInputKeyNumber()メソッドに渡します.そうしないと、イベントをメインインタフェースに返します.
private boolean isNumberKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KEY_0:
case KEY_1:
case KEY_2:
case KEY_3:
case KEY_4:
case KEY_5:
case KEY_6:
case KEY_7:
case KEY_8:
case KEY_9:
if (bSpecialKey) {
mSpecialKey.setInputKeyNumber(keyCode, event);
} else {
numberKeyDown(keyCode, event);
}
return true;
default:
break;
}
return false;
}
ステップ3:ホットキーメッセージを処理するHandlerを実現する.CallbackのhandleMessage()メソッド.
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case RESPONSE_POWER_ACTION:
// handle power key
break;
case RESPONSE_SPECIAL_KEY_DOWN:
if (bSpecialKey) {
bSpecialKey = false;
mSpecialKey.setDataClear();
}
break;
default:
break;
}
return false;
}
ステップ4:メインインタフェースはSpecialKeyCallBackの2つのコールバック方法を実現する.
@Override
public void onChangeSpecialKeyStatus(boolean status) {
bSpecialKey = status;
}
@Override
public void dismissNoChannelDLG(boolean isDismiss) {
if (isDismiss) {
dismissDialogInner(NO_CHANNEL_DLG);
isNoChannelDLGDismiss = isDismiss;
}
}
bSpecialKeyという変数はホットキーの処理が必要か否かを判断するためにfalseに初期化する.