Android实现多任务高斯模糊

Android实现多任务列表高斯模糊

某些隐私性较强的app会加单独的应用锁,为了防止在多任务窗口泄露用户信息,在用户切换到多任务窗口时需要对应用进行高斯模糊处理,防止用户信息泄露。

1.对当前Activity进行截图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/***
* 截取当前activity
* @param activity
* @return
*/
public static Bitmap activityShot(Activity activity) {
/*获取windows中最顶层的view*/
View view = activity.getWindow().getDecorView();

//允许当前窗口保存缓存信息
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();

//获取状态栏高度
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int statusBarHeight = rect.top;

WindowManager windowManager = activity.getWindowManager();

//获取屏幕宽和高
DisplayMetrics outMetrics = new DisplayMetrics();
windowManager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;

//去掉状态栏
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache(), 0, statusBarHeight, width,
height - statusBarHeight);

//销毁缓存信息
view.destroyDrawingCache();
view.setDrawingCacheEnabled(false);


return bitmap;
}

2.对截图进行高斯模糊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public static Bitmap rsBlur(Context context, Bitmap source, int radius){
Bitmap inputBmp = source;
//(1)
//初始化一个RenderScript Context
RenderScript renderScript = RenderScript.create(context);

// Allocate memory for Renderscript to work with
//(2)
//创建输入输出的allocation
final Allocation input = Allocation.createFromBitmap(renderScript,inputBmp);
final Allocation output = Allocation.createTyped(renderScript,input.getType());
//(3)
// Load up an instance of the specific script that we want to use.
//创建ScriptIntrinsic
ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
//(4)
//填充数据
scriptIntrinsicBlur.setInput(input);
//(5)
// Set the blur radius
//设置模糊半径
scriptIntrinsicBlur.setRadius(radius);
//(6)
// Start the ScriptIntrinisicBlur
//启动内核
scriptIntrinsicBlur.forEach(output);
//(7)
// Copy the output to the blurred bitmap
//copy数据
output.copyTo(inputBmp);
//(8)
//销毁renderScript
renderScript.destroy();
return inputBmp;

}

3.监听多任务按键事件

可以通过广播的方式监听多任务按键事件,需要注意在销毁时unregister

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class DeviceKeyMonitor {

/**
* 参数
*/
private static final String SYSTEM_REASON = "reason";
private static final String SYSTEM_HOME_RECENT_APPS = "recentapps";

private Context mContext;
private BroadcastReceiver mDeviceKeyReceiver = null;
private OnKeyListener mListener;


public DeviceKeyMonitor (Context context, final OnKeyListener listener) {
mContext = context;
mListener = listener;
mDeviceKeyReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action=intent.getAction();
if(!TextUtils.isEmpty(action)){

if (intent.getAction().equals(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)) {
String reason = intent.getStringExtra(SYSTEM_REASON);

if (reason == null)
return;

// 最近任务列表键
if (reason.equals(SYSTEM_HOME_RECENT_APPS)) {
mListener.onRecentClick();

}
}
}
}
};
mContext.registerReceiver(mDeviceKeyReceiver, new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
}

public interface OnKeyListener{
void onRecentClick();//多任务键监听
}

public void unregister(){
if (mDeviceKeyReceiver != null){
mContext.unregisterReceiver(mDeviceKeyReceiver);
mDeviceKeyReceiver = null;

}
}

}

4.实现OnKeyListener接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

@Override
public void onRecentClick() {
Toast.makeText(this,"按了多任务键",Toast.LENGTH_LONG).show();
group = (ViewGroup) this.getWindow().getDecorView();
group.removeView(imageView);
// 创建imageview
imageView = new ImageView(this);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
imageView.setLayoutParams(params);

// 截图,并将图片高斯模糊处理
Bitmap bitmap=PicUtil.rsBlur(GaussianBlurActivity.this,PicUtil.activityShot(GaussianBlurActivity.this),20);
// 将处理后的图片填充到imageview
imageView.setImageBitmap(bitmap);
group.addView(imageView);

}

最后

实例化DeviceKeyMonitor类即可监听多任务事件,注意进行解绑。

注意:只是监听多任务按钮有时并不能达到想要的效果,比如使用app时点击通知栏切换到其它app,这时再切换到多任务栏时,app并没有实现高斯模糊效果,此时可以在onPause方法中调用OnRecentClick中的实现。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×