![](https://img-blog.csdnimg.cn/20190721233552566.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Android学习总结
文章平均质量分 77
对平时开发学习的知识的总结,计划一直做一下去,就当给自己记录的一笔财富。
吃骨头不吐股骨头皮
在枯燥的學習過程中,需要給自己設定一個切實可行的目標
展开
-
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 · 3705 阅读 · 1 评论 -
Android请求应用权限
在应用的清单文件中,声明应用可能需要请求的权限。如需声明应用可能请求的权限,请在应用的清单文件中添加相应的 元素。例如,如果应用需要访问相机,则应在 AndroidManifest.xml 中添加以下代码行:设计应用的用户体验,使应用中的特定操作与特定运行时权限相关联。告知用户哪些操作可能会要求他们向您的应用授予访问其私人数据的权限。等待用户调用应用中需要访问特定用户私人数据的任务或操作。届时,您的应用可以请求访问相应数据所需的运行时权限。检查用户是否已授予应用所需的运行时权限。如果已授权,那么您的原创 2022-12-05 00:11:28 · 3105 阅读 · 0 评论 -
跑通Kaldi中的例子LibriSpeech
LibriSpeech应该是Kaldi中最完善的一个例子,不同于最开始跑的简单的yesno这个例子。原创 2022-08-12 17:35:57 · 1308 阅读 · 3 评论 -
Android字母索引栏(Kotlin版本)
接上一篇Android字母索引侧边栏(java版本),完成Kotlin版本的实现,并且解决java版本中的一些问题(具体使用可以参考对比当前这篇Kotlin的代码)。平常开发中遇到需要开发联系人的应用,这个字母侧边栏还是挺常用的,因为以前是java实现的代码,现在刚好改成Kotlin的版本,在使用中也发现一些以前的代码的问题,刚好也在kotlin代码中做一个修正。还有未完成的问题:这两个效果等有时间我可以考虑继续实现,后续补充代码参考效果:动态的效果可以参考上一篇文章,效果类似1、正常的自定义View的几原创 2022-07-12 12:11:40 · 729 阅读 · 0 评论 -
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 · 2040 阅读 · 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 · 1333 阅读 · 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 · 1689 阅读 · 4 评论 -
Ubuntu上安装MediaPipe
MediaPipe安装原创 2022-06-08 11:25:14 · 4681 阅读 · 0 评论 -
计算两点之间的距离(二维、三维)
计算两点之间的距离2D3D原创 2022-06-01 14:30:32 · 2564 阅读 · 0 评论 -
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 · 2498 阅读 · 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 · 10592 阅读 · 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 · 2078 阅读 · 0 评论 -
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 · 4881 阅读 · 0 评论 -
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 · 5094 阅读 · 0 评论 -
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 · 7093 阅读 · 2 评论 -
排序算法
冒泡排序冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。冒泡排序的时间复杂度(平均时间复杂度): O(n2),最好时间复杂度就是刚好有序的时候O(n),最坏时间复杂度就是刚好是反序O(n2)/** * 冒泡排序 * <p> * 1、冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,原创 2021-02-19 15:06:24 · 75 阅读 · 0 评论 -
Android字母索引侧边栏
字母索引侧边栏在日常的开发中,特别是IM联系人或者电话簿应用等等用处还是挺广泛。效果图:需要熟悉的内容1、根据需求,考虑需要暴露哪些自定义属性2、熟悉自定义View中文字的测量,绘制3、熟悉自定义View的测量思路:1、测量每个文字(字母)占用的高度,计算出View总的高度,测量文字的宽度,使用setMeasuredDimension将测量的宽高赋值2、根据需求绘制3、处理手指触摸事件实现代码:代码的注释写的应该还算清楚,可以根据自己的需求进行修改,我这里没有处理padding原创 2021-02-14 15:40:31 · 637 阅读 · 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 · 393 阅读 · 0 评论 -
自定义带进度条的播放暂停按钮
自定义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 · 363 阅读 · 0 评论 -
组件化二、APT+JavaPoet配合搭建组件化架构
1、APT(注解处理器)介绍APT(Annotation Processing Tool)是一种处理注释的工具,它对源代码文件进行检测找出其中的Annotation,根据注解主动生成代码,如果想要自定义注解处理器能够正常运行,必须要通过APT工具来进行处理。也可以这样理解,只有通过申明APT工具后,程序在编译期间自定义注解处理器才能执行通过来讲:根据规则,帮我们自动生成代码,生成类文件Google提供了APT的库(Java库),后面会介绍如何导入使用2、Element程序元素Package原创 2020-10-02 15:46:34 · 386 阅读 · 0 评论 -
组件化一、组件化结构搭建
gradle的配置可以看这篇文章组件化预热:gradle简单使用组件化的配置,我们还是通过build.gradle文件来配置一、config.gradle创建创建config.gradle文件,并且使用变量 isRelease = true来判断到底是将不同的Module单独打包测试,还是最终的发布版本(集成到一个apk)ext { // 定义一个项目全局变量isRelease,用于动态切换:组件化模式 / 集成化模式 // false: 组件化模式(子模块可以独立运行),tru原创 2020-09-21 01:06:13 · 213 阅读 · 0 评论 -
组件化预热:gradle简单使用
日常开发中,不管在APP的Module或者Library的Module中1、引入一些共用三方库2、共有的编译库,比如compileSdkVersion,都是各自为政,没有做一个统一的管理现在我们新建一个config.gradle文件来存储一些共有的部分。一、config.gradle的创建使用我们直接将我测试的config.gradle文件新建出来,如下代码,下面来慢慢解释// 添加多个自定义属性,可以添加在ext代码块ext { username = "zhangsan"原创 2020-09-21 00:20:38 · 238 阅读 · 0 评论 -
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 · 311 阅读 · 0 评论 -
Handler用法和内存泄漏处理
Handler内存泄露处理关于Handler内存泄露可以看下面的博客,我经常看的博主Android 内存泄露:详解 Handler 内存泄露的原因Handler的内存泄露就是Handler默认持有了Activity或这Fragment的引用,从而导致Activity销毁后,Handler还持有Activity的引用导致Activity不能被gc回收。解决方案就是静态内部类+弱引用,使用...原创 2018-12-31 22:10:14 · 957 阅读 · 1 评论 -
慢学Android Jetpack
什么是jetpack,就“盗”Google官方的解释。 Jetpack 是一套库、工具和指南,可帮助开发者更轻松地编写优质应用。这些组件可帮助您遵循最佳做法、让您摆脱编写样板代码的工作并简化复杂任务,以便您将精力集中放在所需的代码上。 Jetpack 包含与平台 API 解除捆绑的 androidx.* 软件包库。这意味着,它可以提供向后兼容性,且比 Andro原创 2020-07-22 21:06:50 · 126 阅读 · 0 评论 -
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 · 622 阅读 · 0 评论 -
SVG图使用(笔记)
开发中遇到画不规则的图像的时候,我们往往通过自定义View,然后自己在onDraw去绘制可能会很麻烦。这时候我们就可以使用SVG图,可以让UI将需要实现的效果设计好导出为SVG图。SVG图的特性svg可被非常多的工具读取和修改svg与JPEG和GIF比起来,尺寸更小,可压缩性更强svg是可伸缩的svg图可以在任何分辨率下被高质量的打印svg可在图像质量不下降的情况下被放大svg图像...原创 2019-11-15 00:22:00 · 377 阅读 · 0 评论 -
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 · 316 阅读 · 0 评论 -
Android常用屏幕适配方式
屏幕适配原因:Android设备碎片化,导致APP的界面元素在不同的屏幕尺寸上显示不一致。目的:让布局,布局组件,资源,用户界面流程,匹配不同的屏幕尺寸。屏幕适配常见方式布局适配1、避免写死控件尺寸,使用match_parent,wrap_content。2、LinearLayout使用android:layout_weight=“1”,android:weightSum="4"等...原创 2019-10-30 00:47:37 · 556 阅读 · 0 评论 -
Android事件分发简单分析(源码分析)
想玩转自定义View,我们需要了解事件分发流程,知道具体的触摸事件怎么去处理、消费。事件定义:当用户触摸屏幕时,会产生触摸行为。一、常用的事件的类型(四种):MotionEvent.ACTION_DOWN 手指刚接触屏幕MotionEvent.ACTION_MOVE 手指在屏幕上滑动MotionEvent.ACTION_UP 手指从屏幕松开MotionEvent.ACTION_...原创 2019-10-23 00:53:53 · 182 阅读 · 0 评论 -
Path基础之PathMearsure详解
PathMeasure路径测量,用来测量path的工具类。原创 2019-10-20 19:59:48 · 565 阅读 · 0 评论 -
Android自定义View之Path基础(一)
Path类封装由直线段,二次曲线和三次曲线组成的复合(多个轮廓)几何路径。 可以使用canvas.drawPath(path,paint)进行填充或描边绘制(基于Paint的Style),也可以用于剪切或在路径上绘制文本。github上的示例...原创 2019-10-17 01:30:04 · 277 阅读 · 0 评论 -
Android自定义View之Canvas基础
画布:通过画笔绘制几何图形、文字、路径(Path),位图(Bitmap)等绘制内容我们需要准备:一个用于容纳像素的位图,一个用于承载绘制调用的Canvas(写入位图),一个绘制图元(例如Rect,Path,文本,位图),一个绘制( 描述图纸的颜色和样式)。Canvas常用的API大概分为:绘制、变换、状态保存和恢复。一、变换二、绘制图形绘制、文字绘制、路径绘制、位图绘制等...原创 2019-10-09 10:29:10 · 382 阅读 · 0 评论 -
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 · 1139 阅读 · 0 评论 -
Android中View绘制流程(源码)
日常开发中,我们经常碰到需要自定义View(包括自定义View和ViewGroup)的地方,并且在面试中也需要我们熟悉或者精通自定义View。毕竟有时候我们需要实现的效果,Android本身是没有提供的,就需要我们去自定义,掌握原理可以让我们在实际使用中更加得心应手。一、View是如何被添加到屏幕上的从Activity走起,我们日常是通过Activity的onCreate()方法中的 se...原创 2019-10-04 23:25:03 · 372 阅读 · 0 评论 -
Kotlin简单入门
开始学习Kotlin是因为Google将Kotlin作为Android开发的官网语言,现在市面也有一些公司面试的时候开始将Kotlin作为一个加分项,其实可以想想多学一点东西,多一点傍身的技巧,O(∩_∩)O哈哈~。Kotlin的基本数据类型Kotlin 中使用的基本类型:数字、字符、布尔值、数组与字符串。数字整型Kotlin 提供了一组表示数字的内置类型。 对于整数,有四种不同大小的类...原创 2019-10-02 13:36:15 · 661 阅读 · 0 评论 -
Retrofit+RxJava配置访问网络
Android网络框架使用过的包括HttpClient,HttpURLConnection,Volley,OKhttp等等,OKhttp是现在常用的用于网络访问的框架。现在常常开发中是Okhttp配合Retrofit和RxJava一起使用,单独显得更加优雅。本文就介绍下这三个配合使用,现在Retrofit默认就是使用的OKhttp作为网络访问框架。下次可以把OKhttp单独使用写一下。...原创 2019-09-22 13:21:03 · 557 阅读 · 0 评论 -
简单玩git
Git介绍不管以前是否使用过git,其实现在都可以开始了解学起来,下面的介绍就引用维基百科的介绍,有兴趣的可以看一下。Git是什么?具体干什么的 ?git(/ɡɪt/)是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。应注意的是,这与GNU Interactive Tools[5](一个类似Norton Comma...原创 2019-09-15 02:29:34 · 219 阅读 · 1 评论 -
两个Fragment之间的值传递
安利一个博客,想学算法的老铁觉得难的可以推荐一个好玩的博客,程序员小灰,通过漫画的形式讲解算法。微信公众号也叫:程序员小灰Fragment向Activity传值平常我们开发中用的比较多的Fragment传值,可以用EventBus、Handler、接口(回调),广播,静态变量等等。平常开发中我们经常会遇到Fragment和Fragment之间相互通信,Google推荐我们通过共有的Act...原创 2019-09-01 23:00:54 · 1961 阅读 · 0 评论