
Android
文章平均质量分 74
Android应用开发
折翅鵬
无人扶我青云志,我自踏雪至山巅。
展开
-
自定义人脸识别扫描控件实践
最近项目中在相册选择照片以后会首先进行人脸识别,在人脸识别过程中,为了提升用户体验,需要做一个弹窗,效果如下:于是基于ImageView实现了自定义控件,自定义控件的核心点就是绘制扫描效果和噪点。绘制扫描效果的实现方式就是,绘制一个渐变的矩形,然后让矩形移动起来,这里因为用到了,所以采用画布平移的方式来实现扫描区域上下移动,还可以采用偏移量的方式。上下移动的距离计算这边采用的是动画实现,因为要设置,实现先快后慢的效果,选择了,最后再根据动画值进行重绘。原创 2025-03-25 09:51:53 · 475 阅读 · 0 评论 -
二维码活码-裂变营销神器
选择静态码还是活码,主要取决于需求。如果需要灵活性和后续更新,活码是更好的选择;如果只是需要传递固定信息,静态码则更为简单方便。原创 2025-03-20 11:00:08 · 349 阅读 · 0 评论 -
Firebase崩溃:ViewBinding not init!!
最近新版本上线以后,firebase上出现了比较多的崩溃,崩溃日志如下:页面结构是Activity中添加Fragment,Activity和Fragment都使用了ViewBinding。复现步骤是在切换系统语言以后,再回到界面调用一个方法,方法中使用了ViewBinding对象。因为切换系统语言以后,Fragment走了onDestroy和onDestroyView方法,Fragment被销毁了。Activity中是持有对应的Fragment实例的,这会出现问题。原创 2025-03-19 20:40:09 · 152 阅读 · 0 评论 -
ViewPager2拦截父视图的点击事件问题排查
通过跟踪,发现是ViewPager2的子视图RecyclerView拦截了事件。ViewPager2本身是ViewGroup,首个子视图是RecyclerView,于是想到了RecyclerView的事件监听。现在要实现点击Banner执行不同的动作,于是添加了点击事件,然后在点击事件执行的时候,动态获取当前页面对应的数据,再进行处理,结果发现点击事件不生效,于是做了一番排查。最近做项目,实现横向无限视频轮播的Banner,实现方案采用的是。原创 2025-01-17 09:27:45 · 210 阅读 · 0 评论 -
从源码角度理解Handler消息机制
Handler是Android中的核心机制。通过Handler可以将Message发送到Handler所在线程对应的MessageQueue中。每一个Handler实例都只会属于唯一一个线程,也只会对应唯一一个MessageQueue。源码解析使用Handler第一步都要实例化,来看看Handler的构造函数://默认构造函数,将会使用当前线程对应的Looper,如果当前线程没有Looper则会抛出异常public Handler() { this(null, false);}//传入原创 2020-05-17 23:42:15 · 334 阅读 · 0 评论 -
WebView缓存之锅
页面, H5页面需要登录,APP需要把登录态带过去,但是在APP端切换账号以后,还是加载的原来的H5页面,于是做了一下排查。但是还是不起作用,然后继续排查。最后发现是Cookie在切换登录账号的时候没有清掉,导致Cookie被复用了。最近做项目,需要通过。原创 2024-12-27 09:26:53 · 249 阅读 · 0 评论 -
Google Play结算防掉单方案
但是,如果缺少这一步,或者这一步失败,就会出现掉单,权益不到账问题,因此需要想办法解决。我们公司的产品主要是出海产品,使用的是Google Play支付,但是在上线以后,经常有客诉,说支付以后,权益没有到账,于是对整个Google支付体系做了研究了一下。这里有个步骤,就是在支付完了以后,Google服务会回调通知到服务端,因此只要在接收到的通知数据里面,能拿到用户ID就能进行绑定和权益发放。通过设置用户ID到这两个字段中的其中一个里面,可以在服务端收到通知的时候拿到,进行绑定,从而防止掉单情况发生。原创 2024-09-08 01:28:23 · 1385 阅读 · 0 评论 -
自定义TextView实现结尾加载动画
最近做项目,仿豆包和机器人对话的时候,机器人返回数据是流式返回的,需要在文本结尾添加加载动画,于是自己实现了自定义TextView控件。其中BallLoadingDrawable是自定义Drawable,也可以换成其他自定义的Drawable实现不一样的动画效果。注意:使用该控件必须设置。原创 2024-09-07 22:54:13 · 421 阅读 · 0 评论 -
自定义控件实现类似于抖音加载动画效果
最近做AI项目,设计师想实现类似于抖音那种加载动画效果,但是不是两个圆球交叉,而是两个三角形,其实可以用lottie动画的,但是我本人比较喜欢自定义控件,因此就自定义控件实现了。思考:采用Xfermode可以实现吗。原创 2024-09-07 23:32:23 · 305 阅读 · 0 评论 -
Android流式接口请求实践
最近做项目,接入,接口是流式返回的,于是对流式接口请求做了下总结。项目中采用的实现网络请求、因为后面的标识可能会被GPT拆成两个,因此需要拼装后进行解析。原创 2024-09-07 12:45:56 · 1439 阅读 · 0 评论 -
基于NDK验签的方式实现APP重签名校验方案
最近发现有人破解我们的应用,于是研究了一下如何在应用被破解以后,让应用退出的简单实现方案。原创 2023-12-04 16:21:29 · 526 阅读 · 0 评论 -
Android设置文字颜色渐变
项目中用到了很多文字颜色渐变的设计,因此做一下记录。属性颜色值,否则不会产生预期效果。原创 2023-11-29 11:35:57 · 1395 阅读 · 0 评论 -
Android媒体库不刷新问题追溯和解决
最近项目中需要通过ContentProvider获取某种类型的文件列表进行展示,然后在展示列表中可以对文件进行复制,移动和删除操作。在开发过程中,对文件操作以后,再次拉取列表,发现还是原来的旧数据,数据并没有刷新,于是做了一下追溯和解决。查询文件ContentProvider private List<File> findFile(Context context, List<String> extensions) { String[] mineTypes原创 2022-05-14 20:02:57 · 1310 阅读 · 0 评论 -
组件化:合并清单文件
最近做项目,在集成第三方aar以后,本来请求读写权限允许以后应该是权限授予成功了,但是结果却是读权限授予成功了,但是写权限未授权。主项目清单文件权限声明如下:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />然后通过Andr原创 2022-05-01 21:42:19 · 768 阅读 · 0 评论 -
Navigation重建Fragment问题分析及解决
最近项目中使用到了BottomNavigationView结合Navigation实现底部导航栏切换页面业务。NavigationUI.setupWithNavController(bottomNavigationView, navController);结果发现每次点击底部导航栏切换的时候都会重建Fragment,于是分析了源码,并研究了解决方案。源码分析setupWithNavControllerNavigation源码分析解决方案自定义Navigator...原创 2022-05-01 18:35:16 · 3780 阅读 · 15 评论 -
完整Activity和Fragment生命周期
参考:https://github.com/xxv/android-lifecycle原创 2022-04-23 22:53:34 · 339 阅读 · 0 评论 -
EditText选中全部无效问题排查
最近项目有需求,EditText第一次获取焦点以后弹出软键盘并且选中所有文本,于是想到将android:selectAllOnFocus设置为true就能实现。<androidx.appcompat.widget.AppCompatEditText android:layout_width="match_parent" android:layout_height="50dp" android:maxLines="1" android:s原创 2022-04-17 22:57:21 · 2659 阅读 · 0 评论 -
Intent.ACTION_VIEW无法跳转问题排查
项目中文本链接(包括网址和邮箱)点击以后使用的是Intent.ACTION_VIEW打开,但是有用户反馈在三星Galaxy Tab S7上点击以后无法跳转,于是做了问题的排查,最后确定为Android 11以上软件包可见性未设置。链接点击跳转代码如下: public static void openBrowser(Context context, String url) { final Intent intent = new Intent(Intent.ACTION_VIEW, U原创 2022-04-09 14:48:08 · 6105 阅读 · 2 评论 -
Android底部弹窗实现方案
项目中经常会遇到底部弹窗,今天就来把底部弹窗实现方案总结一下。BottomSheetDialog自定义DialogWindowManager原创 2022-03-20 12:22:26 · 8785 阅读 · 1 评论 -
顺序显示多个弹窗方案-责任链模式
在应用中,用户进入应用首页以后经常会遇到顺序弹出多个弹窗的业务。例如进入首页以后,首先弹出运营活动弹窗,然后弹出应用评分或反馈弹窗,最后弹出应用更新弹窗等等。于是想到封装一套代码可以控制弹窗流程执行。DialogChainOwner弹窗链持有者。负责弹窗链节点的加入和展示入口。/** * 弹窗链拥有者,用于控制链节点的添加和展示以及取消,销毁 */public class DialogChainOwner implements LifecycleEventObserver { priv原创 2022-03-19 22:20:00 · 1500 阅读 · 0 评论 -
Google Play结算服务开发
Google Play结算平台开发指导原创 2022-01-09 22:57:50 · 4222 阅读 · 0 评论 -
Android截图方式
Android中实现截图的方案集锦原创 2021-12-26 22:31:28 · 3686 阅读 · 0 评论 -
顺序显示多个弹窗方案-RxJava
项目中经常会遇到依次显示多个弹窗的情况,例如进入首页以后先弹出更新提示弹窗,关闭以后再弹出运营弹窗,然后弹出其他业务弹窗等等。常见的做法是嵌套调用:dialogA.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { //trigger B原创 2021-12-19 12:44:20 · 1538 阅读 · 0 评论 -
色度抠图之取色
最近做音视频项目中的色度抠图功能,用吸管进行当前帧取色,然后进行强度和阴影调节进行取色,具体效果可查看剪映的色度抠图功能。这篇文章就讲述了如何对视频当前帧的某个位置进行取色。首先需要获取视频对应的当前帧: /** * 获取当前帧对应的Bitmap * * @param clip 媒体片段对象 * @param position 当前位置 * @return */ private Bitmap getCurrentBitmap原创 2021-12-19 12:22:34 · 920 阅读 · 0 评论 -
android PendingIntent理解
public static void startActivityForService(Context context, MediaInfo mediaInfo) {Intent intent = new Intent(context, ScreenshotResultActivity.class);intent.putExtra(EXTRA_MEDIA_INFO, mediaInfo);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.add原创 2021-10-31 23:27:31 · 11409 阅读 · 1 评论 -
android绘图之Canvas和Bitmap结合
Rect和RectFMatrixCanvasBitmap原创 2021-10-31 12:11:01 · 5003 阅读 · 0 评论 -
Android离散选择控件
最近做项目中需要用到拖动条,并且拖动条只能在某些值之间,于是找了点资料。SeekBarSeekBar通过设置Widget.AppCompat.SeekBar.Discrete主题可以实现离散值选择。 <androidx.appcompat.widget.AppCompatSeekBar android:id="@+id/seekBar" style="@style/Widget.AppCompat.SeekBar.Discrete" andr原创 2021-10-23 12:45:14 · 1428 阅读 · 0 评论 -
Gson高级进阶用法
Gson是一个可以实现Java对象和json格式数据进行相互转换的Java库。dependencies { implementation 'com.google.code.gson:gson:2.8.6'}导火线最近项目需要做多语言,多语言由后台统一配置TypeAdapterFactoryTypeAdapterJsonDeserializerJsonSerializer...原创 2021-01-30 16:57:18 · 635 阅读 · 1 评论 -
数据库开发之Room
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。原创 2021-01-24 13:45:26 · 833 阅读 · 0 评论 -
OkHttp缓存使用
缓存可以不用每次请求时都去服务器拉取数据,可以快速响应数据,提升用户体验,并且还能节省流量。相关知识ETag资源的特定版本的标识符。在ETag和If-Match头部的帮助下,可以检测到"空中碰撞"的编辑冲突。客户端将ETag作为If-None-Match字段的值一起发送给服务器并与服务器当前版本的资源的ETag进行比较,如果两个值匹配(即资源未更改),客户端继续使用缓存,如果两个值不匹配,则表示资源有更新,客户端需要更新缓存的资源。ETag: W/"<etag_value>"‘W/’原创 2021-01-10 23:24:02 · 752 阅读 · 2 评论 -
安卓NDK开发入门手册
NDK是让开发者能在Android应用中使用C/C++代码的一套开发工具。运行效率高将C/C++源代码直接编译成机器码代码安全性好APK的Java层代码很容易被反编译,而C/C++库 反编译难度大跨平台用C/C++写得库可以方便在其他的嵌入式平台上再次使用核心概念本地共享库:以扩展名.so构建的库,在运行时是共享和动态链接的本地静态库:以扩展名.a构建的库,这类库实际上是在编译时静态链接的JNI:将Java中对native方法的调用引导到C/C++编写的本地库原创 2020-11-25 19:55:13 · 404 阅读 · 1 评论 -
理解FragmentTransaction#setMaxLifecycle方法
androidx中**Fragment#setUserVisibleHint(boolean)方法已经被淘汰了,取而代之的是FragmentTransaction#setMaxLifecycle(Fragment, Lifecycle.State)**方法,该方法可以直接干预Fragment生命周期执行。FragmentTransaction中方法setMaxLifecycle实现源码如下: @NonNull public FragmentTransaction setMaxLifecyc原创 2020-11-21 14:09:46 · 4196 阅读 · 1 评论 -
Android断点续传实践
最近公司项目要做断点续传,于是研究了一下。原创 2020-12-06 10:42:33 · 409 阅读 · 0 评论 -
探索Handler源码之等待任务执行
问题如何在子线程中通过主线程的Handler向主线程发布任务,然后等待主线程将任务处理完成以后再继续执行子线程?Handler#runWithScissorsHandler源码中提供了方法runWithScissors就是用来处理上面问题的,但是开发者无法调用,因为被标记为**@hide**了,但是实现方法可以借鉴。 public final boolean runWithScissors(@NonNull Runnable r, long timeout) { if (r == n原创 2020-11-14 15:09:40 · 495 阅读 · 0 评论 -
Android视图“挖孔”研究
本文来看看如何在视图上挖一个孔,让视图层下层的视图可以展示出来。核心方法clipRect(@NonNull RectF rect, @NonNull Region.Op op)clipRect(@NonNull Rect rect, @NonNull Region.Op op)clipRect(@NonNull Rect rect)clipOutRect(@NonNull Rect rect)clipPath(@NonNull Path path, @NonNull Region.Op op)原创 2020-11-09 21:11:23 · 1371 阅读 · 0 评论 -
Android图文居中显示控件
最近项目中用到了文字图标的按钮,需要居中显示,如果用TextView实现的方式,必须同时设置padding和drawablePadding。如下:<androidx.appcompat.widget.AppCompatTextView android:layout_width="200dp" android:layout_height="wrap_content" android:drawableLeft="@drawable/ic_xxx"原创 2020-09-03 20:30:37 · 361 阅读 · 0 评论 -
从任务栈理解Activity启动模式
启动模式允许定义Activity的新实例与当前任务的关联方式。可以通过两种方式定义不同的启动模式:使用AndroidManifest.xml文件:在清单文件中声明activity时,可以指定activity在启动时应如何与任务关联。使用Intent的flags:当调用startActivity()时,可以在Intent中包含一个标志,该标志声明新activity应如何(或是否)与当前任务关联。注意:清单文件可用的某些启动模式不可用作intent的标志,同样,某些启用模式可用作intent的标志,原创 2020-05-24 17:10:01 · 509 阅读 · 0 评论 -
Android实现H5与Native交互的几种方式
Android中使用控件WebView来承载展示H5,那么Java本地方法调用H5中的Js方法同样也要用到WebView对应的Api。Java本地方法调js通过WebView调用loadUrl(String)方法执行jsevaluateJavascript(String, ValueCallback)执行js,注意:此方法只支持android.os.Build.VERSION_CODES.N及以上利用JsBridge引用第三方库lzyzsd/JsBridgejs调用Java本地方法通过W原创 2020-05-24 17:07:44 · 781 阅读 · 0 评论 -
Android编程风格以及命名规范
编程风格代码中尽量不要出现中文。注释和除外。代码中通过strings.xml引用来显示中文控件声明放在activity级别,这样在activity其他地方可以使用不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突在一个View.OnClickListener中处理所有的点击事件逻辑,这样看起来很集中和直观strings.xml中使用%1$s等实现字符串的通配布局文件中的字体大小,都定义在dimens.xml中有关marg原创 2020-05-24 17:00:01 · 512 阅读 · 0 评论 -
Android开发个人笔记
这个笔记主要记录了开发中遇到的问题和解决方案,还有一些源码技巧。• ImageView方法setImageUri导致OOM获取到本地图片的Uri以后直接通过setImageUri导致了OutOfMemoryError分析: 使用setImageUri是直接对uri对应的图片进行加载的,如果图片过大,就会造成OOM解决: 使用Glide加载,或者对图片进行压缩处理后再设置• 一个HashCode的生成方法public class Actor { private final int i原创 2020-05-24 16:59:12 · 670 阅读 · 0 评论