- 博客(57)
- 收藏
- 关注
原创 Android TextView实现跑马灯效果性能优化
在生活中经常见到文字滚动显示场景,比如电子屏幕信息提示、KTV电视上显示播放歌曲信息等,俗称跑马灯。性能优化就是要积少成多,每个小功能细节上节省一点,应用整体上就会流畅很多。android:marqueeRepeatLimit="marquee_forever" //无限循环滚动。但是以上滚动效果只有在TextView获取焦点时才会触发,所以需要通过代码设置TextView焦点。实践发现效果不明显,性能消耗还是偏高。android:ellipsize="marquee" //显示长度不够时滚动显示。
2025-03-25 16:49:46
298
原创 AndroidStudio中build.gradle脚本和业务代码共用全局变量实现方案BuildConfig类
在app的build.gradle文件的buildTypes或productFlavors闭包中,使用buildConfigField添加自定义字段。
2025-03-13 18:51:10
689
原创 海思高安主控芯片兼容编译fastboot流程
华为海思主控芯片有高安和非高安之分,主要是安全性上区别,启动程序不同,一般无法共用。但实际生产中可能出现混料或者同一款产品不同批次一个是高安的一个是非高安的,这时就需要软件上做兼容,实际是高安固件是可以做到兼容非高安的,反之则不行。
2025-03-12 20:32:41
320
原创 Exoplayer2源码编译FFmpeg拓展模块实现音频软解码
中介绍了最新版本的Exoplayer(androidx.Media3)编译FFmpeg模块的流程,有就是media3版本的explayer最低支持的sdk版本是21也就是Android5.x,但是市面上还是有很多IOT设备是很老的android4.4(sdk=19)的,需要兼容的话就只能使用Exoplayer2来实现播放功能。坑二:编译报错找不到Android SDK,或者NDK版本与前面编译ffmpeg时使用的不一致,导致各种错误。【ANDROID_ABI】:Android最低支持版本,这里设置19。
2025-03-05 20:37:04
967
原创 ExoPlayer中常见MediaSource子类的区别和使用场景
Exoplayer作为谷歌官方推出的替代MediaPlayer播放器,功能强大,可拓展性强,被广泛用于各种音视频使用场景,支持各种常见的格式和场景。Exoplayer支持多种资源读取方式,以MediaSource 的子类开放给开发者使用。我们常用的有ProgressiveMediaSource、DashMediaSource、HlsMediaSource、ClippingMediaSoutce (片段流)、RtspMediaSource、MergingMediaSource等。
2025-02-28 16:03:47
692
原创 Android双屏异显副屏实现PIP效果小窗口同步显示主屏播放画面
而主屏是VGA输出的,而且主要是显示操作界面的,跟电视上的画面并不完全一样,也就是双屏异显,只是小窗口画面一样,这就需要软件上来处理了。方式二:独立普通应用实现,不依赖底层,Exoplayer+TextureView实现,textureView.getBitmap()方法就可以直接得到当前播放帧的位图,在主屏MainActivity通过ImageView进行显示即可。在KTV应用开发中一个常见的场景需求就是一台设备要接多个显示屏,其中一个主屏一般都是触摸屏,通过VGA线连接,支持手点击操作点歌切歌等。
2025-02-27 15:22:02
527
原创 最新版本Exoplayer(MediaX)实现K歌原伴唱包括单音轨和双音轨
使用Exoplayer实现原伴唱切换功能,对于双音轨歌曲很简单,有现成的接口调用进行音轨切换就可以了,对于单音轨歌曲要切换左右声道Exoplayer并没有提供现成的接口,网上也有一些方法实现,但基本上都用不了了,要么是接口被舍弃了,要么就是达不到想要的效果。至于哪个音轨或声道是原唱还是伴唱由制作歌曲的时候觉得,不同的文件可能是反的,所以一般的做法是人工对歌曲列表做标识,标明该歌曲哪一个音轨或者声道是原唱,在切换原伴唱时先获取该标识就可以知道该使用哪个音轨或者声道了。1.双音轨:音轨一是原唱,音轨二是伴唱。
2025-02-21 12:44:31
601
原创 最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程
android设备系统自带的mp3解码器报错[OMX.google.mp3.decoder],在不同的平台上测试结果都报一样的错, 硬解码不行那就只能想办法进行软解了。decoder_ffmpeg模块最终会被编译打包成aar文件供Android调用,由于依赖FFmpeg,先要下载FFmpeg源码进行编译得到所依赖的库才能成功打包aar。下面详细介绍整个流程:参考该文章。ExoPlayer 是一个开源的 Android 媒体播放库,由 Google 开发和维护,用于替代 Android 系统自带的。
2025-02-21 10:50:14
1548
原创 android ROM开发网络下载速度缓慢问题解决方案
我们主要关注/proc/sys/net/ipv4/tcp_rmem和/proc/sys/net/ipv4/tcp_wmem配置文件,决定了tcp收发数据缓冲区大小。注意:如果只是通过shell命令中途修改配置,在网络变化或者设备重启后就会恢复系统默认配置,所以想要永久改变配置还是要通过修改源码实现,或者在应用层每次开机或网络变化时修改一次。关于tcp缓冲区大小默认值配置,可修改内核源码:kernel/linux3.18/net/ipv4/tcp.c中的tcp_init()函数。
2025-01-08 18:53:23
559
原创 Android多张图片融合组合成一张新图片
在Android平台上,图像融合通常涉及到像素级别的操作,即根据一定的规则计算每个像素点的颜色值,从而得到融合后的图像。有一张大的半透底图bmp_bg和一张小的半透上层图bmp_top,现需要用小图覆盖大图的左上角部分,从而实现替换一些由第三方提供的不可控内容,由于都是半透图,直接叠加的话无法实现完全遮挡,所以需要将被覆盖的底图部分掏空成全透明的。在Android开发中,图像融合是一项常见且重要的技术,它能够将多张图像按照一定的规则组合成一张新的图像,广泛应用于图像处理、摄影后期、
2024-11-29 12:06:23
630
原创 RK3568 Android12跳过认证 预置谷歌服务GMS
谷歌全家桶中有三个是必现安装的:Google Services Framework 【gsf】、Google Play Services 【gms】、Google Play Store【Playstore】,其他应用根据需要预装即可,先去APK Mirror平台下载与设备环境匹配的apk,比如我的环境是android12 arm64,没有匹配的就下载通用版本。未获得Play保护机制认证的设备可能无法正常使用Google Play商店,下载或更新应用时可能会遇到问题。此设备未获得Play保护机制认证。
2024-11-06 19:07:03
2004
原创 Android实现可选区域全局屏幕截屏和应用内截屏
这个交互效果不太理想,选择区域是一次性的,不显示选择区域,也不能对现象区域进行拖拽或者放大缩小。从这可以看出默认执行的截屏类型是TAKE_SCREENSHOT_FULLSCREEN,即全屏的,若想进行区域截屏,将类型改成TAKE_SCREENSHOT_SELECTED_REGION即可。但这个方法是无法对非本应用画面进行截图的,比如当前Activity是一个半屏弹窗,那么弹窗之外的区域是无法截取到的。优化:自定义显示一个区域框,可以对区域框进行拖拽、放大、缩小,点击确认按钮后进行选定区域的截屏。
2024-09-14 14:46:04
1443
原创 关于Android12第三方应用左右两侧有黑边问题
后来无意中发现把以前开发的厂测工具应用安装在这上面也有黑边,而这个厂测在之前的平台上是正常的,不同的是之前平台是Android7.0的,APP的targetSdk=23,也是7.0,所以猜测是跟sdk版本有关。这是android12开始支持了多窗口和分屏等功能,对一些低版本sdk的应用兼容性有了调整,如果不想改变targetsdk到更高,也可以为Activity增加resizeableActivity属性,同样可以达到去除黑边效果。这样就可以从系统层面解决所有应用显示黑边问题,包括安装的第三方应用。
2024-09-06 19:04:45
551
1
原创 Android强制设置所有应用显示方向,忽略应用本身的设置
在ROM定制系统开发过程中经常会遇到需要改变第三方应用显示方向的需求,比如抖音这种手机APP都是强制竖屏的,不会跟随屏幕旋转。方法就是处理应用中的显示方向设置的,第一个参数orientation就是应用设置的方向,在此方法中进行拦截重写即可。:应用可以注册方向监听器来监听设备的方向变化,通过 Sensor Service 获取传感器数据,并计算设备的方向。:屏幕旋转后,系统请求重新绘制界面以适应新的方向,应用的布局会根据新的配置进行重新计算和绘制。方法设置屏幕方向,此方法等同于在。
2024-08-30 18:46:56
974
原创 Android12一行代码实现系统截图效果
那么也就是说在任何第三方应用开发时,只需发送一条android.intent.action.SCREENSHOT即可触发系统截图功能。继续搜索截图任务mHandler.post(mScreenshotRunnable);一般android手机都可以通过“电源键+音量键”组合触发系统截图功能,那么自己开发通过代码如何实现呢?interceptKeyBeforeDispatching()先接收到截屏按键KEYCODE_SYSRQ。结果成功触发了系统截图,所以实现系统截图功能一行代码,发送个广播就可以了。
2024-08-16 11:21:37
473
原创 RK平台如何 将第三方资源文件和代码编译到系统内
在定制系统开发中经常遇到需要将一下第三方资源或代码集成编译到系统固件包中,比如预装apk、预置特定目录文件、开源项目代码或者自己新建的项目代码。1.编辑项目Android.mk为系统文件,比如系统apk。目录(可以彻底卸载,恢复出厂操作后无法恢复)目录(可以卸载,恢复出厂操作后能恢复)三、编译新增的项目代码到系统img中。二、预添加自定义目录和文件。编译 android。
2024-08-09 19:17:55
356
原创 android 支持通过外接4G模块联网
后来在全志A40平台上无论怎么调都无法自动拨号,但是通过linux方式用pppd命令可以拨号成功拿到IP和DNS信息,但是由于没有走android系统的网络切换流程,系统网络信息不会更新,导致无法上网。动态更新网络IP和dns是在ConnectivityService.java中进行,因为所有形式网络路由信息获取到后都要进行网络信息注册:registerNetworkAgent,注册成功后相关会自动进行相关信息更新,所以动态调用registerNetworkAgent()就可以了。: 网络句柄,这里是。
2024-07-30 21:02:42
1195
原创 Android实现手写输入
转换成正确字符,这块是各个输入法厂家的核心功能,一般不对外开源,都是通过调用so库形式实现,而库和调用方法也鲜有介绍。之前扣过某狗输入法的手写库可以使用,大致实现是通过上层抓取画点轨迹的坐标数组传给so库的识别函数得到返回结果。android应用开发中有时会有手写输入需求,非通过系统键盘手写功能,比如自定义键盘,这时就需要自己来实现,一般有两种场景:一种是类似手写签名保存;二、真正的手写输入,需要将笔迹识别成正确的字符,这个比较困难,主要是需要将画点轨迹。
2024-07-01 20:25:48
1021
2
原创 关于音乐播放器与系统功能联动功能梳理
三、与其他播放器状态同步:本应用播放时暂停其他应用播放,进入其他应用播放时,暂停本应用的后台播放。通过MediaSession + MediaMetadata + PlaybackState实现。通过AudioManager监听onAudioFocusChange音频焦点变化实现。通知栏整体点击跳转到播放界面:注册全局监听广播。二、系统下拉栏中播放模块显示同步。一、通知栏播放显示和控制。与其他应用播放器状态同步。
2024-06-08 17:32:42
281
原创 android YouTube iframe Player API 集成youtube视频播放
原来是VP9解码器会在生成一个/dev/googlevp9_dev 设备节点,这个设备一直打开失败,猜想应该是权限问题,查看权限 为600,的确无法执行。做手机应用到这里基本就能顺利集成最新API了,但如果是做ROM开发,基于不同平台方案定制化开发,就还需要注意一些坑。后面发现是因为Youtube视频是VP9格式的,我手上的全志SDK版本比较老,还没有支持VP9解码器,然后跟厂商沟通,拿到了解码器补丁。到这一步,想着总该可以了吧,开开心心跑起来,emo...还是太年轻了。官方现在推荐所有平台都统一使用。
2024-03-16 11:11:15
1203
原创 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
732
1
原创 Android HDMI-CEC实现机顶盒与电视联动(共用遥控器)
所有的应用,都会间接通过HDMIControlManager或者输入通过Tv Input框架间接与HdmiControlService进行通信,HdmiControlService作为SystemServer服务的一个服务,负责处理CEC的命令并与HDMI-CEC HAl进行交互。我在实现过程中,通过上述应用层方法没有走通,CEC模块检测通不过,但实际是支持的,好在源码环境开发,我就直接到底层JNI代码中将检测条件去掉了,直接在底层实现相关功能,应用层方法最终也还是调用底层JNI方法的。
2023-11-10 19:41:46
3836
3
原创 RecycleView多次刷新或动态切换视图后,item位置发生偏移问题
1.列表嵌套时,在主Adapter中给每个子列表设置GridLayoutManger间距addItemDecoration都是添加一个新的,就会跟之前设置的形成叠加,没刷新一次就会叠加一次,就会出现间距越来越大。所以会出现item发生偏移情况。1.RecycleView嵌套RecycleView,采用GridLayoutManager时,没多刷新一次,item位置都会发生偏移,间距越来越大。许久没有做手机端APP了,许多控件功能特性和使用方式生疏了。每次设置item间距或切换视图时,先移除之前设置的间距。
2023-10-07 15:18:05
868
原创 Android HID设备(键盘、遥控等)功能实现流程及键值映射关系
(Human Interface Device,人机接口设备)是USB设备中常用的,是直接与人交互的USB设备,例如键盘、遥控器、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。之前文章中整理了android中各种功能键值定义,那么从键盘按键到安卓设备控制生效的流程是怎样的呢?EventHub从evdev驱动程序中读取原始事件,并使用键盘的按键布局映射将 Linux 按键代码(有时也称扫描代码)映射到 Android 按键代码中。将消费原始事件,并更新元键状态。
2023-09-08 09:31:28
7554
3
原创 Android 中常用的跨进程通信和跨线程通信方法总结
优点:简化了线程间通信:EventBus提供了一种简单的方式来进行线程间通信,开发人员无需手动处理线程切换和消息传递的细节。松耦合的组件通信:通过EventBus,组件之间可以进行松耦合的通信,发送者和接收者之间没有直接的依赖关系。线程切换方便:EventBus允许在发布事件时指定事件的接收线程,从而方便地在不同线程之间切换。1.优点:网络通信能力:Socket通信可以在网络层面上进行进程间通信,适用于跨网络的通信需求。有多个进程和线程就会涉及到跨进程通信或跨线程通信,用户状态同步,UI刷新等。
2023-09-06 12:01:24
1142
原创 Android EditText输入网络IP地址格式校验
android:inputType="number|numberDecimal" 支持数字和一个小数点【账单金额类】android:inputType="number"只支持纯数字,不支持小数点。"number"与“digits"结合使用即可支持任意个小数点。
2023-09-05 17:40:20
856
原创 android 应用内音乐播放器
2.通知栏显示并要能进行播控。使用Notification+RemoteViews实现通知栏显示UI并通过RemoteView可以发送广播特性来实现跟Service播放通讯。2.通过bindService绑定播放,退出时Service也会退出,所以还要结合startService一起使用,在resume中startService即可进行后台播放。3.全局悬浮窗播控,使用WindownManager.addView()显示,由于上一步通知栏是通过广播与播放器进行通讯,这里也统一使用相同的广播进行通讯即可。
2023-09-04 12:00:10
208
原创 android 简单实现相册按日期分类排序
android 应用开发中经常遇到要将文件图片等数据列表按日期分类排序的需求,这里提供一个demo。10行代码就可以实现数据的分类和排序。这里提供Adapter的样例代码,其他的简单就不赘述了。1.列表数据按日期分类,同一天数据归类到一个item中。3.RecycleView嵌套RecycleView。4.支持多选,全选、取消全选。2.列表数据按日期倒序排列。
2023-06-27 17:17:28
1443
5
原创 android 客户端tcp工具类
android 客户端tcp工具类,该工具类采用单例模式实现,包含消息长度大小端计算、定时发送心跳包、断线重连、消息发送、消息接收。
2023-06-17 11:16:35
752
原创 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
1860
原创 Eclipse项目导入AndroidStudio开发直接调用系统级别API,不用反射
在android ROM开发过程中,由与源码应用目录结构都是Eclipse,开发的时候普通编辑器没有代码补全和自动导入、提示等,代码敲起来效率很低,而且现在都是用AS开发,所以有时需要将系统源码环境中的项目导入AS开发。但AS只能调用普通应用层的接口,导入的系统层的接口编译不过,除非都改成反射调用,但这样既改变了源码做法又耗性能,不划算。3.将.ide/modules/xxx/xxx.iml项目对应.iml编译文件中添加编译依赖class.jar。不过调用系统接口的地方依然会显示红色提示,不影响。
2023-04-01 18:03:46
326
原创 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
576
原创 Android7.0高级设置修改一级菜单分类和显示顺序并跳转第三方应用
除了修改一级菜单位置和名称等,有时还需要定制跳转的第三方应用,比如恢复出厂和系统升级菜单,想跳转到客户提供的apk,可在SettingsActivity中,switchToFragment方法中通过拦截原生跳转,重定位到定制apk中。”菜单都是调整HDMI视频显示相关的设置,但“显示”菜单在“设备”分类下,“高级设置”菜单在“系统”分类下,且相隔较远,操作起来不太方便。现在想把“高级设置”菜单移动到“设备”分类下,并且位于“显示”菜单之后,该如何处理呢?中和对应的fragment数组。
2023-03-28 14:50:08
933
原创 Android 开机自动加载新wifi模块驱动
在android ROM 开发中经常会遇到产品更换wifi模块的情况,一般常见的wifi驱动android内核中自带都有,无需过多调试,要是碰上内核中没有的就需要根据厂商提供的驱动进行移植。在成功编译出驱动ko文件后,手动insmod 加载驱动是可以的,但是开机时不会自动加载,这时可按以下步骤进行调整,让设备开机自动加载新模块的驱动。1.libhardware_legacy会遍历所有的usb设备名称,与devices[]中的wifi模块名称进行对比,有匹配到的话,就会记住该名称的索引位置。
2022-09-21 18:34:23
4920
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
1733
2
原创 如何彻底强制杀死后台无关进程?
在一些低端机型或小内存的ROM中,经常会出现内存不足的情况,除了优化自身程序外,往往需要通过杀死清空一些无关的后台进程来节省内存。这里提供一种非常规方法,通过禁用该包名来实现,不过需要注意的是,禁用包名后,对应程序进程会被清空,而且无法再启动,应用列表也找不到它,这就需要重新恢复该包名的可用性,这时它是不会自启的。比如am.forceStopPackage(),或者"adbshellkillall-9com.xxx.xxx".都是杀掉后一会又会自启。...
2022-07-21 09:24:36
2625
1
转载 Android 开机时间优化
要优化开机时间,先要了解开机流程: 开机的具体流程分析,后续会有专门文章说明。这里不再详述说。从上图可以看出。开机启动主要分为了 uboot 启动 kernel 启动 然后是system启动。uboot的启动时间几乎很短,优化的难度大且危险性较高。不建议进行优化。下面将列出印度项目优化的过程:关闭 kernel打印此过程大概能提升8s-10s的时间。设置方法比较多。可以uboot环......
2022-07-09 15:37:54
3168
原创 Android 实现动态切换Theme style 中的Splash(app 启动时背景图)
一般情况下,开发APP时为避免启动闪黑白屏的情况,我们会在AndroidManifest.xml中或者节点设置android:theme属性,并将背景设为透明@color/transparent这样就可避免启动闪黑白屏,但这种处理方式有一个弊端就是会让人产生启动比较慢的感觉,体验不太好。所以很多时候我们会将android:windowBackground设置一张启动图片,比如splash.png,这样就会无缝衔接启动,...
2022-07-08 14:00:36
4718
2
超级好用的串口调试工具
2023-09-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人