- 博客(38)
- 收藏
- 关注
原创 Android实现手写输入
转换成正确字符,这块是各个输入法厂家的核心功能,一般不对外开源,都是通过调用so库形式实现,而库和调用方法也鲜有介绍。之前扣过某狗输入法的手写库可以使用,大致实现是通过上层抓取画点轨迹的坐标数组传给so库的识别函数得到返回结果。android应用开发中有时会有手写输入需求,非通过系统键盘手写功能,比如自定义键盘,这时就需要自己来实现,一般有两种场景:一种是类似手写签名保存;二、真正的手写输入,需要将笔迹识别成正确的字符,这个比较困难,主要是需要将画点轨迹。
2024-07-01 20:25:48
356
2
原创 关于音乐播放器与系统功能联动功能梳理
三、与其他播放器状态同步:本应用播放时暂停其他应用播放,进入其他应用播放时,暂停本应用的后台播放。通过MediaSession + MediaMetadata + PlaybackState实现。通过AudioManager监听onAudioFocusChange音频焦点变化实现。通知栏整体点击跳转到播放界面:注册全局监听广播。二、系统下拉栏中播放模块显示同步。一、通知栏播放显示和控制。与其他应用播放器状态同步。
2024-06-08 17:32:42
180
原创 android YouTube iframe Player API 集成youtube视频播放
原来是VP9解码器会在生成一个/dev/googlevp9_dev 设备节点,这个设备一直打开失败,猜想应该是权限问题,查看权限 为600,的确无法执行。做手机应用到这里基本就能顺利集成最新API了,但如果是做ROM开发,基于不同平台方案定制化开发,就还需要注意一些坑。后面发现是因为Youtube视频是VP9格式的,我手上的全志SDK版本比较老,还没有支持VP9解码器,然后跟厂商沟通,拿到了解码器补丁。到这一步,想着总该可以了吧,开开心心跑起来,emo...还是太年轻了。官方现在推荐所有平台都统一使用。
2024-03-16 11:11:15
645
原创 Android Studio导入各厂商定制的framework代码
在做android方案定制开发中,常常会碰到需要调用厂商自己定制sdk拓展的系统接口,而Android studio默认使用的是谷歌官方标准sdk,无法调用厂商私有接口,这时就需要将标准sdk中相关代码替换成厂商的,最常见的framework.jar中的代码,以此为例,将厂商提供的framework编译成framework.jar导入Android Studio,编译时替换掉标准sdk中的framework.jar,从而实现调用厂商私有的接口。才能在编译时使用我们引入的 framework.jar。
2023-12-16 17:01:19
575
原创 Android HDMI-CEC实现机顶盒与电视联动(共用遥控器)
所有的应用,都会间接通过HDMIControlManager或者输入通过Tv Input框架间接与HdmiControlService进行通信,HdmiControlService作为SystemServer服务的一个服务,负责处理CEC的命令并与HDMI-CEC HAl进行交互。我在实现过程中,通过上述应用层方法没有走通,CEC模块检测通不过,但实际是支持的,好在源码环境开发,我就直接到底层JNI代码中将检测条件去掉了,直接在底层实现相关功能,应用层方法最终也还是调用底层JNI方法的。
2023-11-10 19:41:46
2168
3
原创 RecycleView多次刷新或动态切换视图后,item位置发生偏移问题
1.列表嵌套时,在主Adapter中给每个子列表设置GridLayoutManger间距addItemDecoration都是添加一个新的,就会跟之前设置的形成叠加,没刷新一次就会叠加一次,就会出现间距越来越大。所以会出现item发生偏移情况。1.RecycleView嵌套RecycleView,采用GridLayoutManager时,没多刷新一次,item位置都会发生偏移,间距越来越大。许久没有做手机端APP了,许多控件功能特性和使用方式生疏了。每次设置item间距或切换视图时,先移除之前设置的间距。
2023-10-07 15:18:05
607
原创 Android HID设备(键盘、遥控等)功能实现流程及键值映射关系
(Human Interface Device,人机接口设备)是USB设备中常用的,是直接与人交互的USB设备,例如键盘、遥控器、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。之前文章中整理了android中各种功能键值定义,那么从键盘按键到安卓设备控制生效的流程是怎样的呢?EventHub从evdev驱动程序中读取原始事件,并使用键盘的按键布局映射将 Linux 按键代码(有时也称扫描代码)映射到 Android 按键代码中。将消费原始事件,并更新元键状态。
2023-09-08 09:31:28
5066
3
原创 Android 中常用的跨进程通信和跨线程通信方法总结
优点:简化了线程间通信:EventBus提供了一种简单的方式来进行线程间通信,开发人员无需手动处理线程切换和消息传递的细节。松耦合的组件通信:通过EventBus,组件之间可以进行松耦合的通信,发送者和接收者之间没有直接的依赖关系。线程切换方便:EventBus允许在发布事件时指定事件的接收线程,从而方便地在不同线程之间切换。1.优点:网络通信能力:Socket通信可以在网络层面上进行进程间通信,适用于跨网络的通信需求。有多个进程和线程就会涉及到跨进程通信或跨线程通信,用户状态同步,UI刷新等。
2023-09-06 12:01:24
878
原创 Android EditText输入网络IP地址格式校验
android:inputType="number|numberDecimal" 支持数字和一个小数点【账单金额类】android:inputType="number"只支持纯数字,不支持小数点。"number"与“digits"结合使用即可支持任意个小数点。
2023-09-05 17:40:20
573
原创 android 应用内音乐播放器
2.通知栏显示并要能进行播控。使用Notification+RemoteViews实现通知栏显示UI并通过RemoteView可以发送广播特性来实现跟Service播放通讯。2.通过bindService绑定播放,退出时Service也会退出,所以还要结合startService一起使用,在resume中startService即可进行后台播放。3.全局悬浮窗播控,使用WindownManager.addView()显示,由于上一步通知栏是通过广播与播放器进行通讯,这里也统一使用相同的广播进行通讯即可。
2023-09-04 12:00:10
133
原创 android 简单实现相册按日期分类排序
android 应用开发中经常遇到要将文件图片等数据列表按日期分类排序的需求,这里提供一个demo。10行代码就可以实现数据的分类和排序。这里提供Adapter的样例代码,其他的简单就不赘述了。1.列表数据按日期分类,同一天数据归类到一个item中。3.RecycleView嵌套RecycleView。4.支持多选,全选、取消全选。2.列表数据按日期倒序排列。
2023-06-27 17:17:28
1100
4
原创 android 客户端tcp工具类
android 客户端tcp工具类,该工具类采用单例模式实现,包含消息长度大小端计算、定时发送心跳包、断线重连、消息发送、消息接收。
2023-06-17 11:16:35
570
原创 Linux下收发AT指令的方法
右边是一个简单的串口程序源码,用法如下在Linux下创建一个t.c文件,并且将下方的源码保存。在t.c 所在路径下执行 gcc -o t t.c 指令生成可执行文件“t”后 运行可执行文件 ./t。根据提示输入需要发送AT指令的端口,如: /dev/ttyUSBO此时弹出系统提示打开端口成功,可输入AT指令,若需要退出可按住 Ctrl+z 即可退出。echo和cat是Linux和Android系统下和模块收发AT的一种简单方法。实际商用的情况下推荐用“.c”的方式实现。注意这个方法如果商用存在风险。
2023-04-12 11:06:37
1521
原创 Eclipse项目导入AndroidStudio开发直接调用系统级别API,不用反射
在android ROM开发过程中,由与源码应用目录结构都是Eclipse,开发的时候普通编辑器没有代码补全和自动导入、提示等,代码敲起来效率很低,而且现在都是用AS开发,所以有时需要将系统源码环境中的项目导入AS开发。但AS只能调用普通应用层的接口,导入的系统层的接口编译不过,除非都改成反射调用,但这样既改变了源码做法又耗性能,不划算。3.将.ide/modules/xxx/xxx.iml项目对应.iml编译文件中添加编译依赖class.jar。不过调用系统接口的地方依然会显示红色提示,不影响。
2023-04-01 18:03:46
284
原创 markdown使用语法大全并结合HBuilderX使用
云同步:HBuilderX+markdown用于云同步笔记的技巧,请参考[http://ask.dcloud.net.cn/article/13097](http://ask.dcloud.net.cn/article/13097)2. 如果需要跳行设置有序或无序列表,通过Ctrl+鼠标左键点中目标多行(可不连续),产生多光标,然后按快捷键Ctrl+Alt+“1”或“-”或“[”或“]”,可跳行设置列表符,尤其是有序列表,数字也会跳行加1。在列表符后回车或行尾Shift+回车,上一行留出列表符。
2023-03-29 11:54:09
429
原创 Android7.0高级设置修改一级菜单分类和显示顺序并跳转第三方应用
除了修改一级菜单位置和名称等,有时还需要定制跳转的第三方应用,比如恢复出厂和系统升级菜单,想跳转到客户提供的apk,可在SettingsActivity中,switchToFragment方法中通过拦截原生跳转,重定位到定制apk中。”菜单都是调整HDMI视频显示相关的设置,但“显示”菜单在“设备”分类下,“高级设置”菜单在“系统”分类下,且相隔较远,操作起来不太方便。现在想把“高级设置”菜单移动到“设备”分类下,并且位于“显示”菜单之后,该如何处理呢?中和对应的fragment数组。
2023-03-28 14:50:08
689
原创 Android 开机自动加载新wifi模块驱动
在android ROM 开发中经常会遇到产品更换wifi模块的情况,一般常见的wifi驱动android内核中自带都有,无需过多调试,要是碰上内核中没有的就需要根据厂商提供的驱动进行移植。在成功编译出驱动ko文件后,手动insmod 加载驱动是可以的,但是开机时不会自动加载,这时可按以下步骤进行调整,让设备开机自动加载新模块的驱动。1.libhardware_legacy会遍历所有的usb设备名称,与devices[]中的wifi模块名称进行对比,有匹配到的话,就会记住该名称的索引位置。
2022-09-21 18:34:23
3971
1
原创 Android 隐藏高级设置中的一级菜单
2.在SettingsActivity.java[com.android.settings.SettingsActivity]中找到对应的FRAGMENT列表位置注释掉 PrivacySettings.class.getName(),4.重新编译Settings.apk,adb push 到 system/priv-app/Settings/Settings.apk 即可验证。在android rom 定制开发中,经常遇到有些高级设置选项不想让用户看到或操作,常用的方法就是隐藏掉相关的一级菜单。
2022-09-21 17:44:06
1524
2
原创 如何彻底强制杀死后台无关进程?
在一些低端机型或小内存的ROM中,经常会出现内存不足的情况,除了优化自身程序外,往往需要通过杀死清空一些无关的后台进程来节省内存。这里提供一种非常规方法,通过禁用该包名来实现,不过需要注意的是,禁用包名后,对应程序进程会被清空,而且无法再启动,应用列表也找不到它,这就需要重新恢复该包名的可用性,这时它是不会自启的。比如am.forceStopPackage(),或者"adbshellkillall-9com.xxx.xxx".都是杀掉后一会又会自启。...
2022-07-21 09:24:36
2424
1
转载 Android 开机时间优化
要优化开机时间,先要了解开机流程: 开机的具体流程分析,后续会有专门文章说明。这里不再详述说。从上图可以看出。开机启动主要分为了 uboot 启动 kernel 启动 然后是system启动。uboot的启动时间几乎很短,优化的难度大且危险性较高。不建议进行优化。下面将列出印度项目优化的过程:关闭 kernel打印此过程大概能提升8s-10s的时间。设置方法比较多。可以uboot环......
2022-07-09 15:37:54
2888
原创 Android 实现动态切换Theme style 中的Splash(app 启动时背景图)
一般情况下,开发APP时为避免启动闪黑白屏的情况,我们会在AndroidManifest.xml中或者节点设置android:theme属性,并将背景设为透明@color/transparent这样就可避免启动闪黑白屏,但这种处理方式有一个弊端就是会让人产生启动比较慢的感觉,体验不太好。所以很多时候我们会将android:windowBackground设置一张启动图片,比如splash.png,这样就会无缝衔接启动,...
2022-07-08 14:00:36
4251
2
原创 android 双屏异显场景,如何使副屛Presentation响应遥控操作
正常情况下,双屏异显与同屏显示一样,遥控事件都只会传递到主屏类(Activity)。在有些使用场景中,副屛(例如KTV中主屏为触摸屏,副屛为电视机)也有通过遥控器交互操作的需求,那在副屛中改如何接收并响应遥控事件呢?这里提供一个方法:拦截主屏的事件分发流程,改由副屛自己去分发处理。1.在Activity中进行拦截按键事件的分发 @Override public boolean dispatchKeyEvent(KeyEvent event) { if (null
2022-03-31 18:08:17
3334
6
原创 android wifi 调试基本操作方法(USB设备STA模式)
基于海思3798MV200平台,参考了官方文档一、检查WiFi设备执行 shell 命令。lsusb 或 busybox lsusb,打印输出所有usb设备ID,例如:Bus 001 Device 004: ID 0bda:81790bda:8179 即RTL8188EUS 的USB 设备ID,看到了ID 说明设备已经识别到。如果不支持lsusb 和busybox lsusb 命令,那么可以采用以下方法检查:进入/sys/bus/usb/devices 目录,可以看到有多个子目录..
2021-12-20 16:06:29
2395
原创 android wifi驱动加载流程
本文基于android 7.0 海思 Hi3798MV200 平台WiFi驱动加载流程:一、.进入高级设置,无线设置界面(WifiSettings.java)打开WiFi开关(SwitchBar),触发WifiEnabler.java中的onSwitchChanged回调。通过WifiManager.setWifiEnabled(true)打开WiFi。二、然后通过WiFi状态机WifiStateMachine中的初始化状机(InitialState)态回调来加载驱动三、调用Nat.
2021-12-20 15:42:47
6848
原创 Android display 显示流程
我们知道android的图形绘制都是基于surface,一个应用可能有多个surface显示需求,每个surface的位置、区域、大小要求可能都不一样,最终呈现的必然是一个组合的效果。我所理解的流程大致如下(并不详细可能也不太准确,暂且记录一下):1.要组合多个surface需要用到一个组合器HWComposer最终合成一个mainSurface2.组合成mainSurface的方式有两种:SurfaceFlinger(软件方式,多用于基础图形层) 和 overlay(硬件方式,多用于视频层)3
2021-10-28 10:44:43
1903
原创 android 定制ROM集成 YouTube API,并实现双屏异显(主屏展示列表,副屛播放视频)
环境要求:1.安装youtube apk。 2.网络翻墙。在没有谷歌登录需求的时候可以不集成谷歌服务框架。当然,这样也会导致youtube应用无法正常使用,会一直弹窗提示没有谷歌服务。由于是定制Rom,我只需把youtube桌面图标隐藏就可以了,有需要的话再预装一个不依赖谷歌服框架的youtube相关应用即可(比如smarttube),内容和正版youtube一样的。步骤:1.在youtube开发者平台注册应用,获取API key 值2.下载youtube sdk jar包youtu
2021-10-14 17:54:02
977
原创 android apk 反编译及第三方加固脱壳
最近想参考一个第三方APP的功能实现,于是进行一些逆向分析。过程有不少坑,记录一下:step1.通过apktool.jar 工具解压apk文件,得到res资源文件和class.dex安卓可执行文件(也可以直接将.apk改为.zip进行解压,不过得到的xml文件未经反编译,难以阅读)step2. 通过dex2jar工具,将dex文件转成jar包step3. 通过jd-gui工具查看源码。(直接将jar文件拖到jd-gui中即可)step4. jd-gui文件保存功能,将.class字节..
2021-09-29 11:56:09
2878
原创 adb 连接黑盒(未知端口号)
我们知道android 默认adb tcp 连接端口为5555(电脑端adb 服务默认端口为5037),但很多rom厂商会定义一个自己的端口号,避免被他人通过adb随意连接.可通过setprop servcie.adb.tcp.prot xxxx设置。有时需要连接一个未知adb 端口的 android设置就比较麻烦了。我最近就碰到这种情况,最后是通过最笨的方法,脚本轮询端口(最大65535)才连上。很耗时。不过1024之前一般不用考虑。下面是bat脚本,轮询连接adb@echo offset
2021-09-24 18:50:55
2491
原创 记录一次Android Studio NDK 编译权限问题
平时都是在源码环境下开发,很久没有用到AS NDK了,今天通过AS 终端执行ndk-build命令时报错:ld: error: failed to write to the output file: Permission denied[armeabi-v7a] SharedLibrary : libxl.sold: error: failed to write to the output file: Permission deniedclang++: error: linker command
2021-09-02 14:05:00
2377
1
原创 android 7.0 Jack-server 编译问题
Android 7.0以后采用了Jack server编译,多人员编译需要配置不同端口号用户根目录下.jack-settings配置文件:# Server settingsSERVER_HOST=127.0.0.1SERVER_PORT_SERVICE=8598SERVER_PORT_ADMIN=8599# Internal, do not touchSETTING_VERSION=4.jack-server/config.properties配置文件:jack.ser.
2021-06-15 19:08:15
376
2
原创 Android 键值大全(键值定义源码)
package android.view;import android.os.Parcel;import android.os.Parcelable;import android.text.method.MetaKeyKeyListener;import android.util.Log;import android.util.Slog;import android.util.SparseArray;import android.util.SparseIntArray;import a..
2021-06-10 17:55:16
3151
3
原创 android 7.0 apk安装问题
之前在海思平台应用中安装apk时一切正常,移植到H6平台时一直报错,两个平台均是sdk7.0的,记录一下。开始报错:android.os.FileUriExposedException:这是个常见问题,android 7.0后对文件Uri访问形式作了更新:使用content://代替file://形式的Uri,系统将赋予APP临时的权限去获取目标Uri的资源。其中content://形式Uri通过FileProvider获取。获取步骤:1.在AndroidManifest.xml注册该F
2021-05-13 16:58:58
406
原创 通过WindowManager实现弹窗效果
在双屏(例如KTV里的电视端和触摸屏)异显场景下通过Dialog实现弹窗的话会出现弹窗是同屏的情况,这时候可通过WindowManager来实现单屏的弹窗效果。 LayoutParams lp = new LayoutParams(); // 设置window type lp.type = LayoutParams.TYPE_PRIORITY_PHONE; // 设置格式,效果为背景透明 lp.format = PixelFo...
2021-04-01 16:15:02
523
原创 记录一次ProgressDialog显示不及时问题
项目场景:点击列表Item,加载数据提示ProgressDialog显示不及时问题描述:在点击回调中加载数据,ProgressDialog显示不及时 dialog1 = new CommonDialog1(MainActivity.this, android.R.style.Theme_Translucent_NoTitleBar_Fullscreen, new OnCallback() { ...
2021-03-19 11:42:05
348
原创 android 反编译代码中goto语句还原
android 反编译后有很多goto语句该如何正确还原?例如下面一段反编译后的代码: public byte[] array() { ByteIO byteio; Iterator iterator; byteio = new ByteIO(size()); int i; if(idList == null) i = 0; else i = id...
2020-12-15 11:05:56
807
超级好用的串口调试工具
2023-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人