Android

分类下相关文章

Android SQLDelight (六) 查看 Android Room 创建的 SQLite 数据库建表语句

为了将一个 Android App 由 Room 迁移到 SQLDelight 方案,首先需要了解既有 app 的表结构。 使用 Android Studio 自带的 App Inspection 将 Room 创建的 SQLite 数据库导出为 db 文件, 如 item_database.db。 打开 db 文件 使用 sqlite3 命令连上数据库文件,查看具体表的建表语句 sqlite3 item_database.db 注意是 sqlite3,而不是 sqlite. 否则会报错: > sqlite item_database.db Unable to open databa ...

阅读全文...

Android Studio 解决 Gradle 编译失败 Unsupported class file major version 61

今天在编译一个 2021 年写的一个 Jetpack Compose 应用时,报错: Unsupported class file major version 61 Android Studio 版本 Android Studio Flamingo 2022.2.1 Patch 1 报错原因 新版本的 AS 默认使用的是 Java 17 LTS,而这个历史项目的 Gradle 版本很低,不支持高版本的 Java。 具体原因是: Java 17 (major version 61) 编译的 class 文件,如果在 Java 16 及以下环境下运行,就会报错 Unsupported cla ...

阅读全文...

jetpack compose,xml layout 与 flutter 的选型问题

这个周末无论是去公司团结的路上,还是一家去永旺吃饭的间隙,我都在纠结这个事情。也是用这些零碎的时间片段在手机上整理了这篇笔记。 纠结的原因 计划将一个一年前用 jetpack compose 写的练手 android app 重构一下。没想到在没有任何推广,维护的情况下,积累了一些用户。 重构的原因是,有一些用户反馈的需求,我想实现一下。但是使用的 jetpack compose 版本太旧了,毕竟 compose 还处于飞速发展解决,一年一个新样子,甚至今年都成了 android studio 的默认模板。今年用新版本的 as 编译,一堆错误,甚至提示 kotlin 的版本都过低。导致没法继续 ...

阅读全文...

新版本 Android Studio settings.gradle 中切换国内源

从 Android Studio Dolphin 2021.3.1 之后,国内源的切换配置就从 build.gradle 文件改到了 settings.gradle 文件。 修改之后,执行一下 Sync 就可以了。 但是如果遇到国内源没有的依赖,就需要取消前面的几个 google maven 源的注释。因为依赖是按照配置源的顺序来查找的,会优先从排在前面的源去下载。 具体配置 2025-03-20 验证通过,下载很快 pluginManagement { repositories { // 注释默认仓库以加速构建 // google() ...

阅读全文...

Android Studio flamingo 使用 jetpack compose 模板新建项目

今天将 Android Studio 升级到了最新版本 Android Studio Flamingo 2022.2.1 Patch 1。 但是新建项目的时候发现找不到 Jetpack Compose 的模板选项了,印象中之前版本是明确标注了哪些模板是基于 Compose 的。 后来在 Android Studio 的官方更新说明里找到了: https://developer.android.com/studio/releases?hl=zh-cn#updates-to-npw-nmw Android Studio Flamingo Canary 6 添加了用于创建项目或模块的新模板。默认情 ...

阅读全文...

android 系统上关联文件类型与编辑器,用 kotlin 自动实现

起因是,我想保存一个 golang 代码源文件到 Android 手机上,方便在等车的时候继续阅读代码。但是我发现 Android 系统上居然没有一个类似纯文本编辑器的 app,小米系统内置的阅读器排版混乱,且无法编辑,默认诱导去下载 WPS。所以我想实现一个简单的纯文本编辑器,方便打开各类源码文件。 以下是 ChatGPT 给出的提示,暂未测试,存档一下。 文件类型与编辑器关联 在 Kotlin 中,可以使用以下代码来关联文件类型和编辑器: val mimeType = "application/pdf" //要关联的文件类型 val packageName = &quo ...

阅读全文...

Android Studio 最新版 Logcat 中过滤日志

在调试 android 音频 app 过程中,发现日志疯狂刷新,完全看不到有用的日志信息。而最新的 logcat 没有过滤日志级别的界面选项,查了一下原来需要手动敲规则,这也太激进了。。。 按照日志级别过滤 例如分别按照 error / warn 来过滤日志: package:mine level:error package:mine level:warn mine 代表当前调试的 app。 实际上可以按照 package, tag, level 这三个来过滤。 Logcat 中 A 代表什么 W:warn, E:error。 Valid levels are: VERBOSE, DE ...

阅读全文...

Android Service 与 Activity / Fragment 的几种通信方式

由于要实现切换到 Android 系统桌面时,蓝牙对讲功能依然可以使用,所以把主要的语音通信逻辑都放到了前台服务中,即 Foreground Service 中。但是,需要在打开对应的 Activity / Fragment 时,可以同步 Service 中的状态,及语音波形显示。这时就需要一种方式,能及时将 Service 中的变量状态发生变化时,及时通知 Activity / Fragment。 查了几种方案,最终选择了 LiveData。 LocalBroadcastManager 即,单个应用内部的广播。 LocalBroadcastManager.sendBroadcast 方法会将 ...

阅读全文...

华为鸿蒙系统与 Android 的版本对应关系

在开发一个运行在华为平板上的蓝牙对讲 APP,最初没有测试平板设备之前,我是基于小米 Android 12 的手机测试的。 华为平板到手之后,被其系统版本号搞蒙了。。。 系统设置里,显示的是 HarmonyOS 版本,版本号是 2.0.0。 网上查了一下,这个版本号实用了多年。。。 点击升级,可以看到还有更小的版本号: 升级前的版本:2.0.0.260 升级后的版本:2.0.0.275 为了确定兼容性,我想了解一下鸿蒙系统与 Android 版本的对应关系。 鸿蒙与 Android 的关系 网上说,Harmony OS 2.0 基于 Andriod 开源项目 (AOSP, Android ...

阅读全文...

Android Studio 中使用 VIM 编辑模式 - IdeaVim 插件

在 Android Studio 里写代码非常的不适应,还是想能用上 VIM 的快捷键。 发现有一个非常成熟的 VIM 插件 IdeaVim: https://github.com/JetBrains/ideavim 不但 Android Studio 中可以使用,在 Idea 系列 IDE 中都可以使用。 安装 File - Settings - Plugins 搜索 IdeaVim 配置 安装插件后,重启 Android Studio 会看到右下角多了个 VIM 的图标。 点开可以: 启用/禁用 IdeaVim 插件 编辑配置文件 ideavimrc 配置默认快捷键 go to de ...

阅读全文...

Android SharedPreferences 存储 key / value 数据

Android App 中想实现保存默认的蓝牙设备 Mac 地址,本质上就是一个 key / value 键值对的存储及读取过程。 可以使用 SharedPreferences 来实现。 SharedPreferences 指向了一个存储键值对的 XML 文件,并提供了读写接口。 共享级别 activity 级:getPreferences(), 即单个 activity 内共享的存储 app 级:即全局共享。getSharedPreferences(), 但是这个要加上两个参数,第一个是文件名,第二个是模式,用 MODE_PRIVATE 即可(本app内可见) app 级:还有一个是 ge ...

阅读全文...

Android Service & Foreground Service

在调试一段 Android 蓝牙连接的代码时,不太明白为何建立蓝牙连接在 Foreground Service 中执行。 Service 与 Activity 的区别 Service 没有 UI 界面,类似一个后台服务 Activity 需要关联一个 UI 界面 Activity is a GUI and service is non-gui thread which can run in the background. service 可以在后台运行,适合执行耗时操作。 A Service is an application component that can perform l ...

阅读全文...

Android 前台服务配置问题导致蓝牙对讲功能异常

基于 STM32 WB 蓝牙模块的开源 SDK 实现蓝牙对讲功能时,总是无法建立连接。 而使用官方 APP ST BLE Sensor 或者我自己不用 SDK 实现的 App 都可以正常建立连接。 最终发现是前台服务,及 Android 12 的兼容性问题引起的。做了下修改就可以正常运行了。 连接异常 我的状态异常: Lost connection with the node BVL-WB1 而官方 APP 是在正常连接中显示: 连接到 对应的翻译文件: <string name="progressDialogConnTitle">Connecting. ...

阅读全文...

Android 子目录引起的 Cannot resolve symbol 'R'

今天在 Ctrl C / Ctrl V 代码时,发现一个再常见不过的 Resouce 引用代码报错。 出错代码: inflate(getContext(), R.layout.view_connection_status, this); 错误信息: Cannot resolve symbol 'R' R 还需要引入么? 测试了一下,发现确实,如果是在 sub package 中使用 R,需要 import root package 的 R。 package com.sunzhongwei.someapp.newpackage; import com.sunzhongwei.someap ...

阅读全文...

Android 12 扫描蓝牙设备 Need android.permission.BLUETOOTH_SCAN permission

报错信息 在 Android 12 系统上真机执行 BLE 蓝牙设备扫描时,APP 直接崩溃,Logcat 中报错: java.lang.SecurityException: Need android.permission.BLUETOOTH_SCAN permission for android.content.AttributionSource@9e60bb10: GattService registerScanner ... at com.st.BlueSTSDK.Manager.startBleScan_post21(Manager.java:283) at com.st.BlueS ...

阅读全文...