- 博客(63)
- 资源 (2)
- 收藏
- 关注
原创 Room简单实操
默认情况下,Room 将类名称用作数据库表名称。如果希望表具有不同的名称,请设置@Entity注解的tableName属性。Room 默认使用字段名称作为数据库中的列名称。如果您希望列具有不同的名称,请将注解添加到该字段并设置name属性。SQLite 中的表和列名称不区分大小写。在 Room 数据库中,主键通常定义为长整型(long)是因为长整型提供了更大的范围,可以容纳更多的唯一标识符。唯一标识符范围。
2024-05-05 14:03:35 1253
原创 Android版本依赖Version catalog
曾经我们使用缺点:在project的module中引用无任何提示,无法跳转到指定引用。
2024-05-04 12:23:13 1582 1
原创 Android密钥库(AndroidKeyStore)使用
Android 提供了特定于 Android 平台的 KeyStore 实现,称为 AndroidKeyStore,它提供了更高级的安全功能,如硬件支持、密钥链随机生成等。提示:正常我们需要对加密的数据进行本地存储,上述加密数据是ByteArray,字节数组不太适合本地存储,因此我们可以通过Base64将ByteArray数据转换为字符串进行保存,取出数据之时再做Base64解码。:可以使用 KeyStore 来存储和管理双因素身份验证所需的密钥和证书,用于提高身份验证的安全性。它接受一个字符串参数。
2024-03-27 00:24:35 6385 5
原创 buildConfigField失败:defaultConfig contains custom BuildConfig fields, but the feature is disabled.
Android开发中,在当前module的build.gradle构建buildConfigField字段报错:defaultConfig contains custom BuildConfig fields, but the feature is disabled.
2023-04-27 11:18:51 4312 1
原创 Android请求应用权限
在应用的清单文件中,声明应用可能需要请求的权限。如需声明应用可能请求的权限,请在应用的清单文件中添加相应的 元素。例如,如果应用需要访问相机,则应在 AndroidManifest.xml 中添加以下代码行:设计应用的用户体验,使应用中的特定操作与特定运行时权限相关联。告知用户哪些操作可能会要求他们向您的应用授予访问其私人数据的权限。等待用户调用应用中需要访问特定用户私人数据的任务或操作。届时,您的应用可以请求访问相应数据所需的运行时权限。检查用户是否已授予应用所需的运行时权限。如果已授权,那么您的
2022-12-05 00:11:28 3244
原创 跑通Kaldi中的例子LibriSpeech
LibriSpeech应该是Kaldi中最完善的一个例子,不同于最开始跑的简单的yesno这个例子。
2022-08-12 17:35:57 1473 3
原创 Kaldi安装(Linux环境)
随着如今的语音被越来越多的应用,尝试着研究下Kaldi,一个开源的语音识别项目。Kaldi官网,包含Kaldi的安装和各种内容的讲解Kaldi的github仓库地址,Kaldi的源码就是存储在github推荐如下这本书,可以辅助理解Kaldi,并且有安装步骤最简单的执行步骤就是如此,kaldi提供了完整的脚本使用,方便了我们的安装,nice。https。...............
2022-08-02 14:44:22 2694
原创 Android字母索引栏(Kotlin版本)
接上一篇Android字母索引侧边栏(java版本),完成Kotlin版本的实现,并且解决java版本中的一些问题(具体使用可以参考对比当前这篇Kotlin的代码)。平常开发中遇到需要开发联系人的应用,这个字母侧边栏还是挺常用的,因为以前是java实现的代码,现在刚好改成Kotlin的版本,在使用中也发现一些以前的代码的问题,刚好也在kotlin代码中做一个修正。还有未完成的问题:这两个效果等有时间我可以考虑继续实现,后续补充代码参考效果:动态的效果可以参考上一篇文章,效果类似1、正常的自定义View的几
2022-07-12 12:11:40 778
原创 MediaPipe手势(Hands)
1、Ubuntu上安装MediaPipe2、Ubuntu上构建Android的MediaPipe3、Ubuntu上构建MediaPipe Android Archive (AAR)最近刚好有手势识别的需求,所以就看到了MediaPipe的Hands,识别出各个手势的节点坐标,然后简单的计算手势。这一篇主要是对上一篇编译aar库的补充,因为正式使用上我们自己编译的hands aar库。命令如下:2.MediaPipe的Hands例子打开Android studio,导入Android MediaPip
2022-06-14 18:11:12 2207 2
原创 Ubuntu上构建MediaPipe Android Archive (AAR)
MediaPipe 为直播和流媒体提供开源跨平台、可定制的 ML(机器学习) 解决方案。本文是接我上两篇文章:1、Ubuntu上安装MediaPipe2、Ubuntu上构建Android的MediaPipe官方的解释:大体意思就是:在 MediaPipe 目录中,在 BUILD 文件中创建一个新的 mediapipe_aar() 目标。您需要弄清楚图中使用了哪些计算器,并将计算器依赖项提供给 mediapipe_aar()。官方的描述还是挺官方,我们以人脸检测为例子,演示这个过程。步骤:然后使用你擅长
2022-06-13 17:36:16 1415 2
原创 Ubuntu上构建Android的MediaPipe
MediaPipe 为直播和流媒体提供开源跨平台、可定制的 ML(机器学习) 解决方案。MediaPipe的安装可以看我上一篇文章:Ubuntu上安装MediaPipeMediaPipe是使用Bazel进行构建的,因此需要按照官网MediaPipe安装步骤或者我提供的MediaPipe安装步骤将MediaPipe安装到你的电脑上安装命令如下,不配置JAVA_HOME环境也是可以的3、配置Android SDK的版本,至少为30.0.04、配置Android NDK的版本,在18和21之间(包含18和2
2022-06-10 14:11:27 1782 4
原创 三维向量的夹角
项目场景:日常开发中问题记录三维向量的夹角参考:[三维向量夹角在线计算](https://www.23bei.com/tool/300.html)公式:三维向量夹角的计算公式如下:假设两个三维向量分别为:a=(x1,y1,z1),b=(x2,y2,z2)。向量a的模:|a|=√(x12+y12+z1^2)。向量b的模:|b|=√(x22+y22+z2^2)。两个向量的点乘:a·b=(x1x2+y1y2+z1z2)。设两个向量的夹角为θ,则有:cosθ=(x1x2+y1y2+z1z
2022-05-27 17:16:23 20629 2
原创 Android的RecyclerView.ItemDecoration使用
文章目录前言一、RecyclerView.ItemDecoration是什么?二、使用步骤1.引入库2.设置装饰器2.1 在Activity或者Fragment中设置装饰器2.2 实现MaintenanceItemDecoration,继承于RecyclerView.ItemDecoration()1、实现getItemOffsets方法,代码如下2、给底部留白部分加上节点,实现onDraw方法3、MaintenanceItemDecoration完整代码3.完成最终版带进度更新的装饰器3.1 设置装饰器3
2022-05-14 17:54:15 2654 1
原创 The application could not be installed: INSTALL_FAILED_TEST_ONLY解决方案
项目场景:调试应用,安装apk失败Installation did not succeed.The application could not be installed: INSTALL_FAILED_TEST_ONLYList of apks:[0] 'D:\develop\work\StarEra\arguesture\app\build\intermediates\apk\debug\Gesture-2022-05-05-debug.apk'Installation failed due
2022-05-05 16:31:58 10725 1
原创 Jetpack Room基本用法
文章目录前言一、Room是什么?主要组件二、使用步骤1.引入库2.定义数据实体2.1 定义主键2.2 忽略字段2.3 完整代码如下(示例):3.使用 Room DAO 访问数据3.1 插入3.2 更新总结文章参考前言日常开发中,总会遇到需要将数据持久化在本地,供需要的时候使用。本地数据持久化例如:文件保存、SharedPreferences(DataStore,sp的替代者)、数据库等等。简单的键值对信息我们直接使用SP保存在xml中就可以了,但是更加复杂的信息就需要数据库(SQLite)上场了。
2022-05-03 22:42:48 2113
原创 Android gradle配置签名文件
项目场景:使用命令行生成apk的时候自动签名打包命令Linux# 同时生成release和debug的apk./gradlew clean build./gradlew clean assemble# 分别打包release和debug的apk./gradlew clean assembleDebug./gradlew clean assembleReleaseWindows# 同时生成release和debug的apkgradlew.bat clean buildgradle
2022-04-27 22:35:26 5107
原创 Android gradle配置生成的apk名称和存放位置
项目场景:配置apk生成之后的名称,并且重新修改apk生成路径解决方案:提示:1、gradle中修改apk生成名称2、将构建的apk拷贝到新的文件路径中定义生成apk名称和当前时间// 定义应用名称def appName = "Example"static def packageTime() { return new SimpleDateFormat("yyyy-MM-dd").format(new Date())}修改apk名称:格式Example-2022-04-
2022-04-26 23:50:20 5309
原创 Android ContentProvider使用
ContentProvider前言一、ContentProvider是什么?二、使用步骤1.访问方式2.创建ContentProvider2.1. 构建ContentProvider步骤2.2. Uri讲解3.查询4.插入5.修改6.删除总结前言我们需要了解ContentProvider最好的方式就是查看Android官方文档:ContentProvider基础知识.通常ContentProvider有两种使用场景一种是通过实现代码访问其他应用中的现有内容提供程序;另一种是在应用中创建新的内
2022-04-23 21:40:17 7746 2
原创 Android中使用Protocol Buffers
Protocol BuffersProtocol BuffersAndroid studio中配置Protocol Buffers1. 在Project的build.gradle中配置2. 在app module或者其他module中配置2.1. 首先引入插件2.2. 在android{}中配置2.3. 引入Protocol Buffers的库Protocol Buffers使用Protocol Buffers就懒得介绍了,直接使用官网的介绍协议缓冲区是Google的与语言无关,与平台无关,可扩展的
2021-03-31 14:59:11 516
原创 排序算法
冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。冒泡排序的时间复杂度(平均时间复杂度): O(n2),最好时间复杂度就是刚好有序的时候O(n),最坏时间复杂度就是刚好是反序O(n2)/** * 冒泡排序 * <p> * 1、冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,
2021-02-19 15:06:24 83
原创 Android字母索引侧边栏
字母索引侧边栏在日常的开发中,特别是IM联系人或者电话簿应用等等用处还是挺广泛。效果图:需要熟悉的内容1、根据需求,考虑需要暴露哪些自定义属性2、熟悉自定义View中文字的测量,绘制3、熟悉自定义View的测量思路:1、测量每个文字(字母)占用的高度,计算出View总的高度,测量文字的宽度,使用setMeasuredDimension将测量的宽高赋值2、根据需求绘制3、处理手指触摸事件实现代码:代码的注释写的应该还算清楚,可以根据自己的需求进行修改,我这里没有处理padding
2021-02-14 15:40:31 674 2
原创 自定义雷达图
原文:Android雷达图(蜘蛛网图)绘制其实雷达图理解起来还是很简单,就参考原文自己写了下,做个记录效果图:代码:public class RadarView extends View { private static final String TAG = "RadarView"; private static final int DEFAULT_SIZE = 300; private String[] dataTitles = {"A", "B", "C", "D",
2020-11-23 14:12:24 402
原创 自定义带进度条的播放暂停按钮
自定义View分为两种:1、实现View的自定义View1.1、实现onMeasure1.2、实现onDraw2、实现ViewGroup的自定义View(还可以直接实现系统已实现的控件,比如集成LinearLayout等等)2.1、实现onMeasure2.2、实现onDraw2.3、实现onLayout自定义组合控件: 把日常共用的一些布局组合成共用的控件,有点类似在xml中使用include标签我们实现的这个控件很简单,继承View来实现就行,先上效果再开始coding一、实现自定
2020-11-13 16:15:20 380
原创 组件化二、APT+JavaPoet配合搭建组件化架构
1、APT(注解处理器)介绍APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解主动生成代码,如果想要自定义注解处理器能够正常运行,必须要通过APT工具来进行处理。也可以这样理解,只有通过申明APT工具后,程序在编译期间自定义注解处理器才能执行通过来讲:根据规则,帮我们自动生成代码,生成类文件Google提供了APT的库(Java库),后面会介绍如何导入使用2、Element程序元素Package
2020-10-02 15:46:34 399
原创 组件化一、组件化结构搭建
gradle的配置可以看这篇文章组件化预热:gradle简单使用组件化的配置,我们还是通过build.gradle文件来配置一、config.gradle创建创建config.gradle文件,并且使用变量 isRelease = true来判断到底是将不同的Module单独打包测试,还是最终的发布版本(集成到一个apk)ext { // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式 // false: 组件化模式(子模块可以独立运行),tru
2020-09-21 01:06:13 228
原创 组件化预热:gradle简单使用
日常开发中,不管在APP的Module或者Library的Module中1、引入一些共用三方库2、共有的编译库,比如compileSdkVersion,都是各自为政,没有做一个统一的管理现在我们新建一个config.gradle文件来存储一些共有的部分。一、config.gradle的创建使用我们直接将我测试的config.gradle文件新建出来,如下代码,下面来慢慢解释// 添加多个自定义属性,可以添加在ext代码块ext { username = "zhangsan"
2020-09-21 00:20:38 254
原创 Handler、Looper、MessageQueue消息处理讲解
一、Handler的使用可以查看我这篇文章Handler的使用和内存泄漏处理二、源码分析Handler消息处理的流程我们要玩的东西也不是很难,我们通过源码来分析Handler如何发送消息到MessageQueue,然后Looper如何如何将消息从MessageQueue取出分发给Handler。(一)、创建主线程的MessageQueue和Looper对象首先查看应用的主线程ActivityThread的main方法public static void main(String[] args
2020-09-05 00:41:10 325
原创 慢学Android Jetpack
什么是jetpack,就“盗”Google官方的解释。 Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。 Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它可以提供向后兼容性,且比 Andro
2020-07-22 21:06:50 138
原创 日常学习算法总结
一、基本数据结构之数组自定义数组(类似ArrayList),数组必须存在在连续的地址空间,实现数组的增删操作。public class CustomArray { private int[] array; // 元素个数 private int size; private static final String TAG = "CustomArray"; public CustomArray(int capacity) { array = new
2020-07-01 23:23:41 185
原创 Android Studio搭建FFmpeg环境
搭建NDK工程的时候特别要注意踩坑,平时基本没玩过NDK的东西,第一次搭建FFmpeg的环境就被坑爹了不知道从Android studio哪个版本开始,创建native c++的项目“CMakeLists.txt”文件就被放在src/main/cpp文件夹下了,以前最早的工程这个文件是被放在app路径下的(跟build.gradle是同一级)。搭建FFmpeg的环境,需要在Linux环境下编译FFmpeg库一、FFmpeg最新的搭建将FFmpeg的lib库和头文件全部放在src/main/cpp.
2020-06-22 01:09:12 635
原创 SVG图使用(笔记)
开发中遇到画不规则的图像的时候,我们往往通过自定义View,然后自己在onDraw去绘制可能会很麻烦。这时候我们就可以使用SVG图,可以让UI将需要实现的效果设计好导出为SVG图。SVG图的特性svg可被非常多的工具读取和修改svg与JPEG和GIF比起来,尺寸更小,可压缩性更强svg是可伸缩的svg图可以在任何分辨率下被高质量的打印svg可在图像质量不下降的情况下被放大svg图像...
2019-11-15 00:22:00 400
原创 Android Material Design常规使用
一、Material Design主题android:style/Theme.Materialandroid:style/Theme.Materail.Lightandroid:style/Theme.Materail.Light.DarkActionBar二、Material Design兼容主题Theme.AppCompat.LightTheme.AppCompat.Light.D...
2019-11-07 00:00:08 324
原创 Android常用屏幕适配方式
屏幕适配原因:Android设备碎片化,导致APP的界面元素在不同的屏幕尺寸上显示不一致。目的:让布局,布局组件,资源,用户界面流程,匹配不同的屏幕尺寸。屏幕适配常见方式布局适配1、避免写死控件尺寸,使用match_parent,wrap_content。2、LinearLayout使用android:layout_weight=“1”,android:weightSum="4"等...
2019-10-30 00:47:37 573
原创 Android事件分发简单分析(源码分析)
想玩转自定义View,我们需要了解事件分发流程,知道具体的触摸事件怎么去处理、消费。事件定义:当用户触摸屏幕时,会产生触摸行为。一、常用的事件的类型(四种):MotionEvent.ACTION_DOWN 手指刚接触屏幕MotionEvent.ACTION_MOVE 手指在屏幕上滑动MotionEvent.ACTION_UP 手指从屏幕松开MotionEvent.ACTION_...
2019-10-23 00:53:53 192
原创 Android自定义View之Path基础(一)
Path类封装由直线段,二次曲线和三次曲线组成的复合(多个轮廓)几何路径。 可以使用canvas.drawPath(path,paint)进行填充或描边绘制(基于Paint的Style),也可以用于剪切或在路径上绘制文本。github上的示例...
2019-10-17 01:30:04 302
原创 Android自定义View之Canvas基础
画布:通过画笔绘制几何图形、文字、路径(Path),位图(Bitmap)等绘制内容我们需要准备:一个用于容纳像素的位图,一个用于承载绘制调用的Canvas(写入位图),一个绘制图元(例如Rect,Path,文本,位图),一个绘制( 描述图纸的颜色和样式)。Canvas常用的API大概分为:绘制、变换、状态保存和恢复。一、变换二、绘制图形绘制、文字绘制、路径绘制、位图绘制等...
2019-10-09 10:29:10 413
原创 Android自定义View之画笔(Paint)基础
官网的解释:Paint类保存有关如何绘制几何图形,文本和位图的样式和颜色信息。Paint常用的方法先将所有常用的方法列举出来,然后在一 一测试Paint的三个构造方法Paint()// Paint(int flags)Paint(Paint paint)常用的一些方法// 初始化画笔paint = new Paint();// 设置颜色paint.setColor(C...
2019-10-06 23:23:57 1169
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人