全志 Android 11:实现响应全局按键

简介: 本文介绍了在全志平台Android 11上实现响应全局按键的方法,通过修改`TvWindowManager.java`来全局拦截特定的热键事件,并在`FocusActivity`中处理这些事件以启动调焦界面和控制步进电机调整焦距。

一、篇头

最近实现热键想功能,简单总结了下全志平台Android 11 的响应全局热键的方法。

调焦界面

二、需求

实现全局热键,响应F-、AF、F+三个按键,AF只用于启动调焦界面,F-和F+除了可以启动调焦界面外,还用于调整镜头的焦距(控制步进电机进退)。

遥控器局部图

三、按键配置

配置方法略,可参考本人红外或蓝牙的按键配置的相文章。

  • 如下在kl文件中添加3个按键
  • ZOOM_IN和ZOOM_OUT用于控制调焦电机的进和退,也用于启动调焦界面
  • APP_SWITCH 暂用于启动调焦界面
key 53   ZOOM_IN  //对应遥控器的F-
key 52   ZOOM_OUT //对应遥控器的F+
key 64   APP_SWITCH //对应遥控器的AF

四、代码实现

4.1 全局按键响应:TvWindowManager.java

  • 位置:android\frameworks\base\services\core\java\com\android\server\policy\TvWindowManager.java
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
   
   
        int keyCode = event.getKeyCode();
        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
        Log.d(TAG,"key event key = " + KeyEvent.keyCodeToString(keyCode));

…… 略…… 
        if (down) {
   
   

…… 略…… 

                case KeyEvent.KEYCODE_APP_SWITCH:
                case KeyEvent.KEYCODE_ZOOM_IN:
                case KeyEvent.KEYCODE_ZOOM_OUT:
                     //(1)判断当前topActivity,如果已经打开了调焦界面,则不再启动
                     if (mActivityManager == null)
                         mActivityManager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);
                     ComponentName cn = mActivityManager.getRunningTasks(1).get(0).topActivity;
                     String ActivityName = cn.getClassName();
                     Log.d(TAG, "current activity is " + ActivityName);
                     if (ActivityName.contains("cictech.projector.FocusActivity")) {
   
   
                         Log.d(TAG, " do NOT start FocusActivity ");
                         break;
                     }
                    //(2)启动调焦界面
                    Log.d(TAG, " Key down to start FocusActivity ");
                    Intent focusIntent = new Intent();
                    focusIntent.setComponent(new ComponentName("com.android.tv.settings", "com.android.tv.settings.szhou.projector.FocusActivity"));
                    focusIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    focusIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    mContext.startActivity(focusIntent);
                    break;

4.2 调焦界面:FocusActivity.java

public class FocusActivity extends Activity {
   
   

    private final String TAG = "FocusActivity";
    private JniMotor mJniMotor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_focus);
        mJniMotor = new JniMotor();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
   
   

        switch (keyCode){
   
   
            case KeyEvent.KEYCODE_ZOOM_IN:
            {
   
   
                //right
                Log.d(TAG, "KEYCODE_ZOOM_IN + 5" + mJniMotor.ioctl(1, 5));
            }
            break;
            case KeyEvent.KEYCODE_ZOOM_OUT:
            {
   
   
                //left
                Log.d(TAG, "KEYCODE_ZOOM_OUT -5 " + mJniMotor.ioctl(2, 5));
            }
            break;
            default:
                return super.onKeyDown(keyCode, event);
        }
        return true;
    }
}

4.3 调试打印

  • Andorid 打印如下

在这里插入图片描述

相关文章
|
5月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
63 2
|
7月前
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
192 2
|
3月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
在Android开发中,为应对复杂应用场景和繁重计算任务,多线程与异步编程成为保证UI流畅性的关键。本文将介绍Android中的多线程基础,包括Thread、Handler、Looper、AsyncTask及ExecutorService等,并通过示例代码展示其实用性。AsyncTask适用于简单后台操作,而ExecutorService则能更好地管理复杂并发任务。合理运用这些技术,可显著提升应用性能和用户体验,避免内存泄漏和线程安全问题,确保UI更新顺畅。
121 5
|
4月前
|
存储 Java 数据库
基于全志H713 Android 11:给TvSettings添加default.xml默认值
本文介绍了在全志H713 Android 11平台上为TvSettings应用添加HDMI CEC功能的默认设置值的方法,通过修改SettingsProvider的源码和配置文件来实现默认值的设置,并提供了详细的步骤和测试结果。
103 0
基于全志H713 Android 11:给TvSettings添加default.xml默认值
|
4月前
|
Java Android开发 芯片
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
本文介绍了如何将基于全志H713芯片的AOSP Android源码导入Android Studio以解决编译和编码问题,通过操作步骤的详细说明,展示了在Android Studio中利用代码提示和补全功能快速定位并修复编译错误的方法。
182 0
使用Android Studio导入Android源码:基于全志H713 AOSP,方便解决编译、编码问题
|
4月前
|
XML Android开发 UED
"掌握安卓开发新境界:深度解析AndroidManifest.xml中的Intent-filter配置,让你的App轻松响应scheme_url,开启无限交互可能!"
【8月更文挑战第2天】在安卓开发中,scheme_url 通过在`AndroidManifest.xml`中配置`Intent-filter`,使应用能响应特定URL启动或执行操作。基本配置下,应用可通过定义特定URL模式的`Intent-filter`响应相应链接。
119 12
|
4月前
|
开发工具 Android开发 git
全志H713 Android 11 :给AOSP源码,新增一个Product
本文介绍了在全志H713 Android 11平台上新增名为myboard的产品的步骤,包括创建新的device目录、编辑配置文件、新增内核配置、记录差异列表以及编译kernel和Android系统的详细过程。
197 0
|
4月前
|
JSON Android开发 数据格式
Android项目架构设计问题之实现交互响应的结构化处理如何解决
Android项目架构设计问题之实现交互响应的结构化处理如何解决
20 0
|
7月前
|
JSON 数据库 Android开发
安卓高级编程技巧:提升应用性能和响应性
【4月更文挑战第13天】本文探讨了提升安卓应用性能和响应性的高级技巧,包括理解性能瓶颈(如过度绘制、内存泄漏、异步任务不当和数据库查询不合理)、优化布局以减少过度绘制、进行内存优化、合理使用多线程、优化数据库操作和高效利用UI线程。通过实例展示了如何改进网络请求的处理,强调了性能优化对用户体验的重要性,并指出随着技术发展,将持续有新工具助力性能提升。
65 7
|
7月前
|
Android开发
Android 新建一个lunch项(全志方案)
Android 新建一个lunch项(全志方案)
145 0