公司估计后面会增加业务,远程遥控安卓手机,模拟手机全部操作。趁着现在没事干,感觉了解这方面知识,以便项目开工时,不会临时抱佛脚.
本文章写一点干货, 模拟我们的解锁,关屏,动作。最近一些滑动解锁广告APP异常多。 滑动解锁能赚点话费。今天我们拿惠屏锁来试验下。
Activity:
package com.lxy.smarthuisuoping;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyServer.act = this;
startService(new Intent(this, MyServer.class));
}
}
里面就启动一个服务,没啥说的。
Service:
package com.lxy.smarthuisuoping;
import java.io.DataOutputStream;
import java.io.OutputStream;
import android.app.Activity;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;
import android.widget.Toast;
public class MyServer extends Service {
public static Activity act;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
boolean b = true; //结束循环
long time = 0;;
PowerManager pm; //电源管理
PowerManager.WakeLock pm_wl;
.//初始化
private void init() {
time = System.currentTimeMillis();
// kl.disableKeyguard(); // 解锁
pm = (PowerManager) act.getSystemService(Context.POWER_SERVICE);
pm_wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
// 进入input 目录下
execShellCmd("input keyevent “value”");
}
@Override
@Deprecated
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
init();
<span style="font-family: Arial, Helvetica, sans-serif;">//进入工作线程</span>
MyApplication.postToWorkerThread(new Runnable() {
@Override
public void run() {
int i = 0;
//开个循环
while (b) {
i++;
//模拟Home键
execShellCmd("input keyevent 3");
sleep(1000);
Log("模拟电源键");
execShellCmd("input keyevent 26");
sleep(3000);
bright();
sleep(500);
Log("滑动解锁"); // 开始坐标x y x y
execShellCmd("input swipe 365 1096 579 1111");
sleep(1000);
// 运行 40秒停止!
if ((System.currentTimeMillis() - time) / 1000 >= (1 * 40)) {
MyApplication.stopSever();
Log("时间停止服务");
break;
}
// 程序运行100次停止
if (i > 100) {
MyApplication.stopSever();
Log("停止服务");
break;
}
}
}
});
}
//等待
private void sleep(long l) {
try {
Thread.sleep(l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 执行shell命令
*
* @param cmd
*/
private void execShellCmd(String cmd) {
try {
// 申请获取root权限,这一步很重要,不然会没有作用
Process process = Runtime.getRuntime().exec("su");
// 获取输出流
OutputStream outputStream = process.getOutputStream();
DataOutputStream dataOutputStream = new DataOutputStream(
outputStream);
dataOutputStream.writeBytes(cmd);
dataOutputStream.flush();
dataOutputStream.close();
outputStream.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
@Override
public void onCreate() {
super.onCreate();
}
public void toast(final String info) {
MyApplication.postToMainThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplication(), info, 1).show();
}
});
}
int i = 0;
private void Log(String info) {
Log.e("", info);
}
// 开屏
private void bright() {
Log("...........开屏");
// KeyguardManager km = (KeyguardManager)
// XTApplication.getInstance()
// .getSystemService(Context.KEYGUARD_SERVICE);// 得到键盘锁管理器对象
// KeyguardLock kl = km.newKeyguardLock("unLock");
pm_wl.acquire();
pm_wl.release();// 发出命令
}
}
需要root权限
通过CMD 的 adb shell 模拟各作物理按键 也能模拟 屏幕 点击 滑动事件
附上比较常用的 按键值:
input keyevent 3 // Home
input keyevent 4 // Back
input keyevent 19 //Up
input keyevent 20 //Down
input keyevent 21 //Left
input keyevent 22 //Right
input keyevent 23 //Select/Ok
input keyevent 24 //Volume+
input keyevent 25 // Volume-
input keyevent 82 // Menu 菜单
input tap <x> <y> //点击input swipe <x1> <y1> <x2> <y2> //滑动