自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Fury的博客

欲买桂花同载酒,终不似,少年游

  • 博客(25)
  • 资源 (3)
  • 收藏
  • 关注

原创 java.lang.ArithmeticException:divide by zero

今天测试点出个异常,看log还是第一次见,挺有意思记录一下。java.lang.ArithmeticException:divide by zero除数不能为零,请务必检查代码是否有机会出现除数为零的情况。简单来说就是分母为0。还好不是我写出来的,溜了溜了~...

2022-01-28 11:45:26 1540

原创 Android Jetpack 之CameraX(1.0.0-beta07)使用

CameraXCameraX 是一个 Jetpack 支持库,目的是为了简化相机应用开发工作。相比打开Camera2动不动就是上百行代码,CameraX使用起来是方便太多了。 本篇介绍Camerax的基本使用方法,以及从如何处理从camera获取到的图像数据(旋转转为nv12)。网上关于CameraX的博客基本上都是从官网翻译的,都是用的kotlin实现的,本篇使用的是java语言。使用 def camerax_version = "1.0.0-beta07" // CameraX core

2021-02-01 10:58:11 633

原创 Android设备之间投屏功能实现

简介简单实现两个android设备之间的投屏功能。设备间通信是通过局域网,需要连接同一个wifi。录屏用到系统的MediaProjection,MediaProjectionManager,而编解码用的是MediaCodec,所以设备需要有DSP芯片,大部分手机应该都有。两台设备间通信使用websocket,录屏端作为服务器进行推流,显示端就是客户端,收到码流进行解码并显示。先看看最终效果:实现首先需要先导入Java-WebSocket库,WebSocket是一种在单个TCP连接上进行全双工通信

2021-01-09 22:09:50 11621 26

原创 Windows安装配置ffmpeg过程

网上面关于ffmpeg安装的博客大多是两三年前的,ffmpeg官网也有很多变化,自己下载时候也有很多疑惑,最终还是配置成功了,记录一下配置过程。1.首先打开ffmpeg官网,找到下载页:http://ffmpeg.org/download.html2.点击windows的第一项,windows builds from gyan.dev3.找到release,下载full.zip:4.解压下载后的压缩包:5.配置环境变量,在系统变量 path中添加 ffmpeg-2021-01-01-gi

2021-01-09 14:41:36 2157 1

原创 Android P 解决“从锁定屏幕中添加用户”功能不起作用

问题描述打开设置–>系统–>高级–>多用户,如下图所示:测试同事发现当没有启用这个功能时候,在锁屏页面还是可以添加新用户,默认是没有打开这个功能的。先看看锁屏页面,在锁屏页面调出下拉菜单:然后点击方框中的头像:可以进入这个页面,点击添加访客,可以进行切换,而此时设置中的从锁定屏幕中添加用户是禁止的状态,说明确实存在问题,那就跟代码吧。这里先说一下我的思路,先找到设置中设置从锁定屏幕中添加用户的代码,先确定点击点击按钮settings做了什么。因为锁屏属于systemUi模块

2021-01-04 16:10:10 941

原创 Windows cmd 支持ls命令

平时习惯了linux的ls命令,windows cmd不支持感觉非常不方便,记录一下配置过程。1.新建一个批处理文件 ls.bat2.写入如下内容:@echo off dir 3.将ls.bat拷贝到C:\Windows\System32下面再实验一把ls,nice!...

2021-01-03 17:33:28 947

原创 实现反转链表--递归、迭代、双指针、栈

描述2021年,新年第二天,吃过晚饭,没想到一道简简单单的题把我卡了半天,于是乎记录一下。建议自己先写写试试。题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL链表结构:class ListNode{ int val; ListNode next; public ListNode(i

2021-01-02 23:47:06 224

原创 Android GifImageView加载Gif图片及原理

背景前几天看到个有趣的动图,本来下载下来想发给朋友看看的,但是用微信发送时候提示文件过大,一看竟然41M,于是就在想这么大的gif怎么加载的。所以就搞了个demo去试试。Glide众所周知Glide支持加载gif图片,所以一开始先使用Glide。将动图放到raw中,然后用Glide加载。Glide.with(this).load(R.raw.aa).into(gifImageView);然后等了半天一点反应也没有,就看见log一直在打印:Background young concurrent

2020-12-31 16:30:52 5017 11

原创 Android Jetpack 之Room使用

RoomRoom是Jetpack组件库一员,属于ORM库,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。Room 包含 3 个主要组件:Database: 你可以使用这个组件创建一个数据库holder。注解定义了一系列entities并且类的内容提供了一系列DAOs,它也是下层的主要连接 的访问点。Database注解的类应该是一个抽象的继承 RoomDatabase的类。在运行时,你能获得一个实例通过调用Room.databa

2020-12-30 15:18:08 952

原创 Android AOP面向切面编程Demo

AOP在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。Android开发中使用AspectJ来实现AOP编程。AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个专门的编译器(ajc编译器)用来生成遵守Java字节编码

2020-12-29 18:17:36 273

原创 动态规划---LeetCode 不同路径

前言很久没有刷力扣了,昨天做了下每日一题。中等难度感觉有点名不副实了,一把过。今天记录一下思路吧,这道题作为dp算法入门倒是挺合适的。还不了解什么是动态规划的小伙伴可以先去百度一下。题目描述题目来自leetcode官网。一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示

2020-12-10 13:55:39 150

原创 Android Jetpack 之ViewModel使用

ViewModel之前写过了LiveData的使用,今天来了解下ViewModel的使用方法。ViewModel官方说明先看下官方对它的定义:ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续留存。可以看出ViewModel就是一个存储数据的类。只是生命周期比较长一点。再借用官网一张图。可以看出在activity旋转过程中ViewModel是不会被销毁重建的,这就方便了我们广大程序猿了。再也不用去手动保存数据了,而

2020-09-17 16:49:19 602

原创 Java实现桶排序算法

桶排序上学第一次听到桶排序时候一脸蒙蔽,心想数据结构也学习了,有堆、栈、队列等,没听说还有个桶的数据结构。看完代码才算明白原来桶只是打个比方的意思。其实网上关于排序算法的博客一大把,写这篇的目的主要是记录一下,因为今天突然兴起撸一遍桶排序时候竟然想不起来怎么写的了,好气所以干脆记录起来,好记性不如烂笔头。算法这东西不经常用的话忘得是真快。桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续

2020-09-16 23:24:32 1276 3

原创 Android Jetpack 之LiveData使用及原理

LiveDataJetpack已经出来很久了,虽然挺好用但是说实话对其原理理解还是有限,所以抽空来研究一下Jetpack各个功能的原理。LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。通俗的说就是当liveData数据发生改变时,只有处于活跃状态的组件才能收到数据改变

2020-09-10 14:13:20 684

原创 Android SVG图片解析Demo

SVGSVG是一种图像文件格式,它的英文全称为Scalable Vector Graphics,意思为可缩放的矢量图形。它是基于XML(Extensible Markup Language),由World Wide Web Consortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有交互功能,并可以随时插入到HTML中通过浏览器来观看。

2020-07-30 17:33:58 3716 2

原创 Android 自定义view实现一个方块矩阵

简介项目中要搞一个很多小方块组成的矩阵。然后可以上下波动。先看下效果图吧,就是酱紫:实现看到这个需求脑海中已经有个大概的思路了,在确定了行数和列数后绘制矩形就是了。下面贴上自定义view的代码。在这里插入代码片...

2020-07-28 17:52:58 625

原创 Android开发自定义ViewGroup流式布局

流式布局项目中有需求要用到流式布局,自己就自定义了一个FlowLayout,感觉还是有必要记录一下的。以下的代码是从项目里抽出来的,已经去掉了不相关的代码,如果有需要的话可以自己扩展。先看下最终效果吧。图中背景黄色部分就是我们的自定义ViewGroup,所谓流式布局最重要的一点就是可以换行。下面一起学习下怎么去实现这种布局吧。实现过程首先先思考一下如果要实现这种布局需要考虑什么,需要考虑viewgroup的宽高,如果是wrap_content的话就需要我们自己去测量出它的宽高。还要考虑子控件的m

2020-07-07 11:15:14 285

原创 Java HashMap计算初始数组大小过程

HashMapHashMap相信大家都很熟悉了,我们经常用来存放数据的一种容器。HashMap实际上是数组加链表的数据结构。在JDK1.8后又引入了红黑树。今天抽空研究了一下HashMap的源码,感觉还是非常值得学习的,它里面的一些算法思想真是让人佩服。本文就来结合源码学习一下HashMap是如何计算数组初始大小的。new HashMap首先回顾一下HashMap的用法。1.new HashMap时候没有指定大小HashMap<String,Integer> hashMap = new

2020-06-29 17:24:01 4001 3

转载 Android 9.0 点击桌面应用图标,启动Activity的过程分析

下面分析从手指点击桌面的应用图标,是如何启动一个应用的Activity的过程:首先需要明确一个问题,我们的桌面Launcher其实也是一个Activity,它是继承BaseDraggingActivity,而BaseDraggingActivity也是通过层层继承,最终还是继承了Activity。当点击桌面应用图标时,会执行Launcher这个类的startActivitySafely方法,下面看看这个方法的实现:http://androidxref.com/9.0.0_r3/xref/packages

2020-06-19 17:03:34 863

原创 Android android.uid.system的应用调用安装apk失败

背景最近项目开发过程中用到安装apk的功能。把从服务器下载下来的apk安装到机器中。安装过程中遇到的问题记录一下。问题安装过程中提示解析软件包时出现问题。说明:本文是针对运行的apk在Manifest中声明了systemuid。如果你的应用声明了"android.uid.system",而且也遇到了这个问题,恭喜你找到了本文。android:sharedUserId="android.uid.system"没有声明的小伙伴可以去找别的博客了。安装apk首先回顾一下安装的方法,androi

2020-06-12 13:35:43 5512 17

原创 Android ButterKnife框架实现原理

介绍ButterKnife相信大家都很熟悉了,网上介绍其使用方法的文章很多,还不知道ButterKnife是啥的小伙伴可以先去了解一下。ButterKnife用一个注解就替代了findViewById方法。用起来非常方便,但是你有没有想过为啥就不用写findViewById方法了呢,难道代码就真的没有跑findViewById了吗。来来来,我们来自己手写一个ButterKnife,来学习一下他的技术。效果先看一下Demo的效果吧,先展示出来效果大家才有看下去的动力,毕竟光说不练假把式。上面代码

2020-06-03 15:41:07 441

原创 Android状态栏右侧添加图标并控制其显示状态

背景介绍最近接到一个需求。Android机器外接一个21key的键盘。键盘上有一个绿色和黄色按键。其功能就是当按下时,再按其他键会上报不同的键值。我们的外国合作伙伴就发现了一个问题,机器的页面上没有显示出按下绿键或者黄键的状态,就是说用户可能不知道当前键盘是在哪种输入状态。所以要求我们加上一个提示出来。先看下最终效果,当按下绿色按键后,显示一个g字母,表示green的意思,黄色按键就是y,yellow。思路介绍完背景了,就讲一下实现过程吧。其实刚开始我能想到的是直接加一个notificatio

2020-05-14 12:25:16 3045 3

原创 Android P SystemUi启动流程

本文代码基于Android 9.0分析,个人理解能力有限,如有不对请多指教。SystemUI是在开机过程中SystemServer启动的,SystemServer的startOtherServices()中/*frameworks/base/services/java/com/android/server/SystemServer.java*/private void startOtherS...

2019-11-21 15:46:17 436

原创 Android O 无法接收静态广播完美解决方法

背景:两个应用需要通信,和同事讨论了一下,因为功能比较简单所以打算使用广播进行通信。写完后发现在android O上静态注册的receiver无法接收到广播。顺便就研究一下有什么方法可以解决这个问题。代码:举例说明,最简单的发送广播代码:Intent intent = new Intent("com.test.broadcast.receiver");this.sendBroadcast(...

2019-03-28 15:49:07 3044

原创 Android7.1.1 remap鼠标右键为返回键

需求:客户需求当手机连接鼠标时,可以有开关控制鼠标右键的行为的按钮,打开鼠标右键就为返回键,关闭保持原来行为。如果只是将右键改为返回键还是很好做的,找到点击右键的事件改一下就行,但是现在还需要控制,就涉及到交互的问题了。先看效果图。追踪代码到InputReader.cpp文件,位置frameworks/native/services/inputflinger/InputReader.cpp。熟...

2018-11-16 15:47:12 5475 8

Android投屏demo

两台设备间的投屏demo

2021-01-09

FlowLayout.zip

android ui 流式布局,实现自定义viewgroup flowlayout,实现子view的自动换行。对viewgroup wrap_content的处理等。

2020-07-07

MyButterKnife.zip

自己手写实现的ButterKnife Demo,实现了BindView、BindString、OnClick。需要的小伙伴可以下载下来学习一下。

2020-06-03

空空如也

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

TA关注的人

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