文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

防止Android截屏

2023-09-08 11:24

关注

一、背景介绍

对于涉及用户个人隐私的应用,比如银行、支付、社交等应用,其界面中可能会涉及到用户的个人信息,比如手机号、身份证号码、交易记录等。如果这些信息被人截屏,就可能会造成用户个人隐私的泄露。
另外一方面,一些企业和开发者可能会开发一些自己的知识产权应用,比如游戏、新闻客户端、电商应用等,这些应用中可能会包含大量独有的内容和资料,如果被人截屏,就可能会遭受知识产权侵犯。

二、Android系统中禁止截屏的实现方式

1. 使用FLAG_SECURE属性

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //禁止当前页面截屏        getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);        setContentView(R.layout.activity_main2);    }

2. 使用SurfaceView

在Android系统中,SurfaceView是一种可以在应用中显示图像和视频的组件。而且,SurfaceView还拥有一个特性,即可以禁止截屏。具体操作是在创建SurfaceView时,使用setSecure()方法来设置:

SurfaceView.setSecure(true);

三、实现示例

以下示例为在Activity中使用FLAG_SECURE属性实现禁止截屏:

public class SampleActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);        setContentView(R.layout.activity_main);    }}

以下示例为在SurfaceView中使用setSecure()方法实现禁止截屏:

public class SampleSurfaceView extends SurfaceView implements SurfaceHolder.Callback {        public SampleSurfaceView(Context context, AttributeSet attrs) {        super(context, attrs);        getHolder().addCallback(this);        setZOrderOnTop(true);        setSecure(true);    // 禁止截屏    }    @Override    public void surfaceCreated(SurfaceHolder holder) {        // todo something    }    @Override    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {        // todo something    }    @Override    public void surfaceDestroyed(SurfaceHolder holder) {        // todo something    }}

四 注意事项

(1)禁止截屏并不等于防抄袭,用户仍然可以通过从另一个手机或者相机拍照等方式来获取屏幕上的内容;

(2)禁止截屏可能会对应用性能产生一定的影响,使用时需斟酌权衡;

(3)禁止截屏只能阻止截屏,无法阻止用户通过拍照、录屏等其他方式获取屏幕上的信息,因此需要在业务场景中进行综合考虑,综合选用多种安全措施。
(4)在某些设备上使用WindowManager.LayoutParams.FLAG_SECURE时要小心(在Samsung Galaxy ACE上进行了验证,例如GT-S5830),这将使视图混乱。看起来像是三星特有的错误。建议以下内容:

if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {    getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);}

来源地址:https://blog.csdn.net/heishuai123/article/details/131058181

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯