CN107807835A - 一种利用java反射机制进行截屏的方法 - Google Patents

一种利用java反射机制进行截屏的方法 Download PDF

Info

Publication number
CN107807835A
CN107807835A CN201711022023.2A CN201711022023A CN107807835A CN 107807835 A CN107807835 A CN 107807835A CN 201711022023 A CN201711022023 A CN 201711022023A CN 107807835 A CN107807835 A CN 107807835A
Authority
CN
China
Prior art keywords
screenshotss
function
button
perform
suspended window
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201711022023.2A
Other languages
English (en)
Inventor
肖剑锋
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
World (beijing) Network Technology Co Ltd
Original Assignee
World (beijing) Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by World (beijing) Network Technology Co Ltd filed Critical World (beijing) Network Technology Co Ltd
Priority to CN201711022023.2A priority Critical patent/CN107807835A/zh
Publication of CN107807835A publication Critical patent/CN107807835A/zh
Pending legal-status Critical Current

Links

Abstract

本发明提供一种利用JAVA反射机制进行截屏的方法,利用JAVA发射机制在Android智能终端屏幕任意位置通过定义的虚拟按键代替长按系统组合按键实现截屏,将实现的功能以悬浮窗上的虚拟按键的形式进行表现,可以悬浮到屏幕的任意位置,并且可以显示在几乎所有的终端应用界面之上,这样就可以在任何情况下通过操作虚拟按键来代替按压系统组合按键实现截屏。

Description

一种利用JAVA反射机制进行截屏的方法
技术领域
本发明属于智能终端技术领域,具体涉及一种利用JAVA反射机制进行截屏的方法。
背景技术
截屏功能是终端的常用功能之一。终端出厂时提供的截屏操作方式通常需要同时长按两个系统按键,例如,长按电源键+Home键,或者长按电源键+音量上键(或下键),或者其他两个系统组合键。智能终端在经过一段时间的使用之后,容易出现某些实体按键或者虚拟按键使用失效或不灵敏的情况,例如,实体电源键,实体或系统虚拟返回键,实体或系统虚拟Home键等。虽然终端其他方面都还很好,但是因为某些系统按键不灵敏或者失效的问题,用户就不得不花钱去更换按键,甚至购买新的终端。另外,使用长按组合键的方式进行截屏,操作需要一定的技巧,要两个手一起操作,同时按下按键才行,操作并不是特别方便。
如图1所述,现有技术中公开了一种截屏功能的方法,包括:当检测到所述触摸屏被触摸时,获取触摸时长、触摸区域以及所述移动终端的运动状态(101);当所述触摸时长大于预设时长、所述触摸区域固定不变,以及所述移动终端的运动状态满足预设条件时,启动截屏功能。通过本发明启动截屏功能时无需双手操作单手即可完成,使启动截屏功能的操作更简便快捷(102)。即用户通过单手长时间触摸屏幕某块固定的区域,触摸的时长要大于预设的时间,并且当前的移动终端处于预设的运动状态时,启动截屏功能。
现有技术中的上述技术方案存在如下缺点:
一是长时间触摸的固定区域如果不是程序预设的区域,而是屏幕上的一块随便区域就有可能导致用户的误操作,比如,手攥着终端,手指长时间会接触屏幕的某一块固定区域,就可以看作条件满足了,这就可能会引起用户的误操作;
二是移动终端的运动状态得满足预设条件,要监控移动终端的运动状态,可能需要监听终端上的各种传感器,这个操作步骤将会非常繁琐;终端的各种传感器非常多,如果稍有遗漏,可能就会引起大的bug;
三是对于普通的第三方应用程序来说,是没有权限启动截屏功能的,系统没有提供对外开放的接口,这个是系统为安全起见做的强制措施,除非是终端厂商自己才能做到。
发明内容
为克服上述现有技术的不足,本发明提供了一种利用JAVA反射机制进行截屏的方法。
首先不需要和终端厂商合作,只需要终端Root即可,也不用长时间触摸终端固定区域达到一定的预设时间,以及不用判断当前的终端处于何种运动状态,只需要启动自定义的shell命令行执行环境,然后在命令行中执行app_process命令,通过反射技术调用系统方法injectInputEvent(Android4.1及以上版本)或者injectKeyEvent(Android4.1以下),即可实现截屏(这些都发生在后台,对用户都是透明的),全程不需要用户过多的参与。并且这个功能模拟成一个虚拟按键,通过悬浮窗的方式展现给用户(悬浮窗的好处是可以悬浮在屏幕的任意位置,用户可以随意拖动,悬浮窗上面可以放置任意多个虚拟按钮,每个按钮可以对应我们需要的任意功能,如某个按钮可以实现返回键功能,另一个按钮可以截屏功能等等),从而可以使用户方便快捷的进行操作。
所述利用JAVA反射机制进行截屏的方法,包括以下步骤:
S401、开始,点击悬浮按键;
S402、展开悬浮窗,点击悬浮窗上的截屏功能按键;
S403、判断终端是否Root;如果判断结果为否,则执行S404,如果判断结果为是,则执行S405;
S404、提示终端未Root,无法使用此功能,继续执行S4016;
S405、提取按键对应的action和code值;
S406、申请Root权限,系统提示是否赋予该app权限,当Root权限申请成功后执行S408,当Root权限申请不成功则执行S407;
S407、未获得Root权限,执行失败,继续执行S4016;
S408、执行adb shell指令;
S409、判断指令是否执行成功;当判断结果为否时,执行步骤S4010,当判断结果为是时,执行步骤S4011;
S4010、指令执行失败,继续执行S4016;
S4011、调用执行自定义的xxx.jar文件;
S4012、通过xxx.jar的main函数,执行实现类,反射调用注入函数;
S4013、判断注入函数是否执行成功,判断结果为否,则执行S4014,判断结果为是,则执行S4015;
S4014、提示执行失败,执行S4016;
S4015、实现截屏功能;
S4016、退出:执行退出功能,此时可以选择关闭悬浮窗,也可以继续保留悬浮窗,继续执行其它按键功能。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。
附图说明
图1示出了现有技术中实现终端截屏的方法流程图;
图2示出了根据本发明的一个实施例的悬浮按键示意图;
图3示出了根据本发明的一个实施例的悬浮窗示意图;
图4示出了根据本发明的一个实施例的实现截屏的方法流程图;
图5示出了根据本发明的一个实施例的悬浮按键及悬浮窗启动流程图;
图6示出了根据本发明的一个实施例的shell环境创建流程图。
具体实施方式
为更进一步阐述本发明为达成预定发明目的所采取的技术手段及功效,以下结合附图及较佳实施例,对依据本发明提出的一种利用JAVA反射机制进行截屏的方法其具体实施方式、特征及其功效,详细说明如后。在下述说明中,不同的“一实施例”或“实施例”指的不一定是同一实施例。此外,一或多个实施例中的特定特征、结构、或特点可由任何合适形式组合。
本发明所使用的术语如下:
Android:中文名称为安卓,是一种基于Linux的自由及开放源代码的操作系统,主要用于移动设备,如智能终端和平板电脑,由Google公司和开放终端联盟领导及开发。
Root权限:Root权限是指Unix类操作系统(包括Linux,Android)的系统管理员权限,类似于Windows系统中的Administrator(管理员)。安卓Root权限可以访问和修改你终端中几乎所有的文件(Android系统文件及用户文件,不包括ROM)。
可执行文件:可执行文件(executable file)指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。
shell:shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。它是linux的一个命令解释器,它解释由用户输入的命令并且把它们送到内核去执行。本发明中创建的一个命令行进程实现的功能和系统的shell相同,因此也命名为shell。
app_process:是放在Android系统目录下的一个可执行二进制文件,利用它可以在shell命令行窗口执行一些预置的功能,例如系统的am,pm指令都是通过它实现的。
虚拟按键:终端虚拟按键是指用于全触摸终端的虚拟于屏幕的一个按钮,利用此按钮可直接实现系统按键的功能。
JAVA反射机制:JAVA反射机制是在程序运行状态中,对于任意一个类,都可以获取到这个类的所有属性和方法;对于任意一个对象,都能够调用到它的任意一个方法和属性。这种动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制。
在本发明的一个具体实施方式中,提供一种在Android智能终端屏幕任意位置通过定义的虚拟按键代替长按系统组合按键实现截屏的方法,将实现的功能以悬浮窗上的虚拟按键的形式进行表现,它的好处是可以悬浮到屏幕的任意位置,并且可以显示在几乎所有的终端应用界面之上,这样就可以在任何情况下通过操作虚拟按键来代替按压系统组合按键实现截屏。我们首先提供一个悬浮按键,如图2中红圈中的悬浮按键,可悬浮至屏幕的任意位置,并且可以悬浮在大部分终端应用界面之上。通过点击悬浮按键可弹出一个悬浮窗,同时将悬浮按键关闭。根据本发明的一个优选实施方式,如图3所示,悬浮窗尺寸可设置为供放置若干按键,这些按键分别对应不同的功能,点击其中的某一个按键可以实现相应的功能。在本发明的一个具体实施方式中,以实现截屏功能为例,例如参考图3中部的“截屏”按键。
在点击“截屏”键后,我们首先判断终端是否Root成功,如果未Root则提示用户要使用此功能首先需要Root,并提供可以Root终端的工具下载地址;如果Root成功了,则会由系统弹出赋予此应用的权限授予窗口,用户点击允许后,就获取到Root权限,否则提示未授予权限,操作执行失败。
在获得Root权限后,会判断用户将要执行哪种按键功能,是执行返回键,还是菜单键,还是截屏键,不同按键实现流程不同。同时将此按键对应的键值码提取出来,如返回键的键值码为KEYCODE_BACK,对应的数值为4。而截屏键是两个系统键值码的组合值,比如,有的终端使用电源键+HOME键实现的截屏,那它的键值码为KeyEvent.KEYCODE_POWER和KeyEvent.KEYCODE_HOME,对应的数值为26和3。这些值是系统预先定义好,对外开放的,可以通过源码或SDK查询到。以下是具体实现的概述:
首先,创建一个shell的命令行执行环境,在此环境中使用export指令设置环境变量,这里需要注意不同的Android系统版本在设置环境变量时,方法是有区别的,因此需要根据系统版本的不同采用不同的设置方法。
接着执行一条“exec app_process库所在的路径库中实现功能的类名”这样的shell指令,“库所在的路径”是指我们实现的java反射功能需要打包到一个xxx.jar(xxx表示名称可以根据需要自行定义,只要是字母组合的字符串即可)库中,这个库存放在apk的assets目录下,在程序首次运行时,会将其解压缩到“/data/data/包名/files/”路径下,库所在的路径就是指的这个路径;“库中实现功能的类名”指的是xxx.jar库中哪个类执行了反射注入键函数。
然后程序会执行xxx.jar库文件,通过xxx.jar库中的main函数跳到具体的类中,这个类通过反射技术调用了系统的预置方法injectInputEvent(Android4.1及以上版本)或者injectKeyEvent(Android4.1以下)来注入长按键,实现锁屏功能。其实终端的系统按键,例如返回键,菜单键都是通过类似方法来实现的。不同的是系统有执行权限,并且接口可见,可以直接调用;而第三方应用没权限,只能通过shell指令间接获取到权限,然后通过反射技术来调用这些不可见的接口。调用方法完成后,接着判断方法是否执行成功。执行成功后,系统会对按键做出响应,否则将提示执行失败。
通过这样一系列的步骤,就实现了“虚拟”长按系统组合键,从而实现截屏的功能。
在本发明的一个具体实施方式中,提供了详细的利用shell指令,java反射技术实现虚拟按键进行截屏的方法,如示例图4,其实现的步骤如下:
S401、点击悬浮按键,开始;根据本发明的一个优选实施方式,利用悬浮按键来展示待机状态,利用悬浮窗来实现具体的功能。点击悬浮按键后悬浮窗将会被展开,同时悬浮按键进行隐藏;悬浮窗关闭后,悬浮按键会显示出来。即悬浮按键和悬浮按钮是相互排斥出现的,遵循“你显示,我隐藏;你隐藏,我显示”。根据本发明的一个优选实施方式,悬浮窗可随意拖动,并悬浮于任意应用之上,因此在本发明中使用悬浮窗作为虚拟按键的载体。根据本发明的一个优选实施方式,可以以其它方式实现虚拟按键的载体,不一定是悬浮窗,可以是悬浮按键,例如,点一次按键执行一次预置好的指令,如返回键。
S402、展开悬浮窗,点击悬浮窗上的截屏功能按键;根据本发明的一个优选实施方式,点击悬浮按键展开悬浮窗后进一步通过点击悬浮窗上的功能按键来选择具体的功能按键,如返回键、菜单键、截屏键等。根据本发明的一个优选实施方式,以点击截屏键为例进行下述描述。
S403、判断终端是否Root;如果判断结果为否,则执行S404,如果判断结果为是,则执行S405。此功能的实现需要终端Root权限的支持。判断终端是否Root,一般是通过检测一些常用的系统目录是否存在su文件来实现的,例如检测/system/bin/,/system/xbin/,/sbin/,/system/sd/xbin/,/data/local/xbin/,/data/local/bin/等目录是否存在su文件,如果存在就认为终端Root了。根据本发明的一个优选实施方式,还可通过其它检测方式,比如直接在shell指令里执行“su”,在返回的输出系统中执行一条简单打印指令,如果返回成功,则代表Root成功;根据本发明的一个优选实施方式,可以通过第三方的库函数来进行检测。
S404、提示终端未Root,无法使用此功能,继续执行S4016;当检测到终端未Root成功,例如su文件不存在,则给出相应的错误提示;根据本发明的一个优选实施方式,可引导用户去对终端进行Root,如提示一个下载Root工具的地址,从而获得更好的用户体验。
S405、提取按键对应的action和code值;终端Root成功,则开始提取虚拟按键对应的action和code值。
预先可定义action具有单击,长按两种值,一个单击事件可以描述成连续发送了一个KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP消息,我们用数字1表示;一个长按事件可以描述成先发送了一个KeyEvent.ACTION_DOWN,然后休息2-3秒(我们定义为2.5秒),再发送一个KeyEvent.ACTION_UP消息,我们用数字2来表示;
code为系统各个按键的键值码,系统为每个键提供了唯一标识,如KEYCODE_BACK=4表示返回键,KEYCODE_POWER=26表示电源键,KEYCODE_HOME=3表示HOME键。
计算出悬浮窗点击的按钮将要对应的系统按键的action和code值,以点击截屏键为例,它表示一个长按事件,所以action为2;因为要实现截屏功能,需要同时长按电源键+HOME键,所以code值为26和3拼成的字符串,即“26 3”中间用空格分开,以这种形态传给xxx.jar文件处理。当然,有的终端上的截屏功能不是电源键+HOME键组合的方式,可能是电源键+电源上键,这就要对不同的终端做分类了,通过判断不同的机型,选择不同的按键组合方式。
S406、申请Root权限,系统提示是否赋予该app权限,当Root权限申请成功后执行S408,当Root权限申请不成功则执行S407。
在执行具体的shell指令之前,需要获取到Root权限,尽管终端已经Root了,但是如果没有获得使用Root权限的授权,同样会执行失败。根据本发明的一个优选实施方式,使用第三方库rootmanager_1.5.0.jar中的hasRooted()方法来检测是否赋予此app权限,执行hasRooted()方法后,会触发系统的权限管理,只有系统赋予Root权限后,才能继续执行。
终端在被Root后,通常由一个Root管理工具来对系统的Root权限进行管理,在需要使用Root权限时,都会触发系统的Root管理工具,管理工具通常提示用户,是否赋予Root权限,只有在点击确认后才能获得Root权限,然后才能执行相应的功能,否则会提示获取权限失败。用户也可以到Root管理工具中主动赋予app权限,可以选择允许,提示,禁止三种操作。
S407、未获得Root权限,执行失败,继续执行S4016;如果未获得Root权限则提示用户,并退出功能。根据本发明的一个优选实施方式,可设置友好提示,引导用户去放开权限。
S408、执行adb shell指令;创建一个shell命令行环境,在环境中执行一条形如“exec app_process库所在的路径库中实现功能的类名”的指令。命令行环境通过创建一个执行su的process(进程)来实现,然后在此shell进程中执行“exec app_process库所在的路径库中实现功能的类名”指令,接着再将之前生成的action和code拼接成字符串传给此进程执行,对于截屏来说,code已经是两个组合键值拼成的字符串了,是“26 3”。在此过程中我们借助app_process工具执行了自定义的一个xxx.jar包文件,并将action和code传递给了xxx.jar文件;
具体的执行指令为“exec app_process库所在的路径库中实现功能的类名”。“库所在的路径”是指我们实现的java反射功能需要打包到一个xxx.jar库中,这个库存放在apk的assets目录下,在程序首次运行时,会将其解压缩到“/data/data/包名/files/”路径下,库所在的路径就是指的这个路径;“库中实现功能的类名”指的是执行反射注入键函数所在类的名称,它是一个全路径名称,包括了类所在包名,如实现类名定义为com.shere.common.keyexecutor.KeyExecutor,表示这个类所在包为com.shere.common.keyexecutor,类名为KeyExecutor,位于xxx.jar库中。“库所在的路径”和“库中实现功能的类名”都可以看做是在执行二进制文件app_process时,传递给它的两个参数。
另外,在执行之前需要设置执行的环境变量,在Android 4.0及以上版本使用export LD_LIBRARY_PATH进行设置,在Android 4.0以下版本使用export CLASSPATH进行设置。
S409、判断指令是否执行成功;此步骤主要依靠判断执行结果的返回值来进行处理,如果为true,表示命令执行成功,返回false,表示执行失败。当判断结果为否时,执行步骤S4010,当判断结果为是时,执行步骤S4011。
S4010、指令执行失败,继续执行S4016;shell指令执行失败,将退出程序,释放之前申请的资源,退出创建的shell进程等等,并提示用户出错的信息。
S4011、调用执行自定义的xxx.jar文件;shell指令执行成功,将启动预置到apk中的xxx.jar库文件,“xxx”表示名称可以随意取,根据本发明的一个优选实施方式,可定义名称为admob.jar。这个库存放在apk的assets目录下,在程序首次运行时,会将其解压缩到“/data/data/包名/files/”路径下。xxx.jar启动后,会首先触发xxx.jar文件中的main函数。
S4012、通过xxx.jar的main函数,执行实现类,反射调用注入函数;xxx.jar库是实现按键功能的核心代码,通过执行xxx.jar,进而启动类KeyExecutor内部的main函数,再由main函数调用注入函数injectInputEvent或者injectKeyEvent来启动具体的注入按键代码。由于注入函数系统不对外开放,需要通过反射调用才能执行。需要注意的是Android4.1及以上版本使用injectInputEvent方法,而Android4.1以下使用的是injectKeyEvent方法。
S4013、判断注入函数是否执行成功,判断结果为否,则执行S4014,判断结果为是,则执行S4015;这里通过函数执行情况进行判断,未抛出异常说明执行成功。
S4014、提示执行失败,执行S4016;注入函数执行失败,则提示用户执行失败,然后退出。
S4015、实现截屏功能;执行成功,系统会响应执行的系统按键功能。当点击截屏键时,即实现截屏功能。
S4016、退出:执行退出功能,此时可以选择关闭悬浮窗,也可以继续保留悬浮窗,继续执行其它按键功能。
根据本发明的一个优选实施方式,为了快速,便捷、随心所欲的操作截屏功能,使用了悬浮按键和悬浮窗的技术,并且为了能够使悬浮按键和悬浮窗及时响应用户输入,启动了一个Service进程来进行管理,使应用程序不容易被系统或第三方杀死。参考图5说明悬浮按键和悬浮窗启动过程以及工作流程。
S501、启动程序;程序启动入口分三种情况,一种是程序刚刚安装成功,这时自动启动程序;第二种是终端已经安装了本程序,重新开机,收到系统开机广播或者其它常用的系统广播消息,如网络变化,开关蓝牙,GPS等等,将触发其自动启动运行;第三种是用户手动点击程序图标,启动程序。
S502、启动客户端进程;程序启动后首先运行客户端进程,此进程中包含了悬浮窗的所有设置功能以及其他一些辅助功能,如主题替换,设置功能项的开关,信息反馈,帮助,版本信息等内容。
S503、由客户端进程启动一个Android Service进程;通常具有两个进程,一个是客户端进程,一个是Service进程,前者是对主要功能的一些辅助设置,后者用来实现具体的功能,Service的优势是可以运行在系统的后台,并且不容易被杀死,用它可以提供持久的悬浮窗展示,提升了用户的体验度。
S504、在Service进程中分别创建悬浮按键和悬浮窗;悬浮按键和悬浮窗的实现原理类似,都是通过系统的WindowManager(窗口管理器)提供的addView方法在系统界面管理器中添加一个窗口,并将此新加的窗口的优先级设置为TYPE_SYSTEM_ALERT级别的,这样它的优先级非常的高,就可以显示于大多数系统窗口之上了,达到了“悬浮”于其它窗口之上的目的。
S505、Service进程在后台一直保持运行,显示悬浮按键,隐藏悬浮窗;Sevice进程的一个优势就是可以在后台一直保持运行,在其启动后,待机状态时,将悬浮按键显示出来,而将悬浮窗进行隐藏,这两者的关系是互斥的,“你显示,我隐藏;你隐藏,我显示”。
S506、判断是否点击悬浮按键;执行具体功能时需要先点击悬浮按键,将悬浮窗显示出来。如果判断结果为否,则执行S507;如果判断结果为是,则执行S508。
S507、待机运行,继续监听按键事件,返回至S505;如果没有点击事件发生,悬浮按键将保持待机运行,直到监听到按键事件。
S508、显示悬浮窗,隐藏悬浮按键;收到点击事件,将悬浮按键隐藏,并实现悬浮窗。
S509、展示支持的各种按键功能;展开悬浮窗,展示所支持的所有功能,例如,虚拟返回按键功能。通过ViewPager(Android系统的一种标准控件,可以左右滑动切换不同的界面)控件来实现悬浮窗页面功能项展示,可以展示多屏内容,通过左右滑动来进行切换。
S5010、点击屏幕,判断点击的位置是否是悬浮窗上的虚拟功能键;点击屏幕,判断点击的位置是否是悬浮窗对应的功能按键。如果判断为是,则执行S5012;如果判断为否,则执行S5011。
S5011、退出悬浮窗,将其隐藏,展示悬浮按键;如果点击的位置不是悬浮窗上的某一个按键,而是点击空白处,则退出悬浮窗,将悬浮窗关闭,打开悬浮按键,返回S505;保持悬浮按键待机运行,继续监听悬浮按键的按键事件。只要不关机,悬浮按键可以一直悬浮显示,待机提供虚拟按键功能,达到系统按键同样的效果。
S5012、判断当前执行的按键是否是截屏功能,如果判断结果为是,则执行S5013;如果判断结果为否,则执行S5014;截屏功能需要对悬浮按键进行隐藏和显示的处理,防止其影响截屏的结果。
S5013、隐藏当前悬浮按键,防止截屏时将悬浮按键显示到当前截屏画面中,继续执行S5014;根据本发明的一个优选实施方式,截屏时,只是想得到当前的界面内容,不想将悬浮按键显示在当前截屏界面中,所以需要将当前悬浮按键进行隐藏。根据本发明的一个优选实施方式,如果用户希望将其显示在截屏界面中,可以通过设置菜单的方式交给用户进行选择,然后在截屏流程中增加一个开关进行判断是否显示或隐藏即可。
S5014、执行对应的功能;针对点击来执行对应的按键功能。
S5015、功能执行完毕,如果所执行的是截屏功能,则需要将悬浮按键显示出来;在功能执行完毕后,需要判断一下所执行的功能,如果是截屏功能,则需要将之前隐藏的悬浮按键显示出来,便于后续继续使用悬浮按键,使程序继续保持待机运行。
S5016、待机运行,继续监听按键事件,继续执行S509;按键功能执行完毕,保持悬浮窗显示,继续执行其它的功能。悬浮窗待机运行,继续监听按键事件。
以上是悬浮按键和悬浮窗启动过程以及工作流程,以下将详细描述shell指令执行时的具体流程。在获得了Root权限,执行shell指令时,需要根据系统的版本设置不同的环境变量才能保证命令的执行环境正确,然后才能成功的执行shell指令,此指令需要分多步进行执行,并且需要始终运行在一个shell进程之中。具体执行流程如图6所示:
S601、执行su命令,创建一个shell进程;根据本发明的一个优选实施方式,使用如下java语句Runtime.getRuntime().exec("su"),创建一个shell进程,此进程的第一个命令为"su"。
S602、判断系统版本号是否为Android4.0以上的系统,当判断结果为是,则执行S603;当判断结果为否,则执行S604;根据本发明的一个优选实施方式,通过系统变量Build.VERSION.SDK_INT判断系统的版本号,比较其是否大于14。数字14对应Android4.0系统,即判断当前系统是不是Android4.0以上的系统。
S603、使用指令格式export LD_LIBRARY_PATH=xxx设置环境变量;根据本发明的一个优选实施方式,如果是Android4.0(包括4.0)以上的系统则使用如下指令“export LD_LIBRARY_PATH=/vendor/lib:/system/lib;exp ort CLASSPATH=/data/data/包名/files/admob.jar”设置环境变量,其中的“包名”表示使用当前应用的包名。
S604、使用指令格式export CLASSPATH==xxx设置环境变量;根据本发明的一个优选实施方式,如果是Android4.0以下系统,则使用如下指令“export CLASSPATH==/data/data/包名/files/admob.jar”设置环境变量,其中的“包名”表示使用当前应用的包名。
S605、执行命令“exec app_process库所在的路径库中实现功能的类名”;根据本发明的一个优选实施方式,执行一条“exec app_process库所在的路径库中实现功能的类名”这样的shell指令,“库所在的路径”是所实现的java反射功能需要打包到一个xxx.jar库中,这个库存放在apk的assets目录下,在程序首次运行时,会将其解压缩到“/data/data/包名/files/”路径下,库所在的路径就是指的这个路径;“库中实现功能的类名”指的是执行反射注入键函数所在类的名称,它是一个全路径名称,包括了类所在包名,如实现类名定义为com.shere.common.keyexecutor.KeyExecutor,表示这个类所在包为com.shere.common.keyexecutor,类名为KeyExecutor,位于xxx.jar库中。“库所在的路径”和“库中实现功能的类名”都可以看做是在执行二进制文件app_process时,传递给它的两个参数。
S606、在su指令进程中,继续输入按键的参数action和code值;以上步骤的执行都是运行在开始时创建的su指令进程中,此步骤需要传入按键对应的action和code值,如单击截屏键对应的值为“2 26 3”(注意2前面有一个空格),2代表action这里表示单击,26和3代表code值,表示按键对应的键值码,KEYCODE_POWER=26表示是电源键,KEYCODE_HOME=3表示是HOME键,这两个同时出现表示是使用组合键,具体解释可以参考图4的S405步的注释。
S607、判断指令是否执行成功,判断结果为否,则执行S608,如果判断结果为是,则执行S609;根据本发明的一个优选实施方式,可通过是否有异常来进行判断,如果没有异常反馈,可以判定命令执行成功。
S608、指令执行失败,执行S6010;如果执行失败,则返回给上层一个false值。
S609、指令执行成功;如果执行成功,则返回给上层一个true值。
S6010、退出,返回执行结果:返回执行的结果,上层收到返回值,根据返回值决定是否继续往下执行。
针对智能终端用户在截屏时需要用户两只手同时长按系统的两个组合键才能实现截屏,这对于一些使用智能终端不熟练的用户来说,将会很难操作;并且有些用户根本就不知道还有这样的功能,还可以这样来进行截屏。此外,实体键在长时间使用后,还经常会出现不灵敏或者失效的问题。本发明提出了一种解决的方法。首先,将截屏功能移植到了一个虚拟按键上,只要点击一下就可实现,比两只手同时按压两个系统按键的方案方便多了,人人都可以操作,另外,因为虚拟按键有文字说明,用户也很容易发现这个功能;其次,长期按压系统按键会对系统按键造成损伤,使其不灵敏或者失效。而此发明以悬浮窗的形式来提供虚拟按键截屏功能,避免按压系统按键所带来的按键损伤,延长了系统按键的使用寿命;同时也起到了按压系统按键无法做到的一些好处,比如用户可以在任意界面快捷轻松的进行操作,只需轻轻点击一下即可,方便快捷。最后,本发明可以解决几乎所有Root终端用户实体按键不好用的问题。因为它“虚拟”实现了截屏按键功能,解决了用户在系统按键不好用时,无法实现截屏功能,避免了只能去修按键或者换终端的尴尬,减少了用户的金钱损失。
以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

Claims (10)

1.一种利用JAVA反射机制进行截屏的方法,其特征在于,包括以下步骤:
S401、开始,点击悬浮按键;
S402、展开悬浮窗,点击悬浮窗上的截屏功能按键;
S403、判断终端是否Root;如果判断结果为否,则执行S404,如果判断结果为是,则执行S405;
S404、提示终端未Root,无法使用此功能,继续执行S4016;
S405、提取按键对应的action和code值;
S406、申请Root权限,系统提示是否赋予该app权限,当Root权限申请成功后执行S408,当Root权限申请不成功则执行S407;
S407、未获得Root权限,执行失败,继续执行S4016;
S408、执行adb shell指令;
S409、判断指令是否执行成功;当判断结果为否时,执行步骤S4010,当判断结果为是时,执行步骤S4011;
S4010、指令执行失败,继续执行S4016;
S4011、调用执行自定义的xxx.jar文件;
S4012、通过xxx.jar的main函数,执行实现类,反射调用注入函数;
S4013、判断注入函数是否执行成功,判断结果为否,则执行S4014,判断结果为是,则执行S4015;
S4014、提示执行失败,执行S4016;
S4015、实现截屏功能;
S4016、退出:执行退出功能,此时可以选择关闭悬浮窗,也可以继续保留悬浮窗,继续执行其它按键功能。
2.如权利要求1所述的利用JAVA反射机制进行截屏的方法,其特征在于:
点击悬浮按键后悬浮窗将会被展开,同时悬浮按键进行隐藏;悬浮窗关闭后,悬浮按键显示出来。
3.如权利要求1或2所述的利用JAVA反射机制进行截屏的方法,其特征在于:
判断终端是否Root具体为:检测/system/bin/,/system/xbin/,/sbin/,/system/sd/xbin/,/data/local/xbin/,/data/local/bin/目录是否存在su文件;或者在shell指令里执行“su”,在返回的输出系统中执行打印指令,如果返回成功,则代表Root成功。
4.如权利要求1-3任一所述的利用JAVA反射机制进行截屏的方法,其特征在于:
预先定义action具有单击,长按两种值,code为系统各个按键的键值码;计算出悬浮窗点击的按钮将要对应的系统按键的action和code值,action和code拼接成字符串传给xxx.jar文件处理;通过判断不同的机型,选择不同的按键组合方式。
5.如权利要求1-4任一所述的利用JAVA反射机制进行截屏的方法,其特征在于:
在创建的shell命令行环境中执行“exec app_process库所在的路径库中实现功能的类名”指令,接着再将之前生成的action和code拼接成字符串传给此进程执行,
在执行之前需要设置执行的环境变量,在Android 4.0及以上版本使用export LD_LIBRARY_PATH进行设置,在Android 4.0以下版本使用export CLASSPATH进行设置。
6.如权利要求1-5任一所述的利用JAVA反射机制进行截屏的方法,悬浮按键和悬浮窗启动过程及工作流程如下:
S501、启动程序;
S502、启动客户端进程;此进程中包含了悬浮窗的所有设置功能;
S503、由客户端进程启动一个Android Service进程;
S504、在Service进程中分别创建悬浮按键和悬浮窗;
S505、Service进程在后台一直保持运行,显示悬浮按键,隐藏悬浮窗;
S506、判断是否点击悬浮按键;如果判断结果为否,则执行S507;如果判断结果为是,则执行S508;
S507、待机运行,继续监听按键事件,返回至S505;如果没有点击事件发生,悬浮按键将保持待机运行,直到监听到按键事件;
S508、显示悬浮窗,隐藏悬浮按键;收到点击事件,将悬浮按键隐藏,并实现悬浮窗;
S509、展示悬浮窗支持的各种按键功能;
S5010、点击屏幕,判断点击的位置是否是悬浮窗上的虚拟功能键;如果判断为是,则执行S5012;如果判断为否,则执行S5011;
S5011、退出悬浮窗,将其隐藏,展示悬浮按键,返回S505;
S5012、判断当前执行的按键是否是截屏功能,如果判断结果为是,则执行S5013;如果判断结果为否,则执行S5014;
S5013、隐藏当前悬浮按键,防止截屏时将悬浮按键显示到当前截屏画面中,继续执行S5014;
S5014、执行对应的功能;针对点击来执行对应的按键功能;
S5015、功能执行完毕,如果所执行的是截屏功能,则需要将悬浮按键显示出来;
S5016、待机运行,继续监听按键事件,继续执行S509。
7.如权利要求6所述的利用JAVA反射机制进行截屏的方法,其特征在于:
悬浮按键和悬浮窗都是通过系统的窗口管理器提供的addView方法在系统界面管理器中添加一个窗口,并将此新加的窗口的优先级设置为TYPE_SYSTEM_ALERT级别。
8.如权利要求1-7任一所述的利用JAVA反射机制进行截屏的方法,创建shell执行环境具体如下:
S601、执行su命令,创建一个shell进程;
S602、判断系统版本号是否为Android4.0以上的系统,当判断结果为是,则执行S603;当判断结果为否,则执行S604;
S603、使用指令格式export LD_LIBRARY_PATH=xxx设置环境变量;
S604、使用指令格式export CLASSPATH==xxx设置环境变量;
S605、执行命令“exec app_process库所在的路径库中实现功能的类名”;
S606、在su指令进程中,继续输入按键的参数action和code值;
S607、判断指令是否执行成功,判断结果为否,则执行S608,如果判断结果为是,则执行S609;
S608、指令执行失败,执行S6010;如果执行失败,则返回给上层一个false值;
S609、指令执行成功;如果执行成功,则返回给上层一个true值;
S6010、退出,返回执行结果:返回执行的结果,上层收到返回值,根据返回值决定是否继续往下执行。
9.如权利要求7-8任一所述的利用JAVA反射机制进行截屏的方法,其特征在于:
如果是Android4.0以上的系统则使用如下指令“export LD_LIBRARY_PATH=/vendor/lib:/system/lib;export CLASSPATH=/data/data/包名/files/admob.jar”设置环境变量,其中的包名表示使用当前应用的包名;如果是Android4.0以下系统,则使用如下指令“export CLASSPATH==/data/data/包名/files/admob.jar”设置环境变量,其中的包名表示使用当前应用的包名。
10.如权利要求7-9任一所述的利用JAVA反射机制进行截屏的方法,其中执行一条“exec app_process库所在的路径库中实现功能的类名”的shell指令,“库所在的路径”是所实现的java反射功能需要打包到一个xxx.jar库中,这个库存放在apk的assets目录下,在程序首次运行时,会将其解压缩到“/data/data/包名/files/”路径下,库所在的路径就是指的这个路径;“库中实现功能的类名”指的是执行反射注入键函数所在类的名称,它是一个全路径名称,包括了类所在包名,如实现类名定义为com.shere.common.keyexecutor.KeyExecutor,表示这个类所在包为com.shere.common.keyexecutor,类名为KeyExecutor,位于xxx.jar库中;其中“库所在的路径”和“库中实现功能的类名”是在执行二进制文件app_process时,传递给它的两个参数。
CN201711022023.2A 2017-10-26 2017-10-26 一种利用java反射机制进行截屏的方法 Pending CN107807835A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201711022023.2A CN107807835A (zh) 2017-10-26 2017-10-26 一种利用java反射机制进行截屏的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201711022023.2A CN107807835A (zh) 2017-10-26 2017-10-26 一种利用java反射机制进行截屏的方法

Publications (1)

Publication Number Publication Date
CN107807835A true CN107807835A (zh) 2018-03-16

Family

ID=61582478

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201711022023.2A Pending CN107807835A (zh) 2017-10-26 2017-10-26 一种利用java反射机制进行截屏的方法

Country Status (1)

Country Link
CN (1) CN107807835A (zh)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110216013A1 (en) * 2010-03-05 2011-09-08 Sony Ericsson Mobile Communications Ab Touch-sensitive input device, touch screen device, mobile device and method for operating a touch-sensitive input device
CN106371752A (zh) * 2016-08-30 2017-02-01 竞技世界(北京)网络技术有限公司 一种安卓系统智能终端的虚拟按键实现方法及装置
CN106406914A (zh) * 2016-11-11 2017-02-15 武汉斗鱼网络科技有限公司 安卓系统窗口数据的获取方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110216013A1 (en) * 2010-03-05 2011-09-08 Sony Ericsson Mobile Communications Ab Touch-sensitive input device, touch screen device, mobile device and method for operating a touch-sensitive input device
CN106371752A (zh) * 2016-08-30 2017-02-01 竞技世界(北京)网络技术有限公司 一种安卓系统智能终端的虚拟按键实现方法及装置
CN106406914A (zh) * 2016-11-11 2017-02-15 武汉斗鱼网络科技有限公司 安卓系统窗口数据的获取方法及装置

Similar Documents

Publication Publication Date Title
CN106371752B (zh) 一种安卓系统智能终端的虚拟按键实现方法及装置
CN107765972A (zh) 一种安卓终端截屏方法
RU2491608C2 (ru) Доступ к меню с использованием операции перетаскивания
CN103135969B (zh) 应用程序的操作、生成、启动的方法及其装置
WO2019206158A1 (zh) 一种界面显示方法、装置及设备
CN105144058B (zh) 延迟放置提示
CN103294398A (zh) 基于悬浮式虚拟窗口操控显示终端的方法和装置
CN106648779A (zh) 一种智能终端悬浮窗权限设置方法
CN104050417A (zh) 一种在移动终端对软件状态进行检测的方法及装置
JPH1091413A (ja) コンピュータ・システムにおける操作の選択装置及び方法
EP4206883A1 (en) Permission setting method and apparatus and electronic device
CN103136018A (zh) 一种基本输入输出系统bios的设置方法及系统
WO2022076049A1 (en) Systems and methods for providing tab previews via an operating system user interface
CN108170438A (zh) 一种应用程序自动安装方法、终端及计算机可读介质
CN104765802B (zh) 网页页面展示方法和装置
CN104298434B (zh) 一种信息处理方法及电子设备
CN106775213B (zh) 一种切换桌面的方法及终端
WO2023029747A1 (zh) 一种应用单例功能的实现方法和装置
JP2012226726A (ja) Biosを設定するための接触制御方法およびその方法を用いたコンピュータ・システム
CN106569932B (zh) 控制应用程序开启的方法及装置
CN103257788A (zh) 一种windows桌面动态图标形成方法
TWI515643B (zh) 電子裝置的操作方法
CN107704304A (zh) 一种利用java反射机制进行灭屏的方法
CN107728888B (zh) 一种安卓终端虚拟按键实现方法
CN107807835A (zh) 一种利用java反射机制进行截屏的方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
RJ01 Rejection of invention patent application after publication

Application publication date: 20180316

RJ01 Rejection of invention patent application after publication