分类下相关文章
2023-08-09 · 阅读 3814 · 字数 289
今天在编译一个 github 上的 Android 项目时,报错 The project is using an incompatible version (AGP 8.1.0) of the Android Gradle plugin. Latest supported version is AGP 8.0.1 AGP 是什么 Android Gradle Plugin。 AGP(Android Gradle Plugin)是一个用于构建 Android 应用程序的 Gradle 插件。AGP 可以将 Android 项目中的源代码、资源和依赖项编译成可安装的 APK 文件,并提供了许多 ...
2023-08-07 · 阅读 1293 · 字数 620
需求背景 Android App 收到蓝牙推送的消息之后,播放提示音,且一直播放,直到收到停止的指令。 TODO [X] fragment 界面上增加两个按钮:开始,停止。方便测试 [X] 提取出播放和停止功能,封装成两个函数。便于测试 [X] 接收到停止指令后,关闭音频 [X] Foreground Service 中定义 LiveData,方便 fragment 点击按钮后操作。实际不需要,直接在 service 中定义成静态方法即可。 [X] 下载报警提示音 [X] 支持自定义音频文件。这个以后播放引导提示音频也能用到,只不过是只用一次 [X] 测试无误后,去掉开始按钮(隐藏),只保留 ...
2023-07-25 · 阅读 991 · 字数 387
在开发的一个 Android App 在台电平板上出现了诡异的现象,无法手势上滑关闭。 其他 app 都没有这个问题,均可以成功关闭,只有我开发这个 app 有这个现象。。。 我一开始以为是我每秒一次的循环任务,在进入后台时也在执行导致了 app 无法杀掉,所以把这个循环操作注释掉,再次测试还是无法杀掉。这就诡异了。。。 这个说不通啊,要是这样就能防止 app 被杀掉,那国内各大厂商的 app 还不纷纷这样搞,但现实是没有那个 app 是不能杀掉的,只有本 android 高手开发的 app 会这样。。。 早上无意发现 app 概览页有个小锁标识: 变成 lock 状态时,无法杀掉 变成 u ...
2023-07-21 · 阅读 1500 · 字数 810
需求 由于 Android 平板控制硬件设备,控制界面要展示的数据太多,一屏装不下。 所以需要新增一个界面,用于展示次要的信息。 交互方式是,在首屏,通过手势滑动,切换到次屏。 找到一个官方的组件 ViewPager2,看上去非常合适。 官方文档只说明了在 Activity 中使用 ViewPager2 的方式,并没有提及是否可以在 Fragment 中使用。 所以需要测试一下。 最终实现效果 ViewPager2 ViewPager2 是 Android Jetpack 中的一个库,它提供了一种以滑动方式浏览多个页面的方式。支持垂直和水平方向的滑动,并且具有更好的性能和更灵活的 API。 ...
2023-07-19 · 阅读 1099 · 字数 352
界面功能 界面功能是禁忌症确认,只有不存在任何一项的时候,才能进入使用。 每一项是一个 Switch 按钮,代表是否勾选。 记录目的 感觉我对 LiveData 的理解还是不够充分。也许经历越多的实战,才能理解更多吧。 修改其中一个 item 的 field class ViewHolder(private val binding: ConfirmRowItemBinding) : RecyclerView.ViewHolder(binding.root) { fun bind(item: ConfirmationItem) { binding.name.text = item.ti ...
2023-08-05 · 阅读 1206 · 字数 1437
要给 Android 平板蓝牙语音对讲 APP 上增加一个报警推送功能,即监听蓝牙控制板上的一个信号,来显示报警信息。实际上就是监听一个自定义的特性即可。 STM32 芯片的 Android SDK 封装的太猛了,捋一遍代码脑子爆炸。 所以记录一下看 SDK 源码的过程。 特性扫描 BlueSTSDK/BlueSTSDK/src/main/java/com/st/BlueSTSDK/Node.java 增加了调试日志,方便查看新增特性的 UUID mCharFeatureMap.clear(); for(BluetoothGattService service : nodeServices){ ...
2023-07-07 · 阅读 2218 · 字数 381
继续 Android 平板 App 控制设备运行的项目。 MTU 是什么 英文全称是,Maximum Transmission Unit。即一次最大可以传输多少字节。 默认情况下是 20 个字节。即,Android App 一次只能从蓝牙控制板那里最多读取 20 个字节的数据。微信小程序中也是同样的状况。 什么情况下需要调大 MTU 例如,一个设备的运行参数多达 50 个,每个运行参数用两个字节表示。 那么即便不使用 CRC 校验码,不使用协议头,要完整读取所有参数都需要 100 个字节。 即需要 5 个 20 字节的数据包才能读完。这样效率太低。 另外一个典型的场景就是 BLE 蓝牙语音对讲 ...
2023-07-07 · 阅读 2089 · 字数 990
没想到这个月的开发工作全部是 Android 平板相关,而且都要用到 BLE 蓝牙,一个是控制设备运行,一个是蓝牙对讲。 看来之前练手写的那个 Android BLE 调试工具真是派上用场了,大部分代码可以复用上。 需求 用 Android 平板通过 BLE 低功耗蓝牙控制硬件设备,例如,开始、暂停、显示运行状态等。 功能非常简单,时间就两个 fragment 界面就能搞定: 蓝牙设备列表页 (List Fragment)。用于显示扫描出来的附件蓝牙设备 具体设备的控制界面 (Home Fragment)。用于显示实时运行数据,及控件按钮 交互逻辑 打开 Android 平板 App 时, ...
2023-06-16 · 阅读 1129 · 字数 936
睡前看了一眼 Google Play Console 里的 App 新版本发布情况,无意发现一条一小时前的应用评论。 是个韩国用户留的: 버그가 넘 심해요 ㅜㅜ 어플들어가면 자꾸 팅김요 ㅜㅜ 빠른시간에 수정부탁드립니다.유용하게 잘쓰고있는데 ㅜㅜ 翻译成中文是: 这个应用程序的错误太多了,每次进入都会崩溃。希望能尽快修复。我一直都在好好地使用它,但现在无法正常使用了。 上面这段翻译是用 Sage AI 翻译的,因为 Google 的翻译有问题,就是下面截图里的一小段英文(too bad),翻译成中文也是。 意外的是,在程序崩溃的情况下,用户依然给了五分好评。。。被暖到了 我 ...
2023-06-14 · 阅读 2787 · 字数 864
昨天晚上 11 点终于将之前的 jetpack compose 版没有 admob 广告的 android app 完美加上了大家喜欢且期待已久的广告功能。 但是今天早上收到了 Google Play 审核未通过的邮件,大致意思就是 app 不符合数据安全政策。 问题详情 Issue details We found an issue in the following area(s): SPLIT_BUNDLE 6: Policy Declaration - Data Safety Section: Device Or Other IDs Data Type - Device Or ...
2023-06-13 · 阅读 3153 · 字数 141
Welcome to the Shelf Life app for Android! This is an Android app developed by Zhongwei Sun. The app is available on Google Play. As an avid Android user myself, I take privacy very seriously. I know how irritating it is when apps collect your data without your knowledge. I hereby state, to the best ...
2023-06-12 · 阅读 1328 · 字数 152
例如想使用 Android Material Design 3 主题中定义好的颜色,来着重显示过期状态。这样就能兼顾日间模式和夜间模式了,不需要手动判断。 themes.xml <resources> <style name="Theme.ShelfLife2" parent="Theme.Material3.Light.NoActionBar"> <item name="colorPrimary">@color/md_theme_light_primary</item ...
2023-06-11 · 阅读 1348 · 字数 760
在基于 Android XML View 重写 Jetpack Compose 版保质期管理 app 时, 用 SQLDelight 替代了 Room 来做 SQLite 数据库管理。 但是在实现过期时间排序功能时,引入了一个 bug。 原来的数据库中的过期时间字段有两种值,NULL 或者时间对应的秒数。 现在又引入了零值。导致排序混乱。 正确的排序效果 在保质期管理 app 中,已过期的物品,或者快过期的应该排列在前面,而不会过期的应该排在后面,如图所示: 零值是否合理 例如录入一个物品时,可以不填写过期时间,那么数据库中应该存储 null 还是 0。 这里确实应该存储 NULL,而不是 ...
2023-06-05 · 阅读 1795 · 字数 1247
本以为我的 Android 开发技术已经天下无敌了😅,没想到连 Flow / Channel 我都第一次见。。。不得不说 Android 的新概念层出不穷。 周末看了一堆文档,有了一个大概的了解。我发现微信公众号的文章质量还真是高,不少高手都做了详细的对比说明。 但是最终我一个也没有关注,从这些人的近期推文看都堕落了,不是贩卖焦炉,就是无脑卖其他骗子的课。扯远了,开始正题。 Flow 为何而生 一个挂起函数 (suspending function) 可以异步地返回一个值,但是没法多次返回。于是 Flow 就诞生了。 这也是为什么 Flow 获取 select 结果不需要加上 suspend ...
2023-06-02 · 阅读 2066 · 字数 577
例如,我想在 Android APP 首页顶部显示搜索按钮,在详情页顶部显示删除按钮。 叫 Menu 还是 Top App Bar 搜素 Android Menu https://developer.android.com/develop/ui/views/components/menus 在官方文档里可以看到: XML View 中称之为 Menu Jetpack Compose 中称之为 Top App Bar Activity 中添加还是 Fragment 中添加 You can declare items for the options menu from either you ...
生活 | 跑步 清单 足球 鲁班 探索 孤独的美食家 驾驶 电视剧 收纳 奶爸 健康 game 电影 周末 joke |
---|---|
Geek | 健身 Laravel Git Vim MySQL Linux UI Windows SVN 纪录片 管理 Shell 游记 工具 手机 BackboneJS 自建博客 Mac DNS Tornado CDN Django Python AngularJS 理财 前端 Nginx 爬虫 Redis Javascript Browser 浏览器 推广 OAuth CSS PHP Social Networks 安全 运维 创业 杂记 VueJS Android Image IDE Java ReactJS 数据分析 SQLite RESTful 读书笔记 家电 ecshop Vagrant wordpress docker SEO GTD magento mongodb nodejs weex 冷知识 ruby iOS 微信小程序 AI CMS 快应用 backpack 广告联盟 OA 短信 UWP Win CSharp Tampermonkey graphviz 钉钉 WPS 数据字典 微信公众号 Fuchsia Adobe XD SQL Server thinkphp 代码规范 商业模式 Flutter 头痛的问题 serverless 视频制作 国际化 golang 服务器 Kotlin 网站建设 5G 笔记本 图片 spark spring 物联网 InfluxDB 图像识别 postgre rust |
成长的烦恼 | 闲言碎语 待产 不睡觉 写作 程序员 孙心然语录 原则 大鸿语录 |
地球 | 植物 时间 中文 赚钱 国家地理 烟台 一生伏首拜阳明 emoji 弟子规 英文 国际贸易 |