安卓日常问题杂谈(一)

embedded/2025/1/24 22:44:09/

在这里插入图片描述

背景

关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓开发过程中遇到的小问题,能快速解决问题。

开发环境

androidstudio
win10+
gradle4+

本文涉及知识

WebView
微信开放平台
MPAndroidChart
Dialog
PhotoView
gsyVideoPlayer

主体内容

WebView

(1)安卓在使用webview的页面中,进入页面后,webview在初始化中无故滑动。

原因是webview焦点引起的问题。解决方法:在webview的父布局,加上一下属性:

android:descendantFocusability="blocksDescendants"

微信开放平台

(1)微信打开的网页中,点击跳转到安卓APP失效问题,解决方法:

先配置好安卓的微信sdk链接
PS:注意安卓11和安卓13的适配,这里的链接中有。
值得一提的是,如果项目是直接继承三方的wx页面,如友盟的WXCallbackActivity。这个时候我们开发代码的过程,就区别于官方文档了。如果单单是处理微信中的网页跳转到APP指定页面,核心代码如下图:

    @Overridepublic void onReq(BaseReq req) {LogUtil.d("onReq: " + req.getType());switch (req.getType()) {case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:break;case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:goToShowMsg((ShowMessageFromWX.Req) req);break;default:break;}super.onReq(req);}

从上面的代码中,可以看到,是直接重写onReq方法即可。这里我们在里面处理ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX这个指令就好了。至于sdk中 的extInfo怎样定义,得配合开发过程进行,不能一概而论。

MPAndroidChart(安卓图表库)

(1)折线图,初始化时,移动到指定的x,退出页面,内存泄漏

需要下载源码后,进行修改,修改方法如下:
(1-1)找到MoveViewJob类中的recycleInstance方法,增加下面的代码:

    public static void recycleInstance(MoveViewJob instance){instance.mViewPortHandler = null;instance.mTrans = null;instance.view = null;pool.recycle(instance);}

(1-2)在调用跳转的过程中,使用方法moveViewToX进行调用即可

(2)取消当前选中的标签

直接调用API

 chart.highlightValue(null)

Dialog

(1)通过定义基类的Dialog,进行封装生命周期,便于内存回收释放

很多业务中,都会用到dialog,有些甚至时在dialog里面做很多复杂的操作。
因此,业务中得到dialog的生命周期时非常重要,核心代码如下:

public abstract class BaseCustomDialog extends Dialog {public BaseCustomDialog(@NonNull Context context, int themeResId) {super(context, themeResId);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setOnShowListener(new OnShowListener() {@Overridepublic void onShow(DialogInterface dialog) {lifecycleStart();}});setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss(DialogInterface dialog) {lifecycleStop();}});}protected void initStyle() {try {Window window = getWindow();if (window != null) {window.getAttributes().windowAnimations = R.style.bottomShowAnimStyle;WindowManager.LayoutParams lp = window.getAttributes();lp.dimAmount = 0.1f; // 设置背景透明度(0.0完全透明,1.0完全不透明)window.setAttributes(lp);window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);window.setStatusBarColor(Color.TRANSPARENT); // 设置状态栏颜色window.setNavigationBarColor(Color.TRANSPARENT); // 设置状态栏颜色}} catch (Exception e) {e.printStackTrace();}}protected void initFullLayout(){getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT;getWindow().getAttributes().height = ViewGroup.LayoutParams.MATCH_PARENT;}protected void lifecycleStart() {}protected void lifecycleStop() {}}

上述代码,就是基类dialog的封装,对于子类调用,在方法lifecycleStart(),lifecycleStop()中进行内存的释放管理就可以了。

PhotoView(安卓图片预览控件)

(1)关于PhotoView初始化放大图片逻辑

这里要区分情况,看看你是放大width还是height。这里核心的要点,就是计算出放大的倍数,然后通过setScale方法,进行设计即可。核心代码如下:

 				ivFhrContent.setScaleLevels(scaleRate / 0.5 > 1 ? 1f : scaleRate / 0.5f, scaleRate, scaleRate * 2);ivFhrContent.setImageDrawable(resourceImage);LogUtil.d("scale: " + scaleRate);new Handler().postDelayed(() -> {ivFhrContent.setScale(scaleRate,0f,ivFhrContent.getHeight() / 2f,false);}, 0);

上述代码中,scaleRate就是放大的系数。

gsyVideoPlayer(安卓播放库)

(1)Https证书问题

核心代码如下:

        ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {@Overridepublic MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {//如果返回 null,就使用默认的return null;}/*** 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书* demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书* */@Overridepublic HttpDataSource.BaseFactory getHttpDataSourceFactory(String userAgent,@Nullable TransferListener listener,int connectTimeoutMillis, int readTimeoutMillis,boolean allowCrossProtocolRedirects) {//如果返回 null,就使用默认的return new GSYExoHttpDataSourceFactory(userAgent, listener,connectTimeoutMillis,readTimeoutMillis, true);}});

上述设置,可以接受重定向以及播放HTTPS数据


http://www.ppmy.cn/embedded/156680.html

相关文章

Vue Motion 应用场景详解

Vue Motion是Vue.js的动画库,能为Vue应用添加过渡和动画效果,使界面更具交互性与视觉吸引力。以下从安装、使用方法、关键特性三方面详解: • 安装:可通过npm或yarn安装。在项目目录下,npm安装使用npm install vue - …

基于先验领域知识的归纳式多实例多标签学习用于牙周病分类| 文献速递 -医学影像人工智能进展

Title 题目 Abductive multi-instance multi-label learning for periodontal diseaseclassification with prior domain knowledge 基于先验领域知识的归纳式多实例多标签学习用于牙周病分类 01 文献速递介绍 牙科疾病对口腔健康构成了重大挑战,影响了全球大量…

15.在 Vue 3 中使用 ECharts 实现河流图

前言 在前端开发中,数据可视化是一个非常重要的领域。ECharts 是一个由百度开源的功能强大的图表库,支持多种图表类型,能够满足各种数据可视化需求。本文将介绍如何在 Vue 3 中使用 ECharts 实现一个河流图(Theme River Chart&am…

kind部署k8s安装doris operator

环境为windows11,并开启wsl,使用应用商店的子系统 Ubuntu 20.04.6TLS 引用:Kubernetes教程(十五)---使用 kind 在本地快速部署一个 k8s集群 - Install docker Kind 使用 docker 来启动容器,因此需要先安装 docker,可…

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发,结合硬件如太赫兹源、平移台、锁相放大器等,实现了高效、精准的成像功能。系统采用蛇形扫描方式,通过动态调整扫描参数,达到优化成像质量的目的。 ​ 项目背景 在非…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4:习题5: 知识点 C的STL提供已经封装好的容器vector,也可叫做可变长的数组,vector底层就是自动扩容的顺序表,其中的增删查改已经封装好 创建 const int N30; vecto…

Spring Boot Starter探秘:全面了解 spring-boot-starter-web

前文《一分钟上手:如何创建你的第一个 SpringBoot Starter》中,我们介绍了如何创建你的第一个 Spring Boot Starter以及SpringBoot框架中常用的Starter,本文就来介绍下Spring Boot框架中最重要的starter之一,spring-boot-starter-…

IP-MS、CoIP-MS及AP-MS助力研究蛋白互作组学

蛋白质相互作用在机体的多种病理生理过程中扮演着至关重要的角色。绝大多数蛋白质分子需要通过与其他蛋白质的相互作用才能实现其生物学功能。因此,深入研究蛋白质相互作用组学对于阐明机体病理和生理过程的发生发展机制具有重要的科学意义。 目前,蛋白…