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

news2024/11/25 2:55:24

因为安全风险中提到当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;
    }
}

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

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

相关文章

[JAVASE] 类和对象(三) - 继承

目录 一. 继承的定义 1.1 基本概念 1.2 基本实现 二. 父类 和 子类中的成员访问 2.0 super 与 this 关键字 2.1 访问成员变量 2.2 访问成员方法 三. 父类 和 子类中的构造方法 3.1 访问父类中的构造方法 3.2 注意事项 四. 权限修饰限定符 public: protected: default: …

Spring系列-03-BeanFactory和Application接口和相关实现

BeanFactory BeanFactory和它的子接口们 BeanFactory 接口的所有子接口, 如下图 BeanFactory(根容器)-掌握 BeanFactory是根容器 The root interface for accessing a Spring bean container. This is the basic client view of a bean container; further interfaces such …

GD32F103RCT6/GD32F303RCT6-UCOSIII底层移植(4)消息队列实验

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…

【LeetCode算法】第58题:最后一个单词的长度

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路&#xff1a;双指针法。low指向单词头&#xff0c;high指向单词后的空格&#xff0c;则high-low就是每个单词的长度。算法步骤&#xff1a;①low从头往后查找第一个非空格的字符&…

分割文本文件

分割一个.txt文件&#xff0c;可以选择在命令行中使用split指令&#xff0c;或者编写一段脚本进行操作。以下是一个简单的Python脚本来分割文本文件&#xff1a; def split_file(file, lines):# Open source filewith open(file, r) as source:count 0atEOF Falsewhile not …

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹&#xff0c;那么怎么获取批量文件夹的名字呢&#xff1f; 一、啊这&#xff0c;这真是一个好问题二、这个得用Python&#xff08;文本末尾有打包程序&#xff0c;点击链接运行就可以了&#xff09;&#xff08;1&#xff09;首先建立一个py文件&a…

Python 将文件夹中的图片信息导入到 Excel 的表格

引言 在数据处理和管理的日常任务中&#xff0c;经常需要将文件夹中的图片文件信息&#xff08;如文件名、路径、创建日期、大小、分辨率等&#xff09;整理成一个 Excel 表格。这篇博客将介绍如何使用 Python 中的 wxPython 模块创建一个 GUI 应用&#xff0c;用户可以通过这…

jmeter保存测试计划报错——Couldn‘t save test plan to file:

jmeter保存测试计划报错——Couldnt save test plan to file:。。。。。拒绝访问 一、问题描述二、分析三、结果 一、问题描述 Couldn’t save test plan to file:D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx D:\Program Files\apache-jmeter-5.6.2\bin\线程组.jmx(…

2024电工杯A题完整代码论文分析

2024年电工杯数学建模竞赛A题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…

【Mac】电脑任何来源无法打开的问题解决办法

前言 有小伙伴在安装本站软件过程中&#xff0c;遇到过运行脚本1提示 sudo: /etc/sudoers is world writable的问题&#xff0c;其实就是电脑任何来源无法打开。今天就来说一下解决办法。 问题现象 电脑运行「脚本1」时提示&#xff1a; // 错误内容sudo: /etc/sudoers is w…

Navicat 连接 OceanBase 快速入门 | 社区版

Navicat Premium&#xff08;16.1.9或更高版本&#xff09;正式支持 OceanBase全线数据库产品。OceanBase为现代数据架构打造的开源分布式数据库。兼容 MySQL 的单机分布式一体化国产开源数据库&#xff0c;具有原生分布式架构&#xff0c;支持金融级高可用、透明水平扩展、分布…

KVM虚拟化基础

一、虚拟化基础 1.传统物理机部署方案 IDC机房优点&#xff1a; IDC机房是分布式的&#xff0c;是全国连锁的。我们将物理服务器部署到IDC机房&#xff0c;由IDC机房帮我们上架服务&#xff0c;管理其内部的网络以及路由转发、服务器资源的分发&#xff1b;而且IDC机房带宽接…

加入MongoDB AI创新者计划,携手MongoDB共同开创AI新纪元

加入MongoDB AI创新者计划&#xff01; MongoDB对AI创新和初创企业的支持既全面又广泛&#xff01;无论您是领先的AI初创企业还是刚刚起步&#xff0c;MongoDB Atlas都是支持您愿景的最佳平台。 AI 初创者计划The AI Startup Track AI初创者计划为早期初创企业提供专属福利&…

顺序表及其应用

掌握顺序表的初始化&#xff0c;初始化、查找、插入、删除、遍历、查看实际长度等操作 内容 从键盘输入n个整数&#xff0c;创建顺序表。【创建长度为n的顺序表】从键盘输入1个整数x&#xff0c;在顺序表中查找x所在的位置。若找到&#xff0c;输出该元素所在的位置(即数组下标…

YOLOV10实时端到端目标检测

代码地址&#xff1a;GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection 论文地址&#xff1a;https://arxiv.org/pdf/2405.14458 本文介绍了YOLO系列目标检测器在实时和高效方面的优势&#xff0c;但是仍然存在一些缺陷&#xff0c;包括依赖非极大值…

【Linux】icmp_seq=1 Destination Host Unreachable

执行ping 命令提示&#xff1a;From 192.168.XX.XX icmp_seq1 Destination Host Unreachable 这个错误消息通常表示以下几种情况之一&#xff1a; 网络连接问题&#xff1a;目标主机可能没有连接到网络&#xff0c;或者网络中的某个路由器无法将数据包转发到目标主机。 目标主…

08.1.jenkins安装方法

安装 配置官方下载源 #配置jenkins源 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key下载jak、jenkins服务 #下载jdk11环境&#xff0c;并且配置yu…

软考之信息系统管理知识点(3)

流水线&#xff1a;是指在程序执行时多条指令重叠进行操作的一种准并行处理实现技术。各种部件同时处理是针对不同指令而言的&#xff0c;它们可同时为多条指令的不同部分进行工作&#xff0c;以提高各部件的利用率和指令的平均执行速度。 编译得过程 关系数据库是表的集合 …

基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 .......................................................... for i 1:12 % 遍历结…

声量 2024 | 从小到大,有哪些好产品曾出现在我们生活里?

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 老段 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦 产品统筹 / bobo 场地支持 / 阿那亚 联合制作 / 声量The Power of Voice 特别鸣谢 / 深夜谈谈播客网络 本期节目录制于第二届「声量The Power of Voice」现场。 在…