安全風險 - 切換后臺時背景模糊處理

因為安全風險中提到當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.pswp.cn/web/14974.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14974.shtml
英文地址,請注明出處:http://en.pswp.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 內部的操作&…

【OS】AUTOSAR Os是如何啟動第一個Task的

目錄 前言 正文 1.總體概覽及背景介紹 1.1. Os默認的Hook配置 1.2 用戶Task的配置

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 : […

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽

第八屆“英拿科技杯”上海高校金馬程序設計聯賽暨東華大學邀請賽 儀表盤所有提交榜單 I. 孤星 單點時限: 2.0 sec 內存限制: 512 MB &#x1d45b;(1≤103) 個干員&#xff0c;每個干員工資為 &#x1d464;&#x1d456;(1≤&#x1d464;&#x1d456;≤105)&#xff0c;貢獻…

JAVA云HIS醫院系統源碼 HIS源碼:云HIS系統與SaaS的關系

云HIS系統與SaaS的關系 云HIS系統是一種基于云計算技術的醫院信息系統&#xff0c;它采用B/S架構&#xff0c;通過云端SaaS服務的方式提供。用戶可以通過瀏覽器訪問云HIS系統&#xff0c;無需關注系統的部署、維護、升級等問題。云HIS系統通常具有模板化、配置化、智能化等特點…

react記錄部署

導語 React中的核心概念 1 虛擬DOM&#xff08;Virtual DOM&#xff09; 2 Diff算法&#xff08;虛擬DOM的加速器&#xff0c;提升React性能的法寶&#xff09; React主要的原理 Virtual DOM 虛擬DOM; 提供了一種不同的而又強大的方式來更新DOM&#xff0c; 代替直接的DOM操…

cuda11.8安裝torch2.0.1

pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pytorch.org/whl/cu118

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;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…

JS 手寫 節流throttle 防抖debounce函數

防抖debounce // 手寫防抖 function debounce(fn, delay 200) {// timer 在閉包中let timer null// 返回一個函數return function(...args) {if (timer) {clearTimeout(timer) // 清空上次的值}timer setTimeout(() > {fn.apply(this, args) // 透傳 this 和函數參數},…

【再探】設計模式—代理模式

代理是指授權代理人在一定范圍內代表其向第三方進行處理有關事務。 1 代理模式 需求&#xff1a;1&#xff09;將業務代碼與非業務代碼分離&#xff0c;在不改變代碼結構的基礎上&#xff0c;為其添加新的功能。2&#xff09;為系統中的某些操作做同一處理&#xff0c;例如進…

[實例] Unity Shader 逐像素漫反射與半蘭伯特光照

漫反射光照是Unity中最基本最簡單的光照模型&#xff0c;本篇將會介紹在片元著色器中實現反射效果&#xff0c;并會采用半蘭伯特光照技術對其進行改進。 1. 逐頂點光照與逐像素光照 在Unity Shader中&#xff0c;我們可以有兩個地方可以用來計算光照&#xff1a;在頂點著色器…

數據結構:帶頭雙向循環鏈表

目錄 前言 鏈表實現 1.定義節點 2.接口實現 1.開辟新節點 2.初始化 3.打印鏈表 4.添加節點 頭插 尾插 在pos位置之前增加節點 5.刪除節點 判空 頭刪 尾刪 刪除pos位置的節點 6.查找 7.釋放 前言 帶頭雙向循環鏈表的結構最復雜&#xff0c;一般用在單獨存儲數…

z3-加法器實驗

補碼器加減法&#xff0c;運算方法簡介 我們要知道什么是補碼的加法&#xff0c;我們為什么要用補碼的加法&#xff1f; 補碼的加法其實就是將兩個補碼形式的二進制數字直接相加&#xff0c;處理的時候忽略超出固定位數的進位。補碼的加法運算和無符號二進制數的加法操作一樣&…