防止Android截屏

一、背景介绍

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

二、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);
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值