自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Silicon_Valley

红尘中缓步前行

  • 博客(61)
  • 资源 (2)
  • 收藏
  • 关注

原创 Android密钥库(AndroidKeyStore)使用

Android 提供了特定于 Android 平台的 KeyStore 实现,称为 AndroidKeyStore,它提供了更高级的安全功能,如硬件支持、密钥链随机生成等。提示:正常我们需要对加密的数据进行本地存储,上述加密数据是ByteArray,字节数组不太适合本地存储,因此我们可以通过Base64将ByteArray数据转换为字符串进行保存,取出数据之时再做Base64解码。:可以使用 KeyStore 来存储和管理双因素身份验证所需的密钥和证书,用于提高身份验证的安全性。它接受一个字符串参数。

2024-03-27 00:24:35 1230 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 2990 1

原创 Android请求应用权限

在应用的清单文件中,声明应用可能需要请求的权限。如需声明应用可能请求的权限,请在应用的清单文件中添加相应的 元素。例如,如果应用需要访问相机,则应在 AndroidManifest.xml 中添加以下代码行:设计应用的用户体验,使应用中的特定操作与特定运行时权限相关联。告知用户哪些操作可能会要求他们向您的应用授予访问其私人数据的权限。等待用户调用应用中需要访问特定用户私人数据的任务或操作。届时,您的应用可以请求访问相应数据所需的运行时权限。检查用户是否已授予应用所需的运行时权限。如果已授权,那么您的

2022-12-05 00:11:28 2908

原创 跑通Kaldi中的例子LibriSpeech

LibriSpeech应该是Kaldi中最完善的一个例子,不同于最开始跑的简单的yesno这个例子。

2022-08-12 17:35:57 1094 3

原创 Kaldi安装(Linux环境)

随着如今的语音被越来越多的应用,尝试着研究下Kaldi,一个开源的语音识别项目。Kaldi官网,包含Kaldi的安装和各种内容的讲解Kaldi的github仓库地址,Kaldi的源码就是存储在github推荐如下这本书,可以辅助理解Kaldi,并且有安装步骤最简单的执行步骤就是如此,kaldi提供了完整的脚本使用,方便了我们的安装,nice。https。...............

2022-08-02 14:44:22 2408

原创 Android字母索引栏(Kotlin版本)

接上一篇Android字母索引侧边栏(java版本),完成Kotlin版本的实现,并且解决java版本中的一些问题(具体使用可以参考对比当前这篇Kotlin的代码)。平常开发中遇到需要开发联系人的应用,这个字母侧边栏还是挺常用的,因为以前是java实现的代码,现在刚好改成Kotlin的版本,在使用中也发现一些以前的代码的问题,刚好也在kotlin代码中做一个修正。还有未完成的问题:这两个效果等有时间我可以考虑继续实现,后续补充代码参考效果:动态的效果可以参考上一篇文章,效果类似1、正常的自定义View的几

2022-07-12 12:11:40 682

原创 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 1865 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 1268 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 1608 4

原创 Ubuntu上安装MediaPipe

MediaPipe安装

2022-06-08 11:25:14 4177

原创 计算两点之间的距离(二维、三维)

计算两点之间的距离2D3D

2022-06-01 14:30:32 2318

原创 三维向量的夹角

项目场景:日常开发中问题记录三维向量的夹角参考:[三维向量夹角在线计算](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 18064 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 2392 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 10293 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 2058

原创 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 4616

原创 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 4777

原创 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 6394 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 448

原创 排序算法

冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。冒泡排序的时间复杂度(平均时间复杂度): O(n2),最好时间复杂度就是刚好有序的时候O(n),最坏时间复杂度就是刚好是反序O(n2)/** * 冒泡排序 * <p> * 1、冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,

2021-02-19 15:06:24 72

原创 Android字母索引侧边栏

字母索引侧边栏在日常的开发中,特别是IM联系人或者电话簿应用等等用处还是挺广泛。效果图:需要熟悉的内容1、根据需求,考虑需要暴露哪些自定义属性2、熟悉自定义View中文字的测量,绘制3、熟悉自定义View的测量思路:1、测量每个文字(字母)占用的高度,计算出View总的高度,测量文字的宽度,使用setMeasuredDimension将测量的宽高赋值2、根据需求绘制3、处理手指触摸事件实现代码:代码的注释写的应该还算清楚,可以根据自己的需求进行修改,我这里没有处理padding

2021-02-14 15:40:31 595 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 389

原创 自定义带进度条的播放暂停按钮

自定义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 345

原创 组件化二、APT+JavaPoet配合搭建组件化架构

1、APT(注解处理器)介绍APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解主动生成代码,如果想要自定义注解处理器能够正常运行,必须要通过APT工具来进行处理。也可以这样理解,只有通过申明APT工具后,程序在编译期间自定义注解处理器才能执行通过来讲:根据规则,帮我们自动生成代码,生成类文件Google提供了APT的库(Java库),后面会介绍如何导入使用2、Element程序元素Package

2020-10-02 15:46:34 371

原创 组件化一、组件化结构搭建

gradle的配置可以看这篇文章组件化预热:gradle简单使用组件化的配置,我们还是通过build.gradle文件来配置一、config.gradle创建创建config.gradle文件,并且使用变量 isRelease = true来判断到底是将不同的Module单独打包测试,还是最终的发布版本(集成到一个apk)ext { // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式 // false: 组件化模式(子模块可以独立运行),tru

2020-09-21 01:06:13 207

原创 组件化预热:gradle简单使用

日常开发中,不管在APP的Module或者Library的Module中1、引入一些共用三方库2、共有的编译库,比如compileSdkVersion,都是各自为政,没有做一个统一的管理现在我们新建一个config.gradle文件来存储一些共有的部分。一、config.gradle的创建使用我们直接将我测试的config.gradle文件新建出来,如下代码,下面来慢慢解释// 添加多个自定义属性,可以添加在ext代码块ext { username = "zhangsan"

2020-09-21 00:20:38 198

原创 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 303

原创 慢学Android Jetpack

什么是jetpack,就“盗”Google官方的解释。      Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。      Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它可以提供向后兼容性,且比 Andro

2020-07-22 21:06:50 122

原创 日常学习算法总结

一、基本数据结构之数组自定义数组(类似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 175

原创 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 575

原创 SVG图使用(笔记)

开发中遇到画不规则的图像的时候,我们往往通过自定义View,然后自己在onDraw去绘制可能会很麻烦。这时候我们就可以使用SVG图,可以让UI将需要实现的效果设计好导出为SVG图。SVG图的特性svg可被非常多的工具读取和修改svg与JPEG和GIF比起来,尺寸更小,可压缩性更强svg是可伸缩的svg图可以在任何分辨率下被高质量的打印svg可在图像质量不下降的情况下被放大svg图像...

2019-11-15 00:22:00 362

原创 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 311

原创 Android常用屏幕适配方式

屏幕适配原因:Android设备碎片化,导致APP的界面元素在不同的屏幕尺寸上显示不一致。目的:让布局,布局组件,资源,用户界面流程,匹配不同的屏幕尺寸。屏幕适配常见方式布局适配1、避免写死控件尺寸,使用match_parent,wrap_content。2、LinearLayout使用android:layout_weight=“1”,android:weightSum="4"等...

2019-10-30 00:47:37 534

原创 Android事件分发简单分析(源码分析)

想玩转自定义View,我们需要了解事件分发流程,知道具体的触摸事件怎么去处理、消费。事件定义:当用户触摸屏幕时,会产生触摸行为。一、常用的事件的类型(四种):MotionEvent.ACTION_DOWN 手指刚接触屏幕MotionEvent.ACTION_MOVE 手指在屏幕上滑动MotionEvent.ACTION_UP 手指从屏幕松开MotionEvent.ACTION_...

2019-10-23 00:53:53 177

原创 Path基础之PathMearsure详解

PathMeasure路径测量,用来测量path的工具类。

2019-10-20 19:59:48 494

原创 Android自定义View之Path基础(一)

Path类封装由直线段,二次曲线和三次曲线组成的复合(多个轮廓)几何路径。 可以使用canvas.drawPath(path,paint)进行填充或描边绘制(基于Paint的Style),也可以用于剪切或在路径上绘制文本。github上的示例...

2019-10-17 01:30:04 255

原创 Android自定义View之Canvas基础

画布:通过画笔绘制几何图形、文字、路径(Path),位图(Bitmap)等绘制内容我们需要准备:一个用于容纳像素的位图,一个用于承载绘制调用的Canvas(写入位图),一个绘制图元(例如Rect,Path,文本,位图),一个绘制( 描述图纸的颜色和样式)。Canvas常用的API大概分为:绘制、变换、状态保存和恢复。一、变换二、绘制图形绘制、文字绘制、路径绘制、位图绘制等...

2019-10-09 10:29:10 343

原创 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 1102

原创 Android中View绘制流程(源码)

日常开发中,我们经常碰到需要自定义View(包括自定义View和ViewGroup)的地方,并且在面试中也需要我们熟悉或者精通自定义View。毕竟有时候我们需要实现的效果,Android本身是没有提供的,就需要我们去自定义,掌握原理可以让我们在实际使用中更加得心应手。一、View是如何被添加到屏幕上的从Activity走起,我们日常是通过Activity的onCreate()方法中的 se...

2019-10-04 23:25:03 344

原创 Kotlin简单入门

开始学习Kotlin是因为Google将Kotlin作为Android开发的官网语言,现在市面也有一些公司面试的时候开始将Kotlin作为一个加分项,其实可以想想多学一点东西,多一点傍身的技巧,O(∩_∩)O哈哈~。Kotlin的基本数据类型Kotlin 中使用的基本类型:数字、字符、布尔值、数组与字符串。数字整型Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类...

2019-10-02 13:36:15 641

RecyclerView的List和Grid分隔线

RecyclerView分隔线,包括List和Grid形式的分隔线

2022-05-14

Android+Room+ContentProvider

1、Android Room操作SQLite数据 2、ContentProvider使用,使用Room进行数据库操作

2022-04-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除