首页 文章 精选 留言 我的

精选列表

搜索[硬件],共10002篇文章
优秀的个人博客,低调大师

mtk硬件项目开始关闭蓝牙功能:mtk 硬件ScanCode和keycode应用演示示例

项目要求:该项目因为没有使用android5.0,导致启动bluetooth的蓝牙audio slave功能必须使用第三方模组,该第三方模组,启动是通过android主板通过GPIO控制。UI界面是通过图形选择或者一个kpd组合按键来打开关闭或者是启动蓝牙搜索功能。 1,用户按键的侦測: 标准的行为,用户的组合按键,kernel里面向上层发送scancode,然后framework把scancode转换成keycode的keyevent,该keyevent会被PhoneWindows接受并处理。 对于mtk,从按键到keycode,已经被封装起来。这个封装的工具就是dct. 比如。我们的项目组合按键是:KCOL2+KROW1,我们能够在图形工具中如选择我们的配置 在样例中,我们设置该案件的keycode是SYM 当然,也能够自定义新的keycode。我嫌麻烦,就直接使用现成的,怎样定义新的按键,请看附录: 2,侦測用户按键行为,发送对应的intent 上面的keycode在发送到各个window之前。是被PhoneWindowManager.java接收到的,在当中有一个方法: @Override public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, booleanisScreenOn) { 望文生义。看名字我们就知道这个函数的作用。 我们在代码中例如以下拦截: if (keyCode== KeyEvent.KEYCODE_SYM) { Log.e("zcfdebug","nowwe catch the bluetooth button action !"); if (down){ Log.e("zcfdebug","nowwe catch the bluetooth button down !"); } if (up){ Log.e("zcfdebug","nowwe catch the bluetooth button up !"); } return 1; } 当然,KEYCODE_SYM是原来系统中已经定义的keycode,事实上就是输入法的选择,我们须要屏蔽这个功能。在alps/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java: /** * @hide */ public voiddispatchKeyEvent(Context context, int seq, KeyEvent key, FinishedEventCallback callback) { booleanhandled = false; /*zcfdebug--<< synchronized(mH) { if(DEBUG) Log.d(TAG, "dispatchKeyEvent"); if(mCurMethod != null) { if(key.getAction() == KeyEvent.ACTION_DOWN && key.getKeyCode() == KeyEvent.KEYCODE_SYM) { showInputMethodPickerLocked(); handled = true; }else { try { if (DEBUG) Log.v(TAG, "DISPATCH KEY: " + mCurMethod); final long startTime = SystemClock.uptimeMillis(); enqueuePendingEventLocked(startTime, seq, mCurId, callback); mCurMethod.dispatchKeyEvent(seq, key, mInputMethodCallback); return; } catch (RemoteException e) { Log.w(TAG, "IME died: " + mCurId + " dropping: "+ key, e); } } } } zcfdebug-->>*/ callback.finishedEvent(seq, handled); } 凝视掉原有功能就好了。 依照我们的项目定义,按键3-5秒为蓝牙状态电源打开搜索功能,长按8秒以上为关闭。 关闭的时候,长按8秒没有不论什么动作。 if (keyCode== KeyEvent.KEYCODE_SYM) { Log.e("zcfdebug","nowwe catch the bluetooth button action !"); if (down){ Log.e("zcfdebug","nowwe catch the bluetooth button down !"); //lastSymKeyDownTime=System.currentTimeMillis(); lastSymKeyDownTime=event.getEventTime(); } if (up){ Log.e("zcfdebug","nowwe catch the bluetooth button up !"); SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime; //SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime; Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime); if(SymKeyPressTime>2000&& SymKeyPressTime<5000){ Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!"); } if(SymKeyPressTime>7000){ Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!"); } } return 1; } 蓝牙开关等动作,我们在外边的apk程序中实现。我们仅仅要发送intent实现就OK了,代码例如以下: if (keyCode== KeyEvent.KEYCODE_SYM) { Log.e("zcfdebug","nowwe catch the bluetooth button action !"); if (down){ Log.e("zcfdebug","nowwe catch the bluetooth button down !"); //lastSymKeyDownTime=System.currentTimeMillis(); lastSymKeyDownTime=event.getEventTime(); } if (up){ Log.e("zcfdebug","nowwe catch the bluetooth button up !"); SymKeyPressTime=event.getEventTime()-lastSymKeyDownTime; //SymKeyPressTime=System.currentTimeMillis()-lastSymKeyDownTime; Log.e("zcfdebug","theSymKeyPressTime is "+SymKeyPressTime); if(SymKeyPressTime>2000&& SymKeyPressTime<5000){ Log.e("zcfdebug","nowwe catch the bluetooth press 3 second!"); Intent btStartStopIntent = new Intent(BT_STARTSTOP); mContext.sendBroadcast(btStartStopIntent); } if(SymKeyPressTime>7000){ Log.e("zcfdebug","nowwe catch the bluetooth press 8 second!"); Intent btPairIntent = new Intent(BT_PAIR); mContext.sendBroadcast(btPairIntent); } } return 1; } 应用程序怎样接收处理intent,将在下一篇文章描写叙述 附录:Howto add a new key on android ICS\ICS2: [Description] How to add a new keyon android ICS/ICS2 [Solution] 1.在DCTtool keypad list文件添加新按键的选项 alps\mediatek\source\dct\Keypad_YuSu.cmp中加入新键,如SMS快捷键 KEY_SYM KEY_SMS KEY_0 2.打开DCTtool在keypad矩阵中在对应定义的按键位中加入新按键,如SMS,然后Save 3.改动linux键盘码文件input.h 因为preloader\uboot\kernel\factory等情况分开使用,对应的文件路径下的input.h都应该改动 为新按键添加键码值 kernel\include\linux\input.h bionic\libc\kernel\common\linux\input.h external\kernel-headers\original\linux\input.h external\qemu\linux_keycodes.h mediatek\plaform\mt6575\preloader\src\drivers\inc\linux\input.h Mediatek\plaform\mt6575\uboot\inc\linux\input.h 如KEY_SMS #define KEY_SMS 252 4.添加keypadlayout文件键盘映射,linux和androidkey映射 mediatek\config\<projectname>\mt6575-kpd.kl 如: key 252 SMS 当中252是linux键码,SMS是android识别key值假设是须要唤醒系统,还须要添加WAKE 假设新按键是全键盘的一些生僻字符,改动:mediatek\config\<project name>\mt6575-kpd.kcm 5.改动Java识别keycode framework/base/include/ui/KeyCodelabels.h KEYCODES数据结构后面添加 {"SMS",220} framework/base/native/include/android/KeyCodes.h 在按键定义项添加AKEYCODE_SMS = 220; 6.改动Java键盘事件 framework/base/core/java/android/view/keyevent.java /** *@hide */ public static finalint KEYCODE_SMS =220; 最后的按键为新增的 private static finalint LAST_KEYCODE ==KEYCODE_SMS; 以上/**/凝视的code是android非开放API或变量定义的时候,须要加入JavaDoc的识别,否则要运 行makeupdate-api才干build通过 假设是系统按键,改动framework/base/libs/ui/input.cpp isSystemKey()添加caseAKEYCODE_SMS: 7.改动XML文件描写叙述符framework/base/core/res/res/values/attr.xml <enumname="KEYCODE_SMS" value="220" /> 8.添加測试验证log在android framework\base\policy\src\com\android\internal\polidy\impl\phoneWindowManager.java 在interceptKeyBeforeDispatching()添加 if(keycode==KeyEvent.KEYCODE_SMS){ log.d(TAG,"interceptKeyTi KEYCODE_SMS keyCode="+ keyCode + "down=" + down + " repeatCount=" +repeatCount + “ keyguardOn=” + keyguardOn + “ mHomePressed=”+ 9.能够抓log确认,或者添加測试APK检測 Kernal log: <4>[253.828234]kpd:register = fffe ffff ffff ffff ff <4>[253.828825]kpd:(pressed) HW keycode = 0 <4>[253.829348]kpd:report Linux keycode = 252 <4>[253.829857]kpd:save new keymap state <4>[254.030814]kpd:register = ffff ffff ffff ffff ff <4>[254.031405]kpd:(released) HW keycode = 0 <4>[254.031936]kpd:report Linux keycode = 252 <4>[254.032445]kpd:save new keymap state Android log: WindowManager:interceptKeyTq keycode=220 screenIsOn=true keyguardActive=false policyFlags =#2000000 down =false canceled = false D WindowManager:interceptKeyTi keyCode=220 down=false repeatCount=0 keyguardOn=false mHomePressed=falsecanceled=false D WindowManager:interceptKeyTi KEYCODE_SMS keyCode=220 down=false repeatCount=0 keyguardOn=falsemHomePressed=false canceled=false 版权声明:本文博主原创文章。博客,未经同意不得转载。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4873785.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

EGO 灯语:硬件的"无声语言"

在具身智能领域,EGO(Egocentric,第一人称视角)数据采集是一项基础而关键的工作。采集设备通常以头戴、眼镜安装或身体佩戴的形式部署在采集者身上,持续记录视频、音频、IMU 等多模态传感器数据。一次典型的采集任务可能持续数小时,期间设备状态随时可能发生变化:存储空间逐渐耗尽、电池电量下降、多设备间的时间同步可能丢失、设备可能过热。

优秀的个人博客,低调大师

Android硬件入门-照相机

学习Android不能不学习照相机,现在各种美容相机,微信朋友圈发图,现在升级之后直接下拉就可以照相了,各种艳照的的源头也是照相机,扯远了,有点邪恶了,还是简单学习一下Android中照相机的使用,Android中照相机的使用一般分为两种使用已有的照相App(可以理解为系统内置的照相机)和单独创建一个照相App,第一种方式简单易懂,第二种方式如果做的好的话可以养活一个公司~今天就简单的描述一下第一种的调用~ 基础工作 调用照相机需要照相,照相就需要存储,存在外部存储中需要设置权限,本次设置的三个权限:一个是调用Camera权限,第二个是要求设备有照相机,第三个是在外部设备写的权限: 1 2 3 4 5 <uses-permission android:name= "android.permission.CAMERA" /> <uses-feature android:name= "android.hardware.camera" /> <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE" /> 简单的页面,一个Buttom,一个ImageView: Demo实现 简单的三部曲,首先创建Intent,然后启动Intent,最后接收结果,没有前置摄像头,就用的是模拟的: 拍照事件: 1 2 3 4 5 6 7 public void cameraEvent(View view) { intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 创建一个意图去获取图片 file= getOutputMediaFile(); // 获取路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); // 设置文件名 // 启动Intent startActivityForResult(intent, IMAGE_REQUEST_CODE); } 获取文件路径的方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 // 图片路径 private static File getOutputMediaFile() { File mediaStorageDir = new File( Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), tag); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d(tag, "存储目录创建失败" ); return null ; } } // 创建文件名 String timeStamp = new SimpleDateFormat( "yyyyMMdd_HHmmss" ) .format( new Date()); File mediaFile = null ; mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg" ); Log.d(tag, "存储目录:" + mediaFile); return mediaFile; } 完成之后的接收事件需要重写Activity中的onActivityResult方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub if (requestCode == IMAGE_REQUEST_CODE&&resultCode==RESULT_OK) { imageView=(ImageView) findViewById(R.id.camera_img); //两种设置方式 //图片较大的时候可以使用这种 Bitmap bitmap=BitmapFactory.decodeFile(file.toString()); imageView.setImageBitmap(bitmap); // imageView.setImageURI(Uri.fromFile(file)); } super .onActivityResult(requestCode, resultCode, data); } 效果如下: 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4086004.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册