开发中遇到截取屏幕,但是还要从截图中排除特定View的图像,或者有些业务截图无法通过api截取到(比如WebGL渲染的游戏),因此不能简单的调用系统截图API,或者在截图时隐藏特定的View(那也太low了)。因此我开发了个自定义截图的功能,主要分以下几个步骤:
阅读更多Tips
AOS中使用远程9-patch图
业务开发中会偶尔遇到使用远程9-patch图的情况。具体操作:
1、本地创建9-patch图
可以在工程的debug/res/的drawable目录中创建
2、使用aapt编译创建好的9-path图
例如编译某个目录:
aapt c -v -S ../app/src/debug/res/drawable-xxhdpi/ -C out
亦可使用 “aapt s ”命令编译单个文件
3、上传到服务端
将编译好的文件上传至服务器
4、客户端下载展示
最核心的是要判断Bitmap是否是9-patch图:
private void callbackBitmap(Bitmap resource) {
try {
//读取9-patch信息
byte[] ninePatchChunk = resource.getNinePatchChunk();
if (DEBUG) {
boolean isNinePatchChunk = false;
if (ninePatchChunk != null) {
isNinePatchChunk = NinePatch.isNinePatchChunk(ninePatchChunk);
}
Log.i(TAG, "fetch.onSuccess: ninePatchChunk = " + ninePatchChunk + ", isNinePatchChunk = " + isNinePatchChunk);
}
//判断是否是9-patch图
if (ninePatchChunk != null && NinePatch.isNinePatchChunk(ninePatchChunk)) {
NinePatchDrawable ninePatchDrawable = new NinePatchDrawable(resource, ninePatchChunk, new Rect(), null);
if (mLoadCallback != null) {
mLoadCallback.onDrawableReady(ninePatchDrawable);
}
} else {
showAsDefaultBitmap(resource);
}
} catch (Throwable e) {
showAsDefaultBitmap(resource);
}
}
完整文件:https://github.com/gongshoudao/Remote-9-patch/blob/main/NinePatchHelper.java
直播间超复杂布局,用包含关系实现布局文件的“继承”
最近开始准备找工作,打算把之前做的一些重构、优化相关的东西整理整理。
MeMe Live的直播间以前在运行时,有高达2000多个View,非常庞大、臃肿,维护起来及其空难,很容易牵一发而动全身,新招进来的同学很难驾驭。于是对它进行了重构。顺便说一句,以前的布局是用的RelativeLayout,性能差不说,还很不灵活。重构时将其改成了ConstraintLayout,每一个相关的View都得转换,每一个在Java代码中硬编码调整属性的控件都得找出来,改掉。工程量和困难度可想而知,索性最后坚持坐下来了。收获不少,对团队开发效率也提升不少。
阅读更多关于QUERY_ALL_PACKAGES权限问题
Android11之后,resolveActivity、查询某个APP是否已安装等需要特殊处理。
要么加QUERY_ALL_PACKAGES权限,要么就在清单文件中使用<queries>标签。
由于Google Play的政策:
如果您的应用不需要使用 QUERY_ALL_PACKAGES 权限,请从您的应用清单中移除该权限。如果应用需要此权限,您现在可以在 Play 管理中心内提交声明表单。
您需要提供:
1.对需要此权限的应用核心功能的说明
2.展示需要此权限的应用核心功能的短视频
如需了解您在该表单中将需要回答哪些问题以便做好准备,请参阅这篇帮助中心文章。
自 7 月 12 日起,如果缺少此声明,您将无法提交新应用和应用更新。请您务必在 7 月 12 日之前提交此声明,或者从您的应用清单中移除该权限。从 7 月 12 日起,对于不符合政策要求或未提交此声明表单的应用,我们可能会将其从 Google Play 下架。
感谢您一直以来与我们通力合作,共同努力让 Google Play 成为值得您和用户信赖的可靠平台。
阅读更多
Retrofit+OkHttp+RxJava运行时修改POST请求的URL
在使用Retrofit时,如果我们想变更某个请求的URL,GET请求的话,可以使用@Url 注解,但如果是POST请求,是不能直接这么干的。
我的做法是在Retrofit.create(XXXX.class)之前,给OkHttp添加拦截器,拦截器识别请求header中是否带着我们预先自定义的参数。在请求发起时header中增加key:NEW_HOST_URL,value为将于替换的新地址。
拦截器的代码如下:
阅读更多在Java代码中移除ConstraintLayout的layout_constraintHeight_percent或layout_constraintWidth_percent属性
有写场景需要在Java代码中移除xml中配置的百分比属性,如:
app:layout_constraintHeight_percent="0.3" app:layout_constraintWidth_percent="0.722"
在Java中移除以百分比属性的具体操作:
if (lp instanceof ConstraintLayout.LayoutParams) { ((ConstraintLayout.LayoutParams) lp).matchConstraintPercentHeight = 1f; ((ConstraintLayout.LayoutParams) lp).matchConstraintDefaultHeight = 0;/*spread 默认的,非percent*/ }阅读更多
Android布局切圆角
通常,要想使布局文件以圆角方式显示,最简便的方式是通过CardView
进行包装。但是CardView
设置圆角后四个角都是同样的弧度,有时候我们接到的需求是指给其中某些角指定圆角,或者给每个角指定不同的弧度,CardView
就无法满足了。
RecyclerView限制最大高度或宽度
在日常开发中,想直接通过android:maxHeight
或android:maxWidth
在布局文件中限制RecyclerView的最大高度宽度,是无法实现的。通过自定义RecyclerView,覆盖onMeasure
方法。在onMeasure
方法内部,当发现自身高度或宽度超过限制的最大高度或宽度,则手动将宽或高设置为期望的最大宽或搞。具体代码实现如下:
阿拉伯字母与LTR书写语系混排奔溃问题
这周印度那边的同事在钉钉群里反馈说,有主播的APP会在某个用户进直播间发了一串神秘消息后奔溃,而且这个用户知道这个方法就一直捣乱,管理员将这些用户的号封了,他有注册新的账号继续搞,扰乱直播秩序。-_-|| 阅读更多
获取SD卡路径——完美解决
写在最前面:
(这篇文章写于三年多以前,由于域名备案、服务器到期等问题,以前的文章没备份,都丢失了。现重新将它搬回来。)由于公司的项目里有个视频下载的功能,而且这个是产品比较重要的功能。但是,由于众所周知的原因,通过传统方式获取的SD卡路径,在不同厂商的设备上都不准确,可能SD卡和内存存储介质倒置了,也可能获取出来的路径无法读写。就算是相同厂商不同的产品,获取出来的SD卡路径和内置存储路径都是五花八门。
网上到处找资料,还是没法完全解决上述问题,连有些主流的机型都无法覆
盖。经过一段时间探索,算是解决了问题。 阅读更多
Android7.0以上图片裁剪问题
0.系统权限更改
为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问(0700)。此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。此权限更改有多重副作用: 阅读更多