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

因为安全风险中提到当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.BlurViewandroid: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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/ic_launcher_background"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="60dp"android:gravity="center"android:textSize="20sp"android:text="放置正常视图,模糊后被覆盖"android:textColor="#333333" /></LinearLayout><eightbitlab.com.blurview.BlurViewandroid: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.blurviewimport 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.RenderScriptBlurclass 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.blurviewimport 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.RenderScriptBlurclass 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.backgroundval contextView = window.decorView.findViewById<ViewGroup>(android.R.id.content)val radius = 20fval 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onResume() {super.onResume();if (isForeground) {// 从后台进入前台,恢复界面状态和数据// TODO: 恢复界面状态和数据}isForeground = true;}@Overrideprotected 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;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

普通函数的参数中的auto

2.1 普通函数的参数中的auto 从c14起&#xff0c;lambda可以使用auto占位符声明或者定义参数: auto printColl [] (const auto& coll) // generic lambda{ for (const auto& elem : coll) {std::cout << elem << \n;}} 只要支持Lambda 内部的操作&…

Golang创建文件夹

方法 package zdpgo_fileimport ("os" )// AddDir 创建文件夹 func AddDir(dir string) error {if !IsExist(dir) {return os.MkdirAll(dir, os.ModePerm)}return nil }测试 package zdpgo_fileimport "testing"func TestAddDir(t *testing.T) {data : […

JAVA云HIS医院系统源码 HIS源码:云HIS系统与SaaS的关系

云HIS系统与SaaS的关系 云HIS系统是一种基于云计算技术的医院信息系统&#xff0c;它采用B/S架构&#xff0c;通过云端SaaS服务的方式提供。用户可以通过浏览器访问云HIS系统&#xff0c;无需关注系统的部署、维护、升级等问题。云HIS系统通常具有模板化、配置化、智能化等特点…

hot100 -- 回溯(上)

目录 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;电话号码的字母组合 AC DFS &#x1f33c;组合总和 AC DFS &#x1f35e;科普 忘记 dfs 的&#xff0c;先看看这个&#x1f447; DFS&#xff08;深度优先搜索&#xf…

百度软件测试面试经历,期望薪资27K

一面 1、 请为百度搜索框设计测试用例&#xff1f; 2、百度设计框上线前需要进行那些测试&#xff1f; 界面测试&#xff0c;功能测试&#xff0c;性能测试&#xff0c;安全性测试&#xff0c;易用性测试&#xff0c;兼容性测试&#xff0c;UI测试。 3、如何查看http状态码…

重学java 38.创建线程的方式⭐

It is during our darkest moments that we must focus to see the light —— 24.5.24 一、第一种方式_继承extends Thread方法 1.定义一个类,继承Thread 2.重写run方法,在run方法中设置线程任务(所谓的线程任务指的是此线程要干的具体的事儿,具体执行的代码) 3.创建自定义线程…

基于灰狼优化算法优化支持向量机(GWO-SVM)回归预测

代码原理 基于灰狼优化算法优化支持向量机&#xff08;GWO-SVM&#xff09;的回归预测代码的原理和流程如下&#xff1a; 1. **初始化灰狼群体**&#xff1a;随机生成一定数量的灰狼&#xff0c;并初始化它们的位置和速度。 2. **初始化SVM模型参数**&#xff1a;根据问题要…

【JAVA基础之网络编程】UDP和TCP协议以及三次握手和四次挥手的过程

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1. 网络编程 1.1 概述 1.2 网络编程的三要素 1.2.1 IP地址 1.2.2 InetAddress 1.2.3 端口和协议 1.3 UDP协议 1.3.1 UDP发送数据 1.3.2 UDP接收数据 1.4…

C语言——小知识和小细节18

一、力扣题目 1、题目本体 2、题解 本题目我们使用异或分组的方法来解决。可以在我之前的文章《C语言——操作符CSDN博客》中看一下异或的特点。 由于异或的运算规则为相同为0&#xff0c;不同为1&#xff0c;而且是在二进制补码上进行操作的&#xff0c;我们可以发现的一个…

c++|多态

c|多态 1 多态的概念2 多态的定义及其实现2.1 满足多态的条件2.2 虚函数2.3 虚函数的重写2.4 析构函数适合加virtural吗2.4 C11 override 和 final2.5 三个概念的对比 3 多态的原理4 抽象类4.1 概念4.2 纯虚函数 1 多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是…

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求&#xff1a;1&#xff09;将业务代码与非业务代码分离&#xff0c;在不改变代码结构的基础上&#xff0c;为其添加新的功能。2&#xff09;为系统中的某些操作做同一处理&#xff0c;例如进…

[实例] Unity Shader 逐像素漫反射与半兰伯特光照

漫反射光照是Unity中最基本最简单的光照模型&#xff0c;本篇将会介绍在片元着色器中实现反射效果&#xff0c;并会采用半兰伯特光照技术对其进行改进。 1. 逐顶点光照与逐像素光照 在Unity Shader中&#xff0c;我们可以有两个地方可以用来计算光照&#xff1a;在顶点着色器…

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…

【最新区块链论文录用资讯】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;网络与信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系统的有效…

基于python的网页自动刷新工具

1.下载webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下载Edge的浏览器驱动 2.安装selenium pip install selenium4.11.1 3.写代码 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 实现平移和缩放 彻悟版

背景 之前写了一篇关于set_part 的文章 &#xff0c;确实也实现了平移和缩放。平移是对的&#xff0c;但是缩放其实有畸变。这个问题一直都困扰着我&#xff0c;知道昨天连续测试了好几个小时&#xff0c;直到晚上11点终于完美解决。 坐标和高宽 坐标 再讲set_part 之前&am…

免费撸gpt-4o和各种大模型实用经验分享

项目 Github: https://github.com/MartialBE/one-api 先贴两张图&#xff1a; 说明 免费撸AI大模型,各位可以对照下面我给出的大模型记录表来填&#xff0c;key需要自己去拿&#xff0c;国内都需要手机号验证&#xff0c;如果你不介意。另外我在自己的博客放出免费API给大家…

模型评价指标笔记:混淆矩阵+F1+PR曲线+mAP

评价指标 二分类评价指标 混淆矩阵 TP: 正确预测为了正样本&#xff0c;原来也是正样本 FN: 错误的预测为负样本&#xff0c;原来是正样本 (漏报&#xff0c;没有找到正确匹配的数目) FP: 错误的预测为正样本&#xff0c;原来是负样本 (误报&#xff0c;没有的匹配不正确) TN…

CIM模型

CIM 是 Esri 制图信息模型。 它是一个地图内容规范,用于记录在保存、读取、引用或打开时如何永久保留描述不同项目组件的信息。 该规范以 JSON 表示,适用于 ArcGIS 应用程序和 API 中的地图、场景、布局、图层、符号和样式。 CIM 不仅限于制图设置。 要了解属性的组织方式以及…

【Tools】SpringBoot工程中,对于时间属性从后端返回到前端的格式问题

Catalog 时间属性格式问题一、需求二、怎么使用 时间属性格式问题 一、需求 对于表中时间字段&#xff0c;后端创建对应的实体类的时间属性需要设定格式&#xff08;默认的格式不方便阅读&#xff09;&#xff0c;再返回给前端。 二、怎么使用 导入jackson相关的坐标&#x…