

让你的app无法使用系统截图的探究
source link: http://www.androidchina.net/5938.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近项目要接入各种支付,其中一个是银联支付。于是开始捣鼓,之前也没接入过,只是做过微信和支付宝。
下载银联的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进制看看是多少:
0×2000
因为这个常量是给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);
转载请注明:Android开发中文站 » 让你的app无法使用系统截图的探究
Recommend
-
16
新酷产品第一时间免费试玩,还有众多优质达人分享独到生活经验,快来新浪众测,体验各领域最前沿、最有趣、最好玩的产品吧~!下载客户端还能获得专享福利哦! 据9to5Mac报道,苹果公司似乎正在为iOS重新设计墙纸设置面板,新面板可对系...
-
6
此 App 只在 iPhone 的 App Store 中提供。
-
5
win10系统截屏快捷键有哪些,win10电脑截图快捷键win10系统截屏快捷键有哪些,win10电脑截图快捷键 2021-11-...
-
4
疑似苹果iOS 16系统界面截图曝光,“大组件”惹眼-51CTO.COM 疑似苹果iOS 16系统界面截图曝光,“大组件”惹眼 作者:阿喾 2022-02-01 15:48:02 按照苹果的节奏,全新iOS 16大概率会在六月份的WWDC上...
-
6
界面帅爆了!苹果iOS 16系统截图首曝光 2022年01月31日06:30 中关村在线 我有话说(7人参与) 收藏本文
-
33
V2EX › 程序员 udemy 上的课无法截图,是怎么做到的? ursash · 9 小时 3 分钟前 ·...
-
8
用户体验iOS系统截图期间会自动隐藏辅助触控悬浮按钮? 产品: iOS系统猎人:
-
8
最全的App Store屏幕截图样机模板 6月 17, 2022 发表于: 优秀设计资源.
-
6
想了解更多关于开源的内容,请访问:...
-
4
V2EX › Android 怎样在禁止截图的 App 中截图或录屏?
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK