经验知识分享
文章平均质量分 65
android_cai_niao
我是一名Android开发工程师,但我的技术好菜,好希望有人出一些容易看得懂的菜鸟教程。
展开
-
Manning技术出版公司
有些国外翻译图书中提供的源码下载连接可能会失效,这时就可以尝试在这个网站中搜索这本书,如果有的话就会提供有源码下载,非常方便。想学某些技术也可以在这里搜索,虽然这些书都是英文的,但是你可以知道有这样一本书。Manning 是一家美国的技术出版公司,专门出版与计算机科学、信息技术和编程相关的图书和教育资料。该公司成立于 1990 年代初期,是技术图书领域的知名品牌之一。Manning 公司的中文翻译名字可以是 “曼宁”。原创 2024-03-14 09:06:48 · 458 阅读 · 0 评论 -
常用adb命令
其它的等有时间再来完善,现在好忙!原创 2023-12-21 17:58:16 · 507 阅读 · 0 评论 -
获取Android签名文件的MD5和SHA1指纹
如上图,我们有两个变体,一个是debug版本,一个是release版本,两个变体都用了相同的签名文件,正常情况下debug版本要用debug的签名,release版本要用release的签名,应该分开的,但是因为我的应用需要使用系统签名,所以就算是debug版本也需要系统签名,不能使用Android Studio自带的那个默认的debug签名,否则应用中需要系统签名的Api就调用不了,一调用就会崩掉,所以可以配置成都用同一个签名配置即可。原创 2023-10-24 16:49:44 · 334 阅读 · 0 评论 -
优秀github项目
记录一些知名的github项目,方便学习。原创 2023-10-12 10:04:19 · 201 阅读 · 0 评论 -
IntelliJ中文乱码问题
运行时控制台输出的中文为乱码,解决方法:帮助 > 编辑自定义虚拟机选项…原创 2023-08-11 15:01:47 · 239 阅读 · 0 评论 -
版本设计说明
比如,一个app的版本名称应该怎么起,一个库的版本名称应该怎么起等等,可以参考这篇文章。原创 2023-07-12 17:03:06 · 101 阅读 · 0 评论 -
没有BuildConfig
刚刚发现,新创建的一个Android项目,成功运行到手机上了,然后在代码中想使用一下这个类,发现没有,按以前的经验,项目刚创建时是不存在的,但是一但成功运行到手机上后就肯定是已经自动生成了的,但是这次是真没有这个类,如果在代码中不理会报错直接使用,运行将会失败,会提示找不到这个类。几经周折,发现是在(简称AGP 8.0)版本的时候发生了改变,运行AGP 8.0需要JDK 17,这里我们顺便把AGP 8.0的其他功能也一起记录一下,这里只记录了其中一部分主要功能,完整的还请查看官网。原创 2023-07-04 10:09:26 · 1870 阅读 · 0 评论 -
android复制与粘贴
这时可以看到两个位置都显示出复制的内容了,且都是明文显示。在我的小米11 pro (Android 13)上运行时,无论输入法有无显示,点 “copy” 按钮时均无复制提示,相同的是,如果输入法显示时在输入法上也会显示出复制的内容,且无论是否设置为密文都是明文显示的。按钮会复制第一个输入框中的文本,点击。界面中有两个输入框,点击。原创 2023-06-29 09:00:11 · 1112 阅读 · 0 评论 -
Android模拟器无法启动
在Android 13版本上,关于“复制”有了新的变化,但是我在我的小米手机(也是Android 13版本的)上测试没有看到对应的变化,所以想运行一个Android 13的模拟器来测试看看,结果死活运行不起来,一直卡在开机画面: “Pixel is starting…我安装发现安装不上,卸载也说卸载失败,我以为是bios里面的那个虚拟的什么开关没打开,但是检查bios已经是打开了的。如上图,那个进度条也是不动的了,就一直卡住,等多久都没用,如果此时我调整模拟器窗口大小的话,则模拟器会变黑屏。原创 2023-06-28 17:21:04 · 1277 阅读 · 0 评论 -
Sending non-protected broadcast
这样就看不见那该死的红色异常了。目录下,而且我也无法修改系统源码。看似就没法解决这个报红色异常的问题了。但是也没有解决我的问题,我这个应用为了升级方便,没有把app往到。其实简单点,不要那么完美了,眼不见为净,在日志过滤器中过滤即可(可以看到,把不需要的过滤掉,系统应用(清单文件添加了。原创 2023-05-30 17:08:21 · 1446 阅读 · 0 评论 -
NIO之ByteBuffer
前言ByteBuffer,顾名思义,它表示字节缓冲区。一般我们在代码中使用字节的时候一般用字节数组,即byte[],但是使byte[]的方式效率不高,而使用ByteBuffer的方式来操作数组效率是比较高的,具体描述可以查看jdk文档声明,可以查看ByteBuffer类,以及它的父类Buffer的文档声明,可以详细的了解它们的功能,它们是nio包下面的,nio就是native io,所以效率是比较高的。ByteBuffer除了效率高之外,也提供了一些比较好用的方法,比如writeInt、getInt、pu原创 2023-04-28 11:38:34 · 984 阅读 · 0 评论 -
大意失荊州啊-java基础之多态 & 代理
当时我没太在意这个异常,就是很奇怪为什么我增加一个方法就不行,不都是同一个类中的方法吗?当时我就觉得是不是见鬼了,明明一个类上的两个方法,为什么打印的对象一个是猫一个是狗?如上图,有些函数是继承自父类的,有些则覆盖父类的,可以看到调用的。实际上是一个代理类,它没有实际的功能,实际的功能都在。如上结果,出了异常,理想的结果是输出一个。很简单,就是输出一个字符串,于是我往。类上,所以解决这个问题就很简单了,在。所以总结起来就很简单了,如上图,可以看到调用的。原创 2023-03-14 17:20:22 · 207 阅读 · 0 评论 -
UDP端口转发
这种端口转发的机制比较简单,如果有别的端口或不同的协议则又要进行对应的设置,还有一个更简单的办法,买一个 “360随身wifi” ,它可以把电脑的网络通过一个wifi热点分享出去,这样手机连接这个热点来上网,然后电脑上使用Wireshark对 “360随身wifi” 分享的那个网络接口进行抓包即可,这样的话手机上所有的网络请求,不管是什么端口、什么协议统统都可以抓。的代理,在一款Android7.1的手机Wifi设置上设置代理,在设置界面中有这句话:“浏览器会使用HTTP代理,但其他应用可能不会使用。原创 2023-02-21 16:34:41 · 4151 阅读 · 0 评论 -
Windows官方镜像下载地址
Windows11可以直接选择下载镜像,而Windows10需要先下载下载工具,再用下载工具下载镜像。原创 2023-02-14 11:00:30 · 302 阅读 · 0 评论 -
Android Studio 中文插件
是由修改而来的,所以的中文插件也适用于,如果装上中文插件有问题,则可卸载中文插件,据我个人经验,用了这么多个版本的中文插件了,还没出过问题。的版本更新时,中文插件就会失效,需要到官网下载对应版本的中文插件。比如,我们查看的版本如下:可以看到版本为,这个版本与的版本是对应的,一般来说的最新版本会是的旧版本,因为是先出的,然后公司或者公司才为开发相应的版本,这个开发可是要花好多时间的,所以的最新版本无法与的最新版本保持一致。插件官网:https://plugins.jetbrains.com/,打开插件官网,原创 2022-12-05 17:10:40 · 9356 阅读 · 3 评论 -
查询运行在顶部的app包名及类名
所以我们在过虑信息时不能以自己程序的进程进行过滤,使用。,只能显示公司的app和一些必要的系统自带app,自定义。中打印出当前正在显示的app的包名以及类名,注,这是由。说明了当前正在显示的应用,当前显示的应用包名为。注:这里的类名必须要使用完整路径的类名。比如公司要我做一个自定义。,这是一个相对路径的类名,完整路径为。,这个界面启动的时间为:253ms。还会显示其它信息,还可以使用。有了这些信息,我们就可以使用。原创 2022-12-02 10:02:18 · 2199 阅读 · 0 评论 -
Android Studio代码检查Bug
IDE中识别Kotlin语言写的父类子类时,无法识别,有Bug。原创 2022-10-18 17:04:44 · 831 阅读 · 0 评论 -
一个静态变量的空指针异常
一个静态变量的空指针异常问题。原创 2022-10-17 18:01:22 · 628 阅读 · 0 评论 -
使用mklink来节省C盘空间
比如在C盘用户目录下的`.gradle`目录,所有的`gradle`都会下载到这个目录中,当下载的版本多了以后就会非常的占空间,像我的有9个多G。解决方案是我们可以把`.gradle`目录映射到别的盘去,比如我在D盘创建一个`001_mklink`目录,这个目录名专门存放映射的目录,名称可以随意起的。然后我们关闭掉所有使用gradle的程序,甚至可以注销电脑或者重启电脑,以确保没有程序占用`.gradle`目录,然后我们就可以把`.gradle`目录剪切到`D:\001_mklink`目录,打开CMD,然后原创 2022-09-30 17:36:26 · 1890 阅读 · 0 评论 -
CLion输出中文乱码解决方案
【代码】CLion输出中文乱码解决方案。原创 2022-09-29 14:20:34 · 943 阅读 · 0 评论 -
MediaCodec同步异步使用
为了简单,这里使用无预览的Camera视频采集,然后通过MediaCodec代码也很简单,就两个主要函数,,,需要注意的是,在打开摄像头之前,需要先申请权限。${++}${.codecInfo.name}${::class.java.simpleName}${::class.java.simpleName}${DateFormat.format(,System.())}生成的h264文件是裸流,可以使用VLC播放器进行播放。...原创 2022-08-17 11:43:56 · 1126 阅读 · 5 评论 -
ExceptionInInitializerError
Exception in thread "main" java.lang.ExceptionInInitializerError at com.company.Main.main(Main.java:11)Caused by: java.lang.NullPointerException at com.company.Foo.(Main.java:27) at com.company.Foo.(Main.java:19) ... 1 more原创 2022-08-08 12:01:41 · 591 阅读 · 0 评论 -
setPreviewCallbackWithBuffer的出帧效率会变低
基于这个测试结果,在我们公司的项目开发上我就没有使用缓冲区了,因为我们开发的项目是运行在一个特别的Android设备上,这个Android设备一启动就只运行我们的一个应用,没有其它应用,所以多消耗点内存也没事,反正内存是够用的。可以看到,使用了缓冲之后,帧率下降了,效率并没有提高,只能说更省内存了。平均帧速为30帧/秒。可以看到,使用了缓冲后帧速明显下降。......原创 2022-07-28 08:52:18 · 622 阅读 · 0 评论 -
使用缓冲的方式采集视频
这样就避免了每一帧都创建新的data对象,但是需要注意,我们在处理data数据的时候一定要快,假设需要25帧/秒,则每一帧的处理时间为40毫秒,我们必须在40毫秒内处理完data,然后再把data设置到。之后,才使用我们给的buffer对象装一帧的图像给我们,所以,在我们需要数据的时候就需要调用。这是一个无预览摄像头视频采集,只是一个非常简单的代码,中,如果处理的时间慢,就会导致丢帧。,只是因为系统只会在我们调用了。,如果一直需要,就需要一直调用。运行代码,会发现只打印了一次。运行代码,打印的都是。....原创 2022-07-27 10:19:03 · 272 阅读 · 0 评论 -
Android无预览采集视频
Android无预览采集视频,无预览采集图片,无预览采集图像。原创 2022-07-27 09:10:46 · 682 阅读 · 0 评论 -
Dom4J的Bug
Dom4J Bug!原创 2022-07-26 16:10:47 · 455 阅读 · 0 评论 -
android-jain-sip-ri
android-jain-sip-ri的使用。国标28181。GB28181。原创 2022-07-20 17:19:27 · 936 阅读 · 1 评论 -
java代码实现二元一次方程
前言最近和朋友打羽毛球,6个人参加了羽毛球活动,打完了要计算平均每个人的费用,如果每次都用纸和笔来算就会比较麻烦,所以我就写了一个Android的程序来实现自动计算的功能。用纸和笔计算二元一次方程举行一次羽毛球活动,有4个男生和2个女生参加。费用由场地费和球费组成,场地费是150元,球费是30元,总共费用是180元,费用AA,出于对女生的关爱,女生优惠5元,也就是女生的平均费用比男生少5元,求男生平均费用是多少,女生平均费用是多少。这道题,通过二元一次方程可轻松解决,这是初中的数学知识,假设男生的平原创 2022-03-28 17:25:51 · 2753 阅读 · 0 评论 -
FileProvider的使用研究
前言Android7.0的文件系统权限更新:https://developer.android.google.cn/about/versions/nougat/android-7.0-changes?hl=en#permfilesys在Android7.0的时候,系统禁止使用file://形式的URI,需要改为使用content://形式的URI,所以需要适配的就是把项目中的Uri.fromFile(file)替换为FileProvider.getUriForFile(context, authorit原创 2022-03-10 10:02:51 · 6202 阅读 · 0 评论 -
Android监听网络变化
小于Android5.0的版本小于Android5.0的监听方式,使用广播接收者的方式,代码如下:context.registerReceiver(ConnectivityReceiver(), IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) // 监听连接改变class ConnectivityReceiver: BroadcastReceiver() { /** 指示是否没有网络 */ var noConnectiv原创 2022-02-22 15:31:01 · 4608 阅读 · 0 评论 -
触摸目标尺寸
今天在看布局文件时,发现有一个提示,说我的EditText的触摸尺寸太小了,检测到的高度是35dp,建议设置为48dp或更高。原文链接:https://support.google.com/accessibility/android/answer/7101858原文内容如下:触摸目标尺寸屏幕上可供用户点击、触摸或以其他方式互动的所有元素应具有适中的尺寸,确保可靠的互动。建议确保这些元素的宽度和高度不低于 48dp,如 Material Design 无障碍功能指南中所述。实现在布局中实现可点击或原创 2022-01-13 17:59:04 · 1832 阅读 · 0 评论 -
AndServer配置
AndServer的Github地址:https://github.com/yanzhenjie/AndServer,文档地址:https://yanzhenjie.com/AndServer/在项目build.gradle的dependencies中添加一个插件,如下:buildscript { repositories { google() mavenCentral() } dependencies { 。。。原创 2022-01-06 14:11:48 · 4380 阅读 · 10 评论 -
最通俗易懂:负数的二进制为什么要用补码的形式
负数的二进制使用码补的形式,即:原码的二进制取反加1。我们假设使用byte类型,则数据只有8个比特位,负6的二进制形式分3步形成,如下:取反就是把0变成1,把1变成0。所以负6的二进制形式为:1111 1010有时候我就在想,为什么负数的二进制形式要这么麻烦,比如负6,不能像下面这样子表示吗:如上图,最高位的1表示负数,低7位的000 0110表示6,合起来就是负6,这样不是更简单更容易理解吗?后来,我不经意间发现了一个规律,才明白了负数的二进制形式为什么要用补码的形式。我们知道1个字节是原创 2021-12-29 14:13:50 · 5750 阅读 · 14 评论 -
流量统计权限
流量统计需要申请权限。实现步骤如下:清单文件中申请权限:<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" xmlns:tools="http://schemas.android.com/tools" tools:ignore="ProtectedPermissions" />MainActivity中有一个按钮,点击后开始申请权限,代码如下:class MainActiv原创 2021-12-16 15:29:49 · 398 阅读 · 0 评论 -
Android11文件管理权限申请
Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDcard根目录写文件,Android 11之后要使用分区存储,但是分区存储使用起来很麻烦,所以可以申请文件管理权限,这样就可以随意读写SDcard了,写到根目录也没问题。清单文件声明如下:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/a原创 2021-12-16 10:06:20 · 15928 阅读 · 6 评论 -
RandomAccessFile的效率问题,以及多线程断点续传下载要不要使用rws模式
文件复制操作,我们先使用普通的FileInputStream和FileOutputStream来完成,代码如下:val start = System.currentTimeMillis()FileInputStream("D:\\hello.mp4").use { input -> FileOutputStream("D:\\hello_copy.mp4").use { output -> val buf = ByteArray(8192) var l原创 2021-11-29 17:58:40 · 1607 阅读 · 0 评论 -
SpringBoot上传文件的断点续传实现
百度SpringBoot上传文件的断点续传,千篇一律的都是分片,即把大文件分割成许多小文件,然后上传所有的小文件到服务器,服务器再把所有的小文件合并为一个大文件。这根本就不是断点续传。断点续传应该是传到哪里断了,下次就在那个断开的位置接着继续传,这代码一想也很简单啊,服务器通过输出流不停的写文件,如果被中断了链接了,则客户端下次上传之前先给服务器发送一个请求,让服务器告诉我们之前传到什么位置了,这样客户端就可以从指定的位置开始继续传了。网上的做法都是分片,是因为SpringBoot会自动帮我们接收文件,存原创 2021-11-29 16:31:15 · 1972 阅读 · 0 评论 -
通过NIO分割文件和合并文件和计算文件md5
NIO就是香啊,不但效率高,而且写起来代码也少,示例如下:object FileUtil { fun getFileMd5(file: File): String { // 获取md5签名 val md5Bytes = FileInputStream(file).channel.use { channel -> val byteBuffer = channel.map(FileChannel.MapMode.READ_ONLY, 0,原创 2021-11-25 11:49:26 · 950 阅读 · 0 评论 -
BigInteger的使用以及获取文件的md5
前言JDK文档中对BigInteger的描述:不可变的任意精度的整数。所有操作中,都以二进制补码形式表示 BigInteger(如 Java 的基本整数类型)。按字面理解,BigInteger是一个大整数,有多大呢?可以无穷大!int类型是4个字节,所以int的范围是有限的,而BigInteger能表示的整数范围是无限的。今天在看到同事发的一个获取文件md5的工具类,发现代码中使用BigInteger来把一个字节数组转换为16进制,看着很爽,所以这里也记录一下:fun getFileMd5(f原创 2021-11-24 22:14:00 · 635 阅读 · 0 评论 -
二进制文件比较工具
二进制文件比较工具:Beyond Compare,这是一款收费软件,免费试用30天。也可以找其它的二进制文件比较工具,这里主要是讲解二进制文件比较的作用。今天在做一个文件分割的功能的时候,没什么思路,感觉用传统的IO类写起来还是比较麻烦的,后来看到NIO中的一些写法,用来分割文件还是挺不错的,而且NIO的效率还更高呢,示例代码如下:fun main() { val fullFile = File("C:\\Users\\Even\\Music\\222\\zfy667_2021_11_24_19原创 2021-11-24 20:11:19 · 13153 阅读 · 0 评论