自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 Flutter 中关于plugin引入的一些事儿

flutter 中plugin开发与发布流程 这里不做说明,想了解的可以看看其他人的博客。这里主要是想分析一下 plugin 中原生代码是如何被我们引进来的(仅限android 这部分)最近也是初学 不明白原生的代码我们怎么引进来的。 首先我们在pubspec.yaml 中引入了xxx:1.0.1 的库 我们使用 pub get 下载这个库 。我们就可以在dart 中使用该库封装好的控件 或者api 了。 如果这个库有与原生交互的功能那么它内部一定是写了一个plugin 内部...

2020-06-23 11:08:49 2261 2

原创 Android 自定义 高亮 新手引导页

今天打算跟大家分享一个 用于首次安装 ,用户功能引导页。可能现在有些开源的高亮引导控件无法满足设计的需求,那么大家可以看一看我这篇文章,并不是十分的完善,仅仅是为了给大家提供一个思路,那么下面我写一下实现的思路。 一,拿到当前activity的decorview 我们的蒙层是加到这个decorview 中 。我们知道每一个activity的页面实际上都是在decorview 中的...

2019-03-13 17:14:04 5050 2

原创 Android 加载Assets目录中Xml布局文件

最近由于项目开发使用到了动态布局,因为打包sdk ,sdk 这块activity 需要一些layout 文件 。而做过sdk 开发的小伙伴应该知道,layout 文件是不能打包到jar 中的。当然了aar 除外。由于项目使用的还是jar包,所以怎么解决layout文件是个问题,一开始想到的办法就是把layout 文件发给客户。但是这种方法显然不太合适后来就发现了Android 其实提供了一个方法可以

2017-11-09 10:35:04 7096 4

原创 关闭SwipeRefreshLayout的下拉刷新

上一篇 我写了一个 SwipeRefreshLayout 如何添加上拉加载和下拉刷新 马上就来报应了。 因为有时候用不到下拉刷新怎么办  SwipeRefreshLayout.setEnable(false)这样就行了 。这是我第一篇这么短的博客。我短我骄傲啊。

2017-02-28 14:07:49 14554 12

原创 Fiddler抓包工具以后调接口可以不用log啦

最近开发,发现个问题每次调接口都要打下log 看下 接口。这样费了好多事,如果事先写了log 基类还好如果没有写那么每次调接口都要写一遍log 输出就很降低效率。所以我找了找解决办法,最后发现一个工具还是挺好用的就是抓包工具 Fiddler 。下面我把具体的使用步骤给大家写出来。大家可以用用看是否方便(今天康师傅听说解散了,以后吃不到红烧牛肉面了)。1.下载安装fiddler 打开设置 to...

2017-01-03 09:39:43 4256

原创 ExoPlayer 神奇的卡顿问题

项目使用Exoplayer 播放视频。如果播放过一次视频。然后重新滚动我的组件。会发现 越到后面越卡。找了好几天也没发现原因。后来 发现我在滚动组件的时候调用了 player.stop。我进入stop 内部看了一下。看到里面有线程等待的调用。应该是不断调用 stop 等 发生了多次调用wait 让主线程出现了 阻塞。于是判断播放器状态 只有 播放器 没有停止的时候调用一次stop。

2024-02-23 14:55:54 234

原创 Android Cmake 增加第三方库的依赖

执行build后,我们就可以看到在 src/main/jniLibs 增加了 xlog 的 so 文件,这里的so文件仅仅只是参与到编译过程,不会打包到apk,apk关联的还是mars-xlog.aar带有so文件。这部分的代码是要添加xlog的依赖,也增加拷贝脚本,作用是把 mars-xlog 包里面的 so文件拷贝到 src/main/jniLibs 文件夹。,放到 cpp/export_include/xlogger 目录下,只需要4个头文件,其它文件都不需要。从 mars 的仓库下载。

2023-11-09 10:52:26 310

原创 FFmpeg 解析Glide 缓存下的图片文件报错(Impossible to open xxx)

后来我分析了 正常播放的图片以及播放出问题的图片。希望遇到的战友们也可以及时解决这个坑。所以你会发现glide 缓存下来的文件都是.0 结尾的文件。问题就在这ffmpeg 如果在文件名中 找不到文件格式。简单介绍下背景 我们业务有个功能把图片放到一个文件中,统一进行播放 ,但是遇到一个棘手问题,某一个情况下 的图片 就是打不开 就是报错。但经过测试 该加的都加了。所以 不是编译参数的问题。于是我直接把这个图片的文件名改成了,jpg 发现可以正常播放。希望遇到同样问题的同志们。没问题的文件数据是这样。

2023-10-24 16:56:16 792

原创 Glide 加载 图片 多次切换 屏幕闪烁问题

使用前一张图片做为过渡图片去除中间闪白:

2023-09-05 16:09:54 337

原创 任意圆角的自定义View

以RecyclerView 为 例子。

2023-08-25 15:44:46 94

原创 FFmpeg 静态库编译错误汇总

今天使用静态库编译发现 了错误 这个只有在arm64 的编译上 存在。armeabi-v7a不存在问题。解决方案列举汇总 有很多 大家如果有同样的问题可以一一测试。我这里只说明我的情况不一定适合每一个人。增加 --extra-cflags= no-pie。FFmpeg 脚本增加 --enable-pic。

2023-08-18 14:38:50 761

原创 FFMPEG android mac 编译 支持DASH/OPENSSL问题汇总

不然都是在你的输出目录中创建 的。RUN 发现又出幺蛾子了。提示找不到SDLActvity waht happened?我目前遇到的问题 都是libavdevice 和 libswresample.so 这两个库 中的函数找不到 其他的库没有问题。支持https 就必须添加open SSL 的编译 具体可以查看我的另一个关于open SSL 的。然后我们配置的一些路径 涉及 ndk 的一定要查看你用的ndk 版本 是否存在这些路径这是第一步。在打包编译的过程中遇到了很多问题。RUN 发现又出问题了。

2023-07-21 10:23:42 516

原创 【CrashIssue】Can not perform this action after onSaveInstanceState

今天就记录一个 发生的问题 以及解决方案 简单粗暴 尽快帮大家解决问题。具体原因大家抽时间可以搜网上有详解的原码,如果你是在activity 快退出的时候 调用过 fragment 的一些。commit()/commitNow() 这些切换的 操作情况。那么你只需要把 这两个方法。这样就不会发生crash 问题。

2023-04-19 15:54:25 440

原创 下拉刷新组件与WebView内部子可滚动div冲突问题

可以利用webview的evaluateJavascript方法来监听特定元素,第一个参数script用于执行一段js脚本以获取指定元素的指定属性比如div的height,第二个参数resultCallback是一个回调函数,当取到第一个参数指定的属性时就会执行调用。对于没有id的React组件,比如antd mobile组件Picker,就需要添加一个隐藏的div,然后根据Picker的状态的改变来改变div的height,最后就可以在android端根据div的高度来决定是否可以下拉刷新了。

2023-03-13 17:03:47 496

原创 Android控件EditText的代码设置InputType的注意事项及动态设置TYPE_NUMBER_FLAG_XXX 无效的原因

"在Java代码中仅设置setInputType(EditorInfo.TYPE_NUMBER_FLAG_DECIMAL);是不能生效的,必须设置setInputType(EditorInfo.TYPE_CLASS_NUMBER|EditorInfo.TYPE_NUMBER_FLAG_DECIMAL);部分参数值在Java代码中设置时要达到相同效果可能java中参数需要由多个参数组合使用。1、InputType属性在代码中的设置必须放在setSingleLine()函数之后,否则无效;

2022-09-19 11:01:30 2082

原创 Android View 扩大点击区域

private fun toSetBigClickArea(view:View){ var delegateArea = Rect(); var delegate = view view.post { delegate.getHitRect(delegateArea) delegateArea.top -= 80 delegateArea.bottom += 80 ...

2022-03-29 17:40:08 2638

原创 Android RecyclerView 横屏禁用滚动/竖屏开启滚动

最近项目在做瀑布流 ,然后整体我是用RecyclerView 做的 ,而且每个item 里面会有个播放器。我们的需求是这个播放器可以全屏展开,但是如果全屏展开 ,不能让RecyclerView 滚动。网上看到都是 改LinearLayoutManger 的 canScroll 这个 是初始化的时候 可以禁用。但是我这中需求可能不太符合,后来我想是不是可以 在横屏的时候 把 触摸事件消费了。 进过实验 这种方式可以实现,但是我后面思考了下,事件不能消费,事件消费了里面的view 点击都没有办法响应了。于是我在

2021-11-10 17:55:43 2950

原创 解决 Could not resolve androidx.arch.core:core-common:[2.1.0] 问题

具体详情可以看看图上。有没有跟你的问题相符 如果 差不多的话 。你可以试试如下的解决方式其实看着问题就像是 jcenter 这个链接 访问不了。所以我试了下这个链接 是404 。解决方案就是将 project 中 build.gradle 里面的注释掉jcenter,替换成maven{url'http://maven.aliyun.com/nexus/content/groups/public/'}...

2021-09-16 19:03:25 1988

原创 Android showAsDropDown 7.0以上无效的问题

我先贴上我的解决方案 再说明下为什么这么做 if(Build.VERSION.SDK_INT>24){ int[] location = new int[2]; anchor.getLocationOnScreen(location); int y = location[1]; mPopupWindow.showAtLocation(anchor, Gravity.BOTTOM, 0,.

2021-05-12 14:12:46 480

原创 Android webvtt 格式解析

首先我们的webvtt 大概长这个熊样WEBVTT00:00:0.000 --> 00:00:2.280iN7wUpqNhLyxUJwt6zkQRw1tjd60thq75hA3HPnYvCuWE2Yxr360RUDRZhEJn-Og_0.jpg#xywh=0,0,160,28400:00:2.280 --> 00:00:4.560iN7wUpqNhLyxUJwt6zkQRw1tjd60thq75hA3HPnYvCuWE2Yxr360RUDRZhEJn-Og_0.jpg#xyw.

2021-03-31 17:10:40 544

原创 Kotlin 小记 --关于数组范型 后面加问号的原因

var array: Array<String?>? = null 这里面第一个问号 表示 该数组 除了可以存String类型 还可以存 null 第二个问号表示 数组 array 可以赋值为null

2021-03-18 10:46:15 547

原创 FFmpeg avformat_open_input 返回 -5

今天ffmpeg 一直报 -5 ,检查了好几遍代码也没发现问题,后来 在网上查了一下。说是有没有 编码问题。 然后 就是下面的解决办法请尝试 clean 一下 android studio 或者 重启一下 android studio

2021-03-17 15:55:51 1095

原创 NDK 学习笔记--06(C语言基础篇 结构体)

结构体定义 一般关键字 struct {}里面定义一些属性,其实 类似于java 中的bean classtypedef struct work{ int age; char* name;};//定义一个work 结构体 属性 age,name如何使用结构体 work wor; //定义 类似于java new 了一个 work 结构体 就能调用这个对象赋值 //但是这种情况 每个属性是没有初始值的 wor....

2021-03-10 11:43:31 109

原创 NDK 学习笔记--05(C语言基础篇 函数指针与指针函数)

函数指针 其实就是一个指针 它的类型是一个函数指针函数 其实是一个函数 ,它的返回值类型是一个指针所以我们明确了这个概念就很好区分了。下面我写了一个例子函数指针:int (*method)(int,int); //这是一个函数指针, 这个函数 返回值是int ,参数是 两个int ,满足该条件的函数都可以 赋值给这个指针 int add(int a,int b){return a+b;}method = &add ; //取这个函数的地址或者 ...

2021-03-10 11:02:44 112

原创 NDK 学习笔记--04(C语言基础篇 数组和数组指针)

c 语言中的 数组 首地址 就是 arr 的值 int arr[]= {1,2,3,5}; //遍历数组 for(int i=0;i<4;i++){ LOGD("%d",arr[i]); } LOGD("arr的值%p",arr); LOGD("arr的值%p",&arr); LOGD("arr【0】的值%p",&arr[0]); /** * arr的值0x78383c74e0 a..

2021-03-09 14:58:13 134

原创 NDK 学习笔记--03(C语言基础篇 二级指针)

二级指针,大家经常会比较懵 ,我这里做了个例子 int i = 10; int y =20 ; int* p = &i; int ** p2 = &p; LOGD("p的值 %p",*p2); LOGD("i的地址 %p",p); *p2 = &y;//将p的值变为 y的地址 那么现在 p 就代表了 y的地址 LOGD("p 现在的地址的存的值 %d",*p);p2 是一个二级指针,它代表的是什么。代表.

2021-03-09 14:47:19 104

原创 NDK 学习笔记--02(C语言基础篇 指针)

在c 语言中,任何的数据 (变量)都有它自己的地址 ,我们需要用一个东西来 表示(指向)这个地址,就是我们的指针 int i= 100; int * p = &i; //p 是指针变量 它的值是 i 的地址(门牌号是多少) //p 这个变量 它对应的值就是i的地址 int* 表示p 代表的是什么数据类型的指针 LOGD("i 的地址 %p",&i) LOGD("i 的地址 %p",p)可以 看到 p 和 &...

2021-03-09 11:50:31 118

原创 NDK 学习笔记--01(C语言基础篇 基本数据类型)

从这篇文章开始,我将记录关于NDK 开发的一些 学习笔记,从基础开始,然后也会记录一些学习新的,感兴趣的可以一块学习 int i =100; double d =200; float f = 200 ; long l = 100; short s = 100; char c = 'p';基本数据类型 没什么好说的。 这里罗列了一部分 ...

2021-03-09 11:38:10 91

原创 Android Button 如何调整内边距

很简单 xml 设置几个属性即可android:minWidth="0dp"android:minHeight="0dp"android:padding="5dp" //padding 可以控制 左右上下的 内间距 记得你的width 和height 要是设置 wrap_content

2021-02-08 15:37:14 3130

原创 MediaPlayer 使用报错 (NO NETWORK SECURITY CONFIG SPECIFIED, USING PLATFORM DEFAULT)

最近在使用Mediaplayer 播放网络视频的时候。发现log 中输出如题错误。开始以为是网络权限问题 然后通过下面链接中的步骤 加上就解决了。应该是mediaplayer 内部使用了apache 的 网络请求 ,如果没有配置 是访问不了网络的。所以报错。https://www.freesion.com/article/2796743666/...

2021-02-03 14:35:10 291

原创 Kotlin 关键字

out 相当于java里面的 <? extend>例如 Class<? extend Activity> kotlin : Class<out Activity?>in 相当于java里面的 <? super>

2020-12-03 18:06:14 131

原创 自定义时间计时器

最近比较忙 就不做说明了,可以实现 00:00:00 格式的计时功能 ,如果有不同之处可以改代码修改一下即可,代码很简单 大家看看就能明白import android.content.Context;import android.graphics.Color;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.view.View;...

2020-12-02 15:14:08 525

原创 Android 判断是否有耳机连接 (蓝牙 有线)

话不多说 直接上代码package com.kwai.video.groupvideochatdemo.util;import android.bluetooth.BluetoothAdapter;import android.bluetooth.BluetoothHeadset;import android.bluetooth.BluetoothProfile;import android.content.BroadcastReceiver;import android.content.

2020-09-24 15:45:32 2094 2

原创 Android 使用AudioRecorder 录音 并播放PCM 音频

本文介绍的 是录音采用AudioRecorder 然后 保存PCM 格式到文件 然后 使用AudioTrack 播放PCM 同时 支持 蓝牙耳机录制 音频下面贴下代码1 AudioRecorder 录制和播放package com.kwai.video.uikit.bluetoothapplication;import android.media.AudioFormat;import android.media.AudioManager;import android.me...

2020-09-24 15:05:29 1043

原创 Android Framework 之 zygote 副篇

通过之前的源码 分析 我们 看到了zygote 的源码 以及它里面的一些东西。 然后我这里画了一个图来 总结一下zygote 是负责fork 出一些其他进程的。我们的app 启动 的主进程 都是通过zygote 来进行的,那么为什么要通过zygote 来进行fork 为什么不新建了进程呢。。 其实是因为 zygote 在创建的时候预加载了一些 资源 如 系统库 opengl android 等等 还有系统类 一些资源,会做一些预加载工作。linux 中有一个 写时复制 技术(copy on...

2020-09-11 17:25:21 130

原创 Android FrameWork 之ActivityThread 源码

由之前的源码 我们知道ActivityThread 的创建是在SystemServe中开始的SystemServer.java run 方法private void run() { try { Looper.prepareMainLooper(); Looper.getMainLooper().setSlowLogThresholdMs( SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHO.

2020-09-10 17:10:01 407

原创 Android FrameWork 之Launcher启动源码

之前分析了SystemServer 启动 而Launcher 启动就是在之后进行的 位置就在 SystemServer 的run 方法内 开始 private void run() { ........ // Start services. startBootstrapServices(); startCoreServices(); startOtherServices(); ........ }这里启动了几个服务.

2020-09-10 15:30:38 227

原创 Android FrameWork 之zygote与systemserver 的启动源码分析

上一篇 说了 开机的init 进程,这里说明下zygote 进程 借鉴一下其他大佬的说明所有的应用程序进程,以及用来运行系统关键服务的System进程都是由zygote进程负责创建的。因此,我们将它称为进程孵化器。我们看zygote 的源码 主要是通过http://androidxref.com/6.0.0_r1/xref/frameworks/base/cmds/app_process/app_main.cpp这个文件 是zygote 的源代码 通过这个cpp 生成可执行文件所以我们直接.

2020-09-10 11:49:50 133

原创 Android Framework 之Init 源码

android 系统启动 我们这里从 init进程这个文件开始 来一步一步的跟一下 。中间关于源码部分省略了很多就挑了一些大致能看懂的部分 跟一下。主要就是学习一下 整个流程 至于 很多细节部分 想看的可以自行找源码学习。。相关 文件 /system/core/init/Init.cpp 然后找到它的main 方法int main(int argc, char** argv) { ... //初始化signal handler signal_handler_in...

2020-09-09 15:01:04 181

原创 Android Gradle依赖管理,去除重复依赖

我这里就是记录一下 去重问题 。由于现在网上的都是一些大家都知道的第三方库 或者android 自带的库 去重 。但是当你的项目里依赖的是很多公司内部的库。然而这些库出现了重复的问题 你该怎么处理呢。我反正是不直到 exclude 后面 到底填什么 ? 包名?还是什么 该怎么写 才能去重呢。 下面就记录下 填写方法这里截图以 greendao 为例 任何你依赖的库 在你project 目录的 external Libraries 目录下面都能看到我们都知道去重是找到 对应的依赖 然后在里面配..

2020-08-27 16:41:34 1445

空空如也

空空如也

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

TA关注的人

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