安全风险 - 切换后台时背景模糊处理

因为安全风险中提到当app处于后台卡片状态时,显示的卡片页面应该为模糊效果,否则容易泄露用户隐私,尤其当前页涉及个人信息、资产信息等,都会造成信息泄露!基于这种场景,我研究了下这种业务下的模糊效果

找了半天,没有找到太现成的,只能自己动手写一写了,最后试了试,感觉效果凑乎,先用着吧

请添加图片描述

为了解决该安全风险,主要用到了 BlurView 三方框架

  • github地址 - BlurView(国内外)
  • gitcode地址 - BlurView(国内)

人生,哪有事事如意?

    • 框架介绍
    • 事前注意
      • AndroidX 兼容了吗?
      • View未加载完就设置 blurView 了?
      • 仓库引用不到?
    • 实践检验
      • 控件引入
      • 使用方式
        • 基础使用
        • 兼容使用
    • 有那么一刻想优化一下么?

框架介绍

如果想详细了解框架使用,及其源代码的话可以直接前往上方地址

Effect

在这里插入图片描述

Tip:不支持 SurfaceView, TextureView, VideoView, MapFragment, GLSurfaceView, etc 模糊

在这里插入图片描述

框架引入

 implementation 'com.github.Dimezis:BlurView:version-2.0.3'

视图引入

Tip:是处于BlurView的视图是不会被模糊的

  <eightbitlab.com.blurview.BlurView
      android:id="@+id/blurView"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      app:blurOverlayColor="@color/colorOverlay">

       <!--Any child View here, TabLayout for example. This View will NOT be blurred -->

  </eightbitlab.com.blurview.BlurView>

调用方式

    float radius = 20f;

    View decorView = getWindow().getDecorView();
    // ViewGroup you want to start blur from. Choose root as close to BlurView in hierarchy as possible.
    ViewGroup rootView = (ViewGroup) decorView.findViewById(android.R.id.content);
    
    // Optional:
    // Set drawable to draw in the beginning of each blurred frame.
    // Can be used in case your layout has a lot of transparent space and your content
    // gets a too low alpha value after blur is applied.
    Drawable windowBackground = decorView.getBackground();

    blurView.setupWith(rootView, new RenderScriptBlur(this)) // or RenderEffectBlur
           .setFrameClearDrawable(windowBackground) // Optional
           .setBlurRadius(radius)

关于这部分尚未使用,就不做解释了

在这里插入图片描述


事前注意

主要记录我在使用中遇到的问题

AndroidX 兼容了吗?

 android.useAndroidX=true

View未加载完就设置 blurView 了?

这个并是不必现问题,可能基本遇不到,仅做记录(该 rootView 可以使用xml中最外层布局控件)

    rootView.viewTreeObserver.addOnGlobalLayoutListener {
        blurView.setupWith(contextView, algorithm)
            .setFrameClearDrawable(background)
            .setBlurRadius(radius)//如不要需要,无需设置
    }

仓库引用不到?

如果你运气不错的话,直接引入框架可能就可以使用了,但是我运气可能不太好

 implementation 'com.github.Dimezis:BlurView:version-2.0.3'

根据介绍 JCenter 仓库已经关闭了,需要配置 jitpack

在这里插入图片描述

解决方式

repositories {
        maven { url 'https://jitpack.io' }
  }
allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

小课堂

我们常见的远程仓库主要有三种 JCentermavenCentraljitpack

  • JCenter:JCenter是JFrog公司提供的Android第三方库的仓库,JFrog公司宣布即将废弃该仓库,jcenter仓库是也曾经google默认推荐的第三方库。最早宣布废弃时,2022年2月后,将不可以下载上边的库,如果这些库的开发
    者不做库迁移,那么普通开发者将无法使用这些库,不过,好在最后JFrog公司可能和Google达成了什么协议,后续还能下载,但不能更新维护。目前Google推荐使用mavenCentral仓库。
  • mavenCentral:sonatype公司提供的第三方仓库,当时使用比较麻烦,审核也比较严格,比如你发布库的时候,库的包名,你必须要有这个域名的所有权,才能发布,不像jcenter谁先用,就归谁。目前Google推荐使用的第三方仓库。
  • jitpack (https://jitpack.io/):在jcenter废弃后,逐渐被用的越来越多,使用比较简单,适合个人开发者使用,缺点是不是Google官方推荐,使用时要手动添加maven依赖。

实践检验

可能是能力不足,解决小问题花了一些时间,所以建议大家保证已经解决了上述提到的注意点

build.gradle 引入框架

  implementation 'com.github.Dimezis:BlurView:version-2.0.3'

控件引入

关于这部分要了解视图层次的概念,感觉有以下几点需要特别注意一下

  • 最外层布局可以采用 FrameLayoutRelativeLayoutConstraintLayout,不然可能无法达到视图覆盖的效果
  • 模糊效果是 直接将模糊后的视图覆盖到原正常视图之上
  • 正常视图位于底层,从xml角度一般先写,模糊视图后写,可以参考栈结构

activity_main (引入BlurView

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/ic_launcher_background"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="60dp"
            android:gravity="center"
            android:textSize="20sp"
            android:text="放置正常视图,模糊后被覆盖"
            android:textColor="#333333" />

    </LinearLayout>

    <eightbitlab.com.blurview.BlurView
        android:id="@+id/blur_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:blurOverlayColor="#78ffffff">

        <!--        <LinearLayout-->
        <!--            android:layout_width="match_parent"-->
        <!--            android:layout_height="match_parent"-->
        <!--            android:orientation="vertical">-->

        <!--            <TextView-->
        <!--                android:layout_width="match_parent"-->
        <!--                android:layout_height="50dp"-->
        <!--                android:gravity="center"-->
        <!--                android:text="放置模糊后的正常视图,模糊后依旧正常显示"-->
        <!--                android:textColor="#333333" />-->
        <!--        </LinearLayout>-->

    </eightbitlab.com.blurview.BlurView>

</android.support.constraint.ConstraintLayout>

使用方式

关于 BlurView 所需 rootView

  • 可以采用 xml 内的最外层 ViewGroup
  • 也可以采用 WindowContentView
基础使用
package com.example.blurview

import android.os.Build
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.view.ViewGroup
import eightbitlab.com.blurview.BlurAlgorithm
import eightbitlab.com.blurview.BlurView
import eightbitlab.com.blurview.RenderEffectBlur
import eightbitlab.com.blurview.RenderScriptBlur


class MainActivity : AppCompatActivity() {

    private val blurView: BlurView by lazy {
        findViewById(R.id.blur_view)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val contextView = window.decorView.findViewById<ViewGroup>(android.R.id.content)
        blurView.setupWith(contextView, RenderScriptBlur(this@MainActivity))
    }

    override fun onPause() {
        super.onPause()
        blurView.visibility = View.VISIBLE
    }

    override fun onResume() {
        super.onResume()
        blurView.visibility = View.GONE
    }
}
兼容使用
  • 用到了 Window 相关的 DecorView 原理 (系统级)
  • RenderScriptBlur 过时,用到了 RenderEffectBlur(框架级)
package com.example.blurview

import android.os.Build
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.view.ViewGroup
import eightbitlab.com.blurview.BlurAlgorithm
import eightbitlab.com.blurview.BlurView
import eightbitlab.com.blurview.RenderEffectBlur
import eightbitlab.com.blurview.RenderScriptBlur


class MainActivity : AppCompatActivity() {

    private val blurView: BlurView by lazy {
        findViewById(R.id.blur_view)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val background = window.decorView.background
        val contextView = window.decorView.findViewById<ViewGroup>(android.R.id.content)
        val radius = 20f

        val algorithm: BlurAlgorithm = getBlurAlgorithm()
        blurView.setupWith(contextView, algorithm)
            .setFrameClearDrawable(background)
            .setBlurRadius(radius) //如不要需要,无需设置
    }

    override fun onPause() {
        super.onPause()
        blurView.visibility = View.VISIBLE
    }

    override fun onResume() {
        super.onResume()
        blurView.visibility = View.GONE
    }

    /**
    * 兼容处理
    * */
    private fun getBlurAlgorithm(): BlurAlgorithm {
        val algorithm: BlurAlgorithm = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            RenderEffectBlur()
        } else {
            RenderScriptBlur(this)
        }
        return algorithm
    }

}

有那么一刻想优化一下么?

我发现在后台切换卡片时,当卡片处于当前 position,好像会偶显正常视图,基于这点可以考虑同时兼容前后台监听来实现更好的效果

以前写过一篇 Android进阶之路 - 前后台切换监听,有兴趣的话可以去看下

随机找了一篇别人的伪代码,各位可以简单参考下

public class MainActivity extends AppCompatActivity {
 
    private boolean isForeground = false;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    @Override
    protected void onResume() {
        super.onResume();
        if (isForeground) {
            // 从后台进入前台,恢复界面状态和数据
            // TODO: 恢复界面状态和数据
        }
        isForeground = true;
    }
 
    @Override
    protected void onPause() {
        super.onPause();
        if (!isAppOnForeground()) {
            // 从前台进入后台,保存界面状态和数据
            // TODO: 保存界面状态和数据
        }
        isForeground = false;
    }
 
    /**
     * 判断当前应用是否处于前台
     */
    private boolean isAppOnForeground() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
        if (appProcesses == null) {
            return false;
        }
        String packageName = getPackageName();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }
        return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/652317.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像处理中的维度元素复制技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、维度元素复制的基本概念 三、如何实现维度元素复制 1. 方法介绍 2. 代码示…

方正国际金融事业部副总经理白冰受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 方正国际软件&#xff08;北京&#xff09;有限公司金融事业部副总经理白冰先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“浅析多项目管理的成功因素”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xf…

flinkcdc 3.0 源码学习之客户端flink-cdc-cli模块

注意 : 本文章是基于flinkcdc 3.0 版本写的 我们在前面的文章已经提到过,flinkcdc3.0版本分为4层,API接口层,Connect链接层,Composer同步任务构建层,Runtime运行时层,这篇文章会对API接口层进行一个探索.探索一下flink-cdc-cli模块,看看是如何将一个yaml配置文件转换成一个任务…

RK平台ADB不识别问题排查

简介 ADB是Android系统的调试工具&#xff0c;一般用USB线连接开发板和PC&#xff0c;可以抓取开发板的调试日志&#xff0c;执行shell指令&#xff0c;传输文件等功能。为了调试方便&#xff0c;RK平台的Linux系统也默认支持ADB&#xff0c;其源码是从Android移植过来的。 本…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例&#xff1a; 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例&#xff1a; 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

Diffusion Model 和 Stable Diffusion 详解

文章目录 Diffusion Model 基础生成模型DDPM概述向前扩散过程前向扩散的逐步过程前向扩散的整体过程 反向去噪过程网络结构训练和推理过程训练过程推理过程优化目标 详细数学推导数学基础向前扩散过程反向去噪过程 Stable Diffusion组成结构运行流程网络结构变分自编码器 (VAE)…

图形学初识--纹理采样和Wrap方式

文章目录 前言正文1、为什么需要纹理采样&#xff1f;2、什么是纹理采样&#xff1f;3、如何进行纹理采样&#xff1f;&#xff08;1&#xff09;假设绘制区域为矩形&#xff08;2&#xff09;假设绘制区域为三角形 4、什么是纹理的Wrap方式&#xff1f;5、有哪些纹理的Wrap方式…

Facebook之魅:数字社交的体验

在当今数字化时代&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;承载着数十亿用户的社交需求和期待。它不仅仅是一个简单的网站或应用程序&#xff0c;更是一个将世界各地的人们连接在一起的社交网络&#xff0c;为用户提供了丰富多彩、无与伦比的数字社交体验。…

云原生|为什么服务网格能够轻松重塑微服务?一文讲清楚!

目录 一、概述 二、 设计 三、服务网格 四、总结 一、概述 容器化技术与容器编排推动了微服务架构应用的演进&#xff0c;于是应用的扩展与微服务的数量日益增加&#xff0c;新的问题随之而来&#xff0c;监控服务的性能变得越来越困难&#xff0c;微服务与微服务之间相互通…

深度学习实战-yolox训练ExDark数据集所遇到的错误合集

跳转深度学习实战-yolox训练ExDark数据集(附全过程代码,超详细教程,无坑!) 一、 训练时出现ap为零 情况1.数据集没导进去 修改exps/example/yolox_voc/yolox_voc_s.py 当然由于image_sets只有一个元素因此修改yolox/data/datasets/voc.py 情况2.iou设置过高 修改yolo…

【全开源】在线题库微信小程序系统源码(ThinkPHP+FastAdmin+UniApp)

打造个性化学习平台 一、引言&#xff1a;在线学习的未来趋势 在数字化时代&#xff0c;线上学习已逐渐成为主流。随着移动互联网的普及&#xff0c;小程序以其轻便、快捷、无需安装的特点&#xff0c;成为用户日常学习的新选择。为了满足广大用户对于在线学习的需求&#xf…

深度学习模型在OCR中的可解释性问题与提升探讨

摘要&#xff1a; 随着深度学习技术在光学字符识别&#xff08;OCR&#xff09;领域的广泛应用&#xff0c;人们对深度学习模型的可解释性问题日益关注。本文将探讨OCR中深度学习模型的可解释性概念及其作用&#xff0c;以及如何提高可解释性&#xff0c;使其在实际应用中更可…

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄 出现以上问题的原因是因为系统账户无法操作数据库引擎服务。需要调整权限。 按照以下步骤解决&#xff0c;成功完成安装&#xff0c;已亲测&#xff1a; 1、如果您已经安装了相同版本的SQL Server&#xff0c;…

Net快速开发-创建和使用项目模板(多个项目(解决方案)打包)

1.从nuget安装模版包 下载安装官方模版 从 NuGet 包源安装 Microsoft.TemplateEngine.Authoring.Templates 模板。 从终端运行 dotnet new install Microsoft.TemplateEngine.Authoring.Templates 命令。2.创建模版 Microsoft.TemplateEngine.Authoring.Templates 包含可用于…

TiDB-从0到1-分布式事务

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCC 一、事务定义 这属于老生常谈了&#xff0c;无论不管是传统事务还是分布式事务都离不开ACID A&#xff1a;原子性C&#xff1a;一致性I&#xff1a;隔离性D&#xff1a;…

智能工厂:ThingsBoard网关在工业物联网中的桥梁作用

自动化及工业物联网 解放生产力的未来之路 在当今高度信息化的时代&#xff0c;工业自动化及工业物联网&#xff08;IIoT&#xff09;已成为工业制造领域的核心驱动力。随着人工智能、大数据和云计算等技术的持续发展&#xff0c;自动化及工业物联网正在以前所未有的速度改变…

shell脚本-函数

一、函数 1.函数的定义和格式 函数定义&#xff1a;封装的可重复利用的具有特定功能的代码 先定义函数&#xff0c;再调用函数&#xff0c;注意顺序 函数类似于命令的别名&#xff0c;别名一些简单的小命令 函数是某一个脚本的别名&#xff0c;有些脚本会重复使用 函数格…

音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解

文章目录 前言1.模拟数字转换&#xff08;ADC&#xff09;1.1ADC的关键步骤&#xff1a; 2.数字模拟转换&#xff08;DAC&#xff09;2.1DAC 的基本流程包括&#xff1a; 3.PCM数据3.1PCM 数据的关键要素包括&#xff1a; 4.WAV文件4.1 WAV的构成4.2WAV文件的标准块结构4.3WAV的…

浙江大学数据结构MOOC-课后习题-第六讲-图3 六度空间

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 心路历程 当我看到慕课上对这题的简介写的是&#xff1a; 不过实现起来还是颇有码量的&#xff0c;有时间就尝试一下。 我甚至在想要不要在距离图书馆闭馆仅2个小时的时候&#xff0c;挑战这道题&#x…

Linux: network: TCP: zero window size/window full 示例

最近遇到一个问题,当前机器的CPU使用率非常高,然后导致其中一个程序处理socket的数据过慢,然后出现下面的zero的示例。 下面是在接收buff用光的时候,发出的 TCP zeroWindows的消息 这种问题就是内存,CPU,网速之间的性能取舍。具体解决的话,需要看具体的需要是什么样的?…