
Android 笔记
文章平均质量分 75
Junerver
一位Android开发者,很菜!
展开
-
如何在 Android 中录制屏幕内容,并以H.264数据流形式发送(屏幕广播)
不同于普通的动态权限申请,屏幕录制的权限在每次使用 App 时都需要重新申请一次。在 回调中保存 与 ,这两个参数将会在后续用于实例化 对象2. 创建 MediaCodec 编码器3. 创建虚拟显示器 VirtualDisplay其中参数有如下几种:一般来说用 VIRTUAL_DISPLAY_FLAG_PUBLIC 即可。大致流程如下:Demo代码仓库地址: junerver/TestCaptureAndRecord...原创 2022-07-01 11:19:13 · 1709 阅读 · 0 评论 -
使用 Docker 搭建 Maven 私服,并通过 maven-publish 上传 aar 到 Maven 私服
1 Maven 与 Maven 私服对于 Maven 大家应该都还不算太陌生,虽然作为 Android 开发我们都是用 gradle 来进行项目构建、依赖管理等工作,但是我们还是离不开 Maven 的中心仓库 Maven Central ,例如在我们的根 build.gradle 文件中就可以看到这样的代码:buildscript { repositories { google() mavenCentral() } dependencies {原创 2022-03-09 10:43:55 · 1249 阅读 · 0 评论 -
在 Kotlin 中巧妙的使用 DSL 封装 SpannableStringBuilder
上一篇文章我们介绍了如何在 kotlin 优雅的封装匿名内部类(DSL、高阶函数),其中我还算详细的介绍了在 Kotlin 中如何使用 DSL,本文可以看作是对上一篇文章中 DSL 的一个实战。源从何来在 Android 开发中 Spannable 实现富文本显示,也算是一个比较常见的使用场景,例如在登录页显示《隐私政策》、《服务协议》,通常这是一个有自定义颜色与点击事件的 Span,使用起来大致需要写如下代码:private fun agreePrivate() { val tv .原创 2022-02-21 18:07:05 · 2353 阅读 · 0 评论 -
如何在 kotlin 优雅的封装匿名内部类(DSL、高阶函数)
匿名内部类在 Java 中是经常用到的一个特性,例如在 Android 开发中的各种 Listener,使用时也很简单,比如://lambdabutton.setOnClickListener(v -> { //do some thing});//匿名内部类button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //do原创 2022-02-18 15:57:42 · 1735 阅读 · 0 评论 -
Compose学习笔记2 - LaunchedEffect、状态与 状态管理
在 Compose 中使用协程Kotlin 中协程有多好用,想必不用我多说了。方便的构建、简洁的切换协程语法、await函数与join函数,尤其是在 lifecycle 扩展出现之后,在 Activity 与 Fragment 中可以通过类似 lifecycleScope.launch { } 这样的语法更方便的使用协程。之前我们介绍过,Compose 是 FP 风格的,UI是通过一个个Composable函数组合在一起形成的,自然不能用lifecycleScope.launch { },那么在 Com原创 2022-02-15 13:43:38 · 3962 阅读 · 0 评论 -
Compose学习笔记1-compose、state、flow、remember
新建一个 compose 项目开始前,请下载最新版本的 Android Studio Arctic Fox,然后使用 Empty Compose Activity 模板创建应用。我们先看看在 app/build.gradle 中是如何配置使用 compose 的。android{ buildFeatures { // viewbinding 之类的功能也需要在此开启 compose true } composeOptions {原创 2022-02-12 10:48:31 · 4271 阅读 · 0 评论 -
Android Gradle打包常用函数记录
日期函数:def releaseTime() { return new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("Asia/Shanghai"))}MD5函数:import java.security.MessageDigestdef generateMD5(String path) { MessageDigest digest = MessageDigest.getInstance("MD5") FileIn原创 2022-01-28 11:20:28 · 477 阅读 · 0 评论 -
用python编写可以快速在 Android 多变体项目中创建 sourceSet 的脚本
本文普适性比较低,仅限于需要在项目里使用多个变体(variant)的开发者。对于gradle打包多变体可以参考我之前写的文章Gradle —— 使用 Gradle 打包多个变体(variant)太长不看:项目地址:junerver/flavor_cli叨叨叨在多变体项目中有一个工作是比较麻烦而且折磨人的,那就是给不同的变体添加自己的 sourceSet。每当我们需要将一个 Java 文件,通过变体来实现差异化时,都需要将该文件从 main 中拷贝,移动到所有变体各自的 sourceSet 中.原创 2021-10-12 10:34:39 · 262 阅读 · 0 评论 -
Flutter 学习日记1
本文用于记录我在项目中集成 Flutter 遇到的种种问题,作者纯 Flutter 小白,所以可能会有大量错误,请大佬指出。1 在原生项目中显示 Flutter 项目我的原生项目是 Android ,使用 AS 开发,使用官网介绍的源码集成方式集成Flutter 模块,在原项目中的 settings.gradle 添加如下代码:setBinding(new Binding([gradle: this]))evaluate(new File( settingsDir.parentFil原创 2021-04-20 12:54:59 · 297 阅读 · 0 评论 -
记一次更新Retrofit版本后发起网络请求程序崩溃
错误日志如下:java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/in原创 2020-12-18 16:46:32 · 822 阅读 · 1 评论 -
DatePickerDialog 仅显示年月
DatePickerDialog 是我们常用系统自带的日期选择对话框,但有时我们仅需要选择 年月 或者仅需要选择 月日,这种情况我们应该如何快速实现该功能呢?直接百度搜索给出的帖子里最接近正确答案的是这篇文章:【Android DatePickerDialog只显示年月或只显示月日】你直接照搬,但是你如果直接照搬,大概率是没有效果,原因在于Dialog的格式!这些文章大部分都写的很早,在19...原创 2019-11-25 09:45:18 · 1428 阅读 · 1 评论 -
Kolin协程与Retrofit 2.6.1完美合璧
协程有多么好用相比我们不需要再多赘述了,协程如何搭配旧版本的 Retrofit 使用相比大家也在网上看到过很多文章,大致如下://扩展 await() 函数 private suspend fun <T> Call<T>.await(): T { return suspendCancellableCoroutine { continuation -...原创 2019-08-12 15:07:49 · 3190 阅读 · 2 评论 -
Kotlin协程 ——从 runBlocking 与 coroutineScope 说起
关于协程我们不多阐述,详细内容请查看官方文档,本文只谈谈 runBlocking与 coroutineScope。runBlocking我们先来看看 runBlocking 文档是如何描述该函数的:Runs a new coroutine and blocks the current thread interruptibly until its completion. This funct...原创 2019-08-07 15:10:14 · 26311 阅读 · 5 评论 -
JetPack 初见 - 使用 LiveData 实现组件之间数据共享
18年谷歌退出了新的开发套件 JetPack (喷气背包),本文将浅显的讨论一下其中 LiveData 的一些使用方法与注意事项。1. LiveData 是什么?LiveData 是一个可观察的数据持有者类。与常规observable不同,LiveData是生命周期感知的,这意味着它关注其他应用程序组件的生命周期,例如 Activity,Fragment 或 Service。这确保了 Liv...原创 2019-07-25 11:11:59 · 3261 阅读 · 0 评论 -
Android 9.0适配
在 res/xml 文件夹下新建一个 xml 文件 network_security_config.xml,内容如下:<?xml version="1.0" encoding="utf-8"?><network-security-config> <base-config cleartextTrafficPermitted="true" />&l...原创 2019-07-15 10:32:08 · 769 阅读 · 0 评论 -
百度鹰眼SDK文档勘误 —— 查询实时位置
SDK 版本: 3.1.0sdk文档:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/searchtrack查询实时位置查询一或多个被追踪者的实时位置。//鹰眼服务IDlong serviceId = <开发者创建的鹰眼服务的ID>;//entity标识列表(多个entityName,以英文逗号...原创 2019-07-02 10:43:22 · 2153 阅读 · 0 评论 -
自适应的TextView —— AppCompatTextView
没什么好说的,对优快云上的一些文章进行勘误。如果你的 minSdkVersion ≥ 26 那么TextView 已经自带该项支持,只需要添加在 xml 文件中添加android:autoSizeTextType="uniform" 即可!如果你的minSdkVersion 小于 26,那么就需要使用 v7 支持包中的 android.support.v7.widget.AppCompatT...原创 2019-05-21 16:49:26 · 1176 阅读 · 0 评论 -
Android Studio 项目 Gradle 升级经验总结
想必各位小伙伴早就都有收到各大应用市场下发的关于《软件高 API 公告》吧!升级我们项目的 API 版本等级已经是必须提上日程了,同时 AS 版本等级、Gradle 版本也是我们升级绕不开的一环,总不能 API 等级提高了,项目还基于低版本的 Gradle 吧。下文我们将简单讲讲,在升级 Gradle 版本时需要注意的一些问题,以及出现相关问题时的解决方法,愿各位小伙伴都愉快的升级。环境为:...原创 2018-12-29 09:59:34 · 5574 阅读 · 0 评论 -
在项目中集成Freeline来提升编译速度【百分百成功】
转载请标明出处:http://www.jianshu.com/p/e1772bfa9a96引言作为一名 Androider 你应该也曾被 AS 那缓慢的编译速度所折磨 ,更为可怕的是即使你只是简单的修改了几行代码,修改了几个布局文件,当你再次运行的时候还是需要再次进行:「编译项目」—「安装 APK 到手机」。这两个步骤在我这台机器上,快则 4、5 分钟,慢则需要 10 多分钟,调试过程异常痛苦!G原创 2017-03-22 15:01:42 · 479 阅读 · 0 评论 -
10分钟让你实现在APP中对网络状态变化进行全局提示
永远不要期望用户按照你预设的步骤操作 APP一个新项目刚刚开始推广工作,市场人员向我抱怨用户使用时总会出现各种各样的问题,大部分问题都是因为用户操作不当导致的,但是在用户眼中的结论就是“你们的 APP 不好用”。举一个例子,有的用户在使用时禁用了 APP 访问移动网络,或者有的用户干脆都没有打开移动数据开关或者 WIFI 开关。但是作为开发人员,我们应该避免用户思考,当用户使用出现...原创 2018-05-05 09:06:03 · 3369 阅读 · 0 评论 -
简单说说自定义TabLayout的分隔符
想必关于使用自定义 TabLayout 来作为ViewPager 的指示器,大家都已经很熟悉了吧,如果还不了解自定义 TabLayout,可以看看 Showdy 写的 TabLayout之自定义样式 。本文呢,不再过多的复述如何自定义 TabLayout 的样式相关问题,而是简单说说如何自定义 TabLayout 的分隔符 Divider。如下图所示,是需要实现的页面效果:可以看到...原创 2018-05-05 09:07:35 · 481 阅读 · 0 评论 -
通过百度地图实现仿美团外卖的地图选点确定收货地址
转载请标明出处:https://www.jianshu.com/p/29b60ca83be2 吐槽自己:好长的标题啊这个功能想必大家都很熟悉,但是网上搜索到的几篇文章要么是大段的代码看的头晕,要么是不求甚解的复制粘贴,今天我们从布局到实现原理一步步分析,让你也能完成一个仿美团外卖的地址选择页面。页面布局首先我们从美团外卖的页面布局开始分析,如下图所示:可以看出......原创 2018-05-19 11:12:03 · 21171 阅读 · 2 评论 -
一步一步教你简单完成 Android USB开发
项目中有一个新的需求,要求可以连接一个USB体温枪,APP可以从体温枪中读取到体温数据,一番搜寻之后发现一个封装很棒的USB通信库。 github地址:usb-serial-for-android准备工作从 github 上 clone 这个库的源文件在Android Studio中引入模块 在build.gradle中添加依赖compile project(path: ':...原创 2018-05-16 15:25:42 · 13464 阅读 · 3 评论 -
Android 人脸识别了解一下 (中)
转载请注明作者及出处:https://www.jianshu.com/p/b41f64389c21[25]——Android 人脸识别了解一下 (上) 在上文中我大致的介绍了官方 Demo 中人脸注册的流程,本文我们接着来看看,在完成了人脸注册之后我们该如何识别出用户的人脸特征,从而通过人脸识别获取用户信息。人脸识别的全部流程集成在官方 Demo 的 DetecterActivi...原创 2018-05-28 14:58:37 · 3140 阅读 · 7 评论 -
Android 人脸识别了解一下 (上)
转载请注明作者及出处:https://www.jianshu.com/p/ca3a12bc4911引言人脸识别这件事想来早已经不新鲜,在 Android 中的应用也并不广泛,所以网上相关资料乏善可陈。但是在面对特殊的应用场景时,人脸识别的功能还是有一定的用处的,比如在考勤领域。网上能搜到的很多示例比较多的是基于科大讯飞或者face++实现的,其中有一个示例做的非常漂亮,推荐...原创 2018-05-24 14:15:34 · 6076 阅读 · 6 评论 -
初识Kotlin
这是一个新文集,专门用于记录学习 Kotlin 时遇到的一些问题或者心得体会。由于个人水平有限,文章难免会有错误之处,望大佬不吝指教。Kotlin 由来已久,在17年被谷歌纳为了 Android 开发的一级语言,相必大家也多少有些许了解。在开发工作中,还没能正式的将项目来使用 Kotlin 开发,但是了解 Kotlin 显然已是迫在眉睫了。旧项目引入 Kotlin 开发如果...原创 2018-06-08 09:09:37 · 560 阅读 · 0 评论 -
每次都有点新收获
转载请标明作者与出处:https://www.jianshu.com/p/91c6f28adb31遍历集合、控制流、伴生对象遍历集合在 Java 中我们经常需要遍历一些数组或者集合时我们常用的操作是这样的:List<String> list = new ArrayList();list.add("1");list.add("2");list.a...原创 2018-06-29 15:57:12 · 249 阅读 · 0 评论 -
简单即是美
有的时候我们经常会希望一个函数能返给我们多个结果,例如曾经我做过一个小功能传入PM2.5的值,返回当前PM2.5严重程度的介绍以及需要显示的颜色代码。使用data关键字来告知系统这是一个数据类,其主构造函数需要至少有一个参数,如果生成的类需要含有一个无参的构造函数,则所有的属性必须指定默认值。是的,虽然我们有大量的插件来帮助我们简化这些创建过程,但是满天的。需要注意的是,数据类默认为我们实现了主构造函数的参数解构声明,所以我们的解构声明只能接着主构造函数的序号往后使用。...原创 2018-06-29 15:58:22 · 585 阅读 · 0 评论 -
委托模式 - 一个管理人员的一天
委托模式:委托模式是软件设计模式中的一项基本技巧。 在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。举个例子,一个公司有普通员工、财务人员、管理者三个角色,管理者可以调用普通员工进行某项工作,可以派财务人员给某个员工开支。可以看出其中管理者并不会进行某项具体的工作,而是由各个人员来完成各自的工作。我们可以指派管理者去做某项工作,或是...原创 2018-07-02 08:36:02 · 296 阅读 · 0 评论 -
Android 仿微信录制短视频(不使用 FFmpeg)
转载请标明出处与作者:https://www.jianshu.com/p/2cb7b0110fde项目中原本就有录制短视频的功能,使用的是 # qdrzwd/VideoRecorder 这个项目,但是该项目不支持 targetSdkVersion 22以上的版本,而现在各大市场都要求 targetSdkVersion 必须要26以上了,所以急需找到替代的方案。分析解决方法大致上有如下三种......原创 2018-11-02 14:30:04 · 12261 阅读 · 21 评论 -
拿来就用的 RecyclerView 上拉加载
上拉加载在 RecyclerView 中应用已经十分普遍,很多封装好的 RecyclerView 框架中也都有集成该功能,但如果我们只是想在一个页面中实现改功能,引入一个第三方框架显然是不划算的。闲言少叙书归正传:OnLoadMoreListener.javaimport android.support.v7.widget.LinearLayoutManager;import andro...原创 2018-11-10 11:54:03 · 325 阅读 · 0 评论 -
回调函数在-Kotlin-里的奇妙玩法
本文涉及到的知识点有扩展函数、Lambda表达式的高级应用在Android6.0之后系统加强了对敏感权限的管理,一些敏感权限必须要通过动态权限申请来获得,本文的内容就从这里展开;我使用的是网上比较流行的一个权限申请框架#/,当然本文的重点并不是如何使用这个库。如上所述,我们在一个应用中可能会有很多需要申请不同权限的位置,我们应该为每处需要敏感权限的位置做类似的处理。虽然我们使用了RxPermissions,但是还是需要在用户拒绝的位置写大量重复的弹窗提示代码,这一点也不优雅。...原创 2018-11-12 20:24:13 · 1829 阅读 · 1 评论 -
Jenkins 踩坑记录
Jenkins的安装步骤我就不赘述了,有很多文章可以供参考,本文只讲在安装使用过程中遇到的一些问题及解决的方法。1. 安装博主用于部署 Jenkins 的设备是一台 Debian8 主机,使用 ssh 连接。一开始我按照官方指南来进行安装,但是在执行 sudo apt-get install jenkins 提示找不到这个安装包,后来发现是软件源的问题,官方指南上使用的是 https ,改...原创 2018-12-29 09:44:47 · 2716 阅读 · 0 评论 -
Gradle —— 使用 Gradle 打包多个变体(variant)
转载请标明原文地址:http://www.jianshu.com/p/843055bf6edd 刚开始使用 优快云 博客,故将原来写在简书的文章迁移到 优快云 的博客,并重新进行排版。 背景:刚刚接手的项目中包含 3 个客户端 App(两个 Eclipse 工程、一个 AS 工程),同时这个项目根据不同用户的制定还有两个衍生版本。原来的开发人员将项目复制后修改,在我接手时一共存在着9个工原创 2017-03-22 14:38:46 · 1784 阅读 · 0 评论