android悬浮窗状态下的点击、滑动:
提前的准备
- 需要到下载android源码中两个文件,可通过http://aospxref.com/ 或者http://androidxref.com/(更新慢)进行下载
- 下载路径/build/target/product/security里面的platform.pk8和platform.x509.pem
- 准备linux服务器
- 下载上述工具。keytool-importkeypair文件可通过https://github.com/getfatday/keytool-importkeypair 下载
- linux服务中配置java环境,下载jdk官网:https://www.oracle.com/java/technologies/downloads/#java8
- 目前在官网下载低于jdk1.8的java jdk的时候需要登陆,账号:913898356@qq.com 密码:Oracle123.
- 服务器解压:tar -zxvf jdk-8u181-linux-x64.tar.gz
- 删除压缩包:rm -f jdk-8u181-linux-x64.tar.gz
- 配置环境变量:vim /etc/profile 按I进入添加,ESC后输入:wq 保存退出
export JAVA_HOME=/usr/local/jdk1.8.0_311
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:${JAVA_PATH}
- 通过命令source /etc/profile让profile文件立即生效
- java -version 检查是否安装成功。
将自己的keystore打成系统级
- 成功后 在keytool-importkeypair相关工具 解压后的目录中进入控制台,输入以下内容:
./keytool-importkeypair -k debug.keystore -p android(密码,不要带这个括号里的) -pk8 platform.pk8 -cert platform.x509.pem -alias platform
替换本地keystore
- 生成后的debug.keystore替换 本地开发环境中.android/debug.keystore文件。
- AndroidManifest.xml 中的 增加android:sharedUserId="android.uid.system
- AndroidManifest.xml 增加权限
以上基本配置完成
点击逻辑(仅供参考):
fun touchDownAndUp(x: Int, y: Int, maxX:Int=-1,maxY:Int=-1,delayTime: Long = 50) {
Thread {
kotlin.run {
try {
val toX =when{
maxX==-1||maxY==-1->x
else->when{
x>maxX->(maxX..x).random()
else->(x..maxX).random()
}
}
val toY =when{
maxX==-1||maxY==-1->y
else->when{
y>maxX->(maxY..y).random()
else->(y..maxY).random()
}
}
val inst = Instrumentation()
val dowTime = SystemClock.uptimeMillis()
inst.sendPointerSync(
MotionEvent.obtain(
dowTime, dowTime,
MotionEvent.ACTION_DOWN, toX.toFloat(), toY.toFloat(), 0
)
)
inst.sendPointerSync(
MotionEvent.obtain(
dowTime + delayTime, dowTime + delayTime,
MotionEvent.ACTION_UP, toX.toFloat(), toY.toFloat(), 0
)
)
} catch (e: Exception) {
e.printStackTrace()
}
}
}.start()
}
滑动逻辑(仅供参考):
fun touchMove(x: Int, y: Int, toX: Int, toY: Int, delayTime: Long = 100) {
Thread {
kotlin.run {
try {
val inst = Instrumentation()
val pTime = delayTime.div(10)
val pX = when {
toX - x == 0 -> {
0
}
else -> {
(toX - x).div(10)
}
}
val pY = when {
toY - y == 0 -> {
0
}
else -> {
(toY - y).div(10)
}
}
val dowTime = SystemClock.uptimeMillis()
inst.sendPointerSync(
MotionEvent.obtain(
dowTime, dowTime,
MotionEvent.ACTION_DOWN, x.toFloat(), y.toFloat(), 0
)
)
for (i in 0..10) {
inst.sendPointerSync(
MotionEvent.obtain(
dowTime, dowTime + pTime.times(i),
MotionEvent.ACTION_MOVE,
x.plus(pX.times(i)).toFloat(),
y.plus(pY.times(i)).toFloat(),
0
)
)
}
inst.sendPointerSync(
MotionEvent.obtain(
dowTime + delayTime, dowTime + delayTime,
MotionEvent.ACTION_UP, toX.toFloat(), toY.toFloat(), 0
)
)
} catch (e: Exception) {
e.printStackTrace()
}
}
}.start()
}