由来:

最近项目要接入各种支付,其中一个是银联支付。于是开始捣鼓,之前也没接入过,只是做过微信和支付宝。
下载银联的SDK、Demo、文档等等若干东西开始啃,一打开文档,发现100多页。。。于是瞬间就不想看了,随便翻了翻,全都是方案规范什么的,头都大了,于是开始捣鼓SDK和Demo。
老样子,先把Demo跑起来(此处省略若干字)。

跑起来后的银联demo首页如图所示:

好了现在开始测试一波,使用银联提供的测试卡号和手机号以及验证码,开始付款,上截图:

WTF??(黑人问号),为何AS的截图一直菊花,进不去截图界面?估计是ADB歇菜了吧(自从AS2.2正式版+Sieera正式版)发布后,adb一直有问题。好吧我重启AS

。。。还是不行,一直菊花!
好吧,我用手机自带的截图:

无法进行屏幕截图,原因可能是存储空间不足,或者该应用或您所属的单位不允许执行此操作。

黑人问号??这是什么鬼,还能这样?

开始探究

对!前面说了这么多废话,就是为了给这个东西做铺垫。

开始分析一波:这东西在银联Demo里存在,首页上面已经截图了,证明没问题,有问题的是开始支付之后的所有界面,开始猜测:因为支付涉及到的东西比较复杂,尤其是隐私和安全性,所以这些东西一般都是被封装起来的,对外提供为混淆后的jar包。

去验证一波,先找到Demo中支付的按钮所触发的动作:

public class JARActivity extends BaseActivity {    @Override    public void doStartUnionPayPlugin(Activity activity, String tn, String mode) {        UPPayAssistEx.startPay(activity, null, null, tn, mode);    }    //省略部分代码...
}

可以看到,发起支付之后,到了UPPayAssistEx.startPay()方法去了,而这个方法正好是在SDK的jar包内。

也就是说导致我们没法截屏的代码在SDK中,有可能是C层面控制的(毕竟有so),也有可能是Android自己控制的,提供了API。

C层面的不好找,所以先看看是否是Android的API吧。

组织我们截屏,也就是说在xxxActivity下,我们没办法获得这个Activity的“信息”,所以先去看看支付的Activity是怎么写的吧。

这里要祭出神器了:TopActivity.apk

我从事Android开发一年,这个东西也伴随了我一年,他可以获取当前运行的apk的Activity名字以及包名,这个app被作者开源在了Github

祭出诛仙剑之后,开始尝试寻找支付界面的类名和包名(快看左上角快看左上角):

可以看到,包名是com.unionpay.uppay,Activity名字是PayActivity。
OK,有了这些信息,开始去SDK中寻找:

public final class PayActivity extends BaseActivity {    private b c = null;    private f d = null;   private n e;    public static String a;   private k f = null;   public PayActivity() {}    public final void onCreate(Bundle var1) {        super.onCreate(var1);    }//省略部分代码...
}

找到了这个支付界面的Activity,一般来说要对窗口进行操作,需要在 onCreate() 中,但是这个Activity的onCreate()是调用父类的方法。其实也很正常,毕竟是有个基类的Activity,所以我们看看BaseActivity:

public abstract class BaseActivity extends Activity implements com.unionpay.mobile.android.plugin.a, b {    //省略部分代码...public void onCreate(Bundle var1) { //省略部分代码...       UPAgent.LOG_ON = false;this.requestWindowFeature(1);super.onCreate(var1);this.c = (l)this.a(1, (e)null);this.setContentView(this.c);this.getWindow().addFlags(8192);++f;//省略部分代码...}
//省略部分代码...
}

好了,这个就是银联支付所有Activity的父类了,毕竟继承了Activity。
分析下有没有什么有用的线索:

发现一个东西:this.getWindow().addFlags(8192);。这个和我们之前的假设差不多,因为Activity和window有极大的关系,很多操作都要依靠getWindow()来进行,比如去掉标题栏之类的。那么这个8912是什么鬼?

Android中的这种系统常量一般都是16进制的,所以我们把这个8192转换成16进制看看是多少:

0x2000

因为这个常量是给window的,回想一下之前我们设置全屏:

this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

所以我们进入到WindowManager.LayoutParams去看看,搜索常量先。
搜索2000:

/** Window flag: treat the content of the window as secure, preventing * it from appearing in screenshots or from being viewed on non-secure * displays.* * <p>See {@link android.view.Display#FLAG_SECURE} for more details about * secure surfaces and secure displays. */
public static final int FLAG_SECURE             = 0x00002000;

NICE!看这个变量名字就知道了,FLAG_SECURE->安全。当然不能依照名字来断定,还是看看注释。这上面说:这个标志是用来将窗口内容视为安全的,它不会出现在屏幕截图里面。

也就是说:我们自己的Activity,只要加上了这个标志,就会变得“安全”,不会被屏幕截图捕捉到,即使是adb命令。

验证之后,果然如此,AS获取不到屏幕截图,手机自带的截屏也拿不到了,豌豆荚等第三方客户端暂时没测试,电脑上没有豌豆荚,感兴趣的朋友可以试试看。

**

结语

**

想要像银联一样,在某Activity做到手机无法截屏,甚至是adb也拿不到,那么可以在Activity中加入:

getWindow().addFlags(WindowManager.LayoutParams. FLAG_SECURE);
或:this.getWindow().addFlags(8192);

此博客来至于 S_H_I_E_L_D 的简书

原文链接:http://www.jianshu.com/p/0823b61597e4

让你的app无法使用系统截图的探究相关推荐

  1. 截图工具因为计算机无法使用,win7系统截图工具无法使用提示“当前未在计算机上运行”的解决方法...

    今天和大家分享一下win7系统截图工具无法使用提示"当前未在计算机上运行"问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统截图工具无法使用提示" ...

  2. 截图工具因为计算机无法使用,win10系统截图工具无法使用提示“当前未在计算机上运行”的修复方案...

    有关win10系统截图工具无法使用提示"当前未在计算机上运行"的操作方法想必大家有所耳闻.但是能够对win10系统截图工具无法使用提示"当前未在计算机上运行"进 ...

  3. Windows Phone APP中禁用截图

    原文:Windows Phone APP中禁用截图 Windows Phone 8 有系统自带的截图功能,快捷键:电源键+Win键,可以随意截图. Windows Phone 更新GDR2后新增了一个 ...

  4. Android app和系统应用实现截屏功能

    开发截屏功能也是常用的方法,一种是在普通app中通用的截屏方法,另外一种就是系统应用中使用的截屏方法,比如:SystemUI中添加截图功能 接下来就来实现普通app 和系统应用中截图的功能 1.普通a ...

  5. APP分发系统源码 全开源超级签名系统源码 附带详细部署文档

    介绍: APP分发系统源码.全开源超级签名系统源码. 附带详细部署文档. 源码全开源的!!! 后台账号:admin 后台密码:123456 需要的资料:阿里云账户 服务器 linux(4核8G) 阿里 ...

  6. 手机APP商城系统开发设计方案

    手机APP商城系统的设计问题在近几年逐渐被大家看中,这说明,手机电商行业开始迅速发展,并且被大家认可,电商企业大军由此诞生.那么新手们对手机APP商城系统的设计了解了多少呢?夏日葵电商与您分享:   ...

  7. 【变色龙】app封装系统源码+完美版在售封装系统

    简介: 1.App封装 实现App封装,混合开发App,100多JS接口功能交互. 2.制作小程序 通过接口网站封装成小程序. 安装环境变色龙app封装系统源码 环境:PHP 5.6 MySQL 存储 ...

  8. Redmi K40系统截图曝光:配备顶级2K屏幕+骁龙870移动平台

    正如此前预测的,昨日小米集团中国区总裁.Redmi品牌总经理卢伟冰正式宣布,Redmi K40系列旗舰将于2月25日正式发布,至少包含Redmi K40和Redmi K40 Pro两款机型.随着发布时 ...

  9. 区块链app源码_区块链app商城系统开发适用于哪些企业

    区块链商城系统开发,区块链技术让人们对于软件应用开发有了全新的想象,现在也有越来越多的企业开始布局区块链业务,区块链应用开渐渐成为市场应用的宠儿,随着区块链技术的不断发展,未来也会有越来越多的区块链应 ...

最新文章

  1. 防火墙 linux 端口,Linux配置防火墙端口 8080端口
  2. java虚拟机起不来的原因,JVM理解其实并不难!
  3. mysql中blog数据_zp blog
  4. 2020牛客暑期多校训练营(第三场)
  5. Servlet使用适配器模式进行增删改查案例(EmpServiceImpl.java)
  6. 家庭网络,怎么给每个房间装一个无线路由器?
  7. python能自学成功吗-Python学习自学效果好吗?|老男孩Python人工智能培训
  8. C++基础:C++的封装/继承/多态
  9. 20200127每日一句
  10. centos7轻松搭建文件服务器
  11. ABAQUS单位统一
  12. HEVC—SAO技术
  13. OPC UA 的本质
  14. 详解CAN总线:CAN总线通信优先级机制
  15. 60mph和kmh换算_mph换算器(速度计算器在线)
  16. 虚拟机Ubuntu下共享文件夹MyShare不显示
  17. [附源码]java毕业设计本科毕业设计过程管理系统
  18. Elasticsearch 5.4新闻搜索项目实战
  19. JavaScript实现2048小游戏,我终于赢了一把
  20. Linux中date 以及date -d命令的详解

热门文章

  1. JAVA刷CSDN访问量_刷csdn访问量 - 鹏城二少的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 删除照片恢复,最实用的方法快收藏起来!
  3. 围棋人机大战再开打,柯洁将挑战阿尔法狗
  4. JavaWeb 尚硅谷书城项目
  5. C语言 不完全类型
  6. C++: string的大小写转换
  7. 为什么有些坏习惯很难改掉?
  8. 【强化学习论文合集】二十二.2020国际机器学习大会论文(ICML2020)
  9. 《一种新颖的自适应权重 Census变换立体匹配算法》(2016)
  10. 计算机无法发现蓝牙设备,蓝牙打开了搜不到设备如何处理_电脑蓝牙开启却搜不到设备的解决教程...