1.首先控制悬浮窗要用service
2.悬浮窗的参数
移除的时候要wm.removeViewImmediate(v);
3.LinearLayout的边框,用drawable类型的xml画出
---------------------------------------------虚拟按键
分为两种思路,一种是使用系统签名+反射机制,一种是root
前一种,如果有签名的很方便,后一种可以适用大多是机型。
1.反射方法调用按键,反射+签名+特殊权限+平台编译
<uses-permission android:name="android.permission.INJECT_EVENTS" />
2.root方式
获得root权限,模拟在android机器上在shell中输入命令模拟按键
代码源于这里:
http://leoly-fullnexus4.googlecode.com/svn/trunk/FullNexus4/
要导入其中的类库。
2.悬浮窗的参数
- if (wm == null)
- wm = (WindowManager) getApplicationContext().getSystemService("window");
- if (ballWmParams == null) {
- ballWmParams = new WindowManager.LayoutParams();// ((MyApplication)
- // getApplication()).getMywmParams();
- ballWmParams.type = WindowManager.LayoutParams.TYPE_PHONE;
- ballWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- ballWmParams.gravity = Gravity.LEFT | Gravity.TOP;
- ballWmParams.x = 50;
- ballWmParams.y = 50;
- ballWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
- ballWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
- ballWmParams.format = PixelFormat.RGBA_8888;
- // 添加显示层
- }
- wm.addView(ballView, ballWmParams);
移除的时候要wm.removeViewImmediate(v);
3.LinearLayout的边框,用drawable类型的xml画出
- <?xml version="1.0" encoding="UTF-8"?>
- <shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="rectangle" >
- <gradient
- android:angle="180"
- android:centerX="5"
- android:centerY="5"
- android:endColor="#22080808"
- android:gradientRadius="100"
- android:startColor="#ddffffff"
- android:type="radial" />
- <stroke
- android:dashWidth="2dp"
- android:width="2dp"
- android:color="#99ffffff" />
- <corners android:radius="5dp" />
- <!-- <solid android:color="#11ffffff" /> -->
- <padding
- android:bottom="1dp"
- android:left="1dp"
- android:right="1dp"
- android:top="1dp" />
- </shape>
---------------------------------------------虚拟按键
分为两种思路,一种是使用系统签名+反射机制,一种是root
前一种,如果有签名的很方便,后一种可以适用大多是机型。
1.反射方法调用按键,反射+签名+特殊权限+平台编译
<uses-permission android:name="android.permission.INJECT_EVENTS" />
- void test() {
- new Thread() {
- public void run() {
- KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);
- KeyEvent keyEventUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);
- final int repeatCount = (KeyEvent.FLAG_VIRTUAL_HARD_KEY & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;
- final KeyEvent evDown = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
- KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD,
- 0, KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
- InputDevice.SOURCE_KEYBOARD);
- final KeyEvent evUp = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),
- KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
- KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
- InputDevice.SOURCE_KEYBOARD);
- Class<?> ClassInputManager;
- try {
- ClassInputManager = Class.forName("android.hardware.input.InputManager");
- Method[] methods = ClassInputManager.getMethods();
- System.out.println("cchen " + Arrays.toString(methods));
- Method methodInjectInputEvent = null;
- Method methodGetInstance = null;
- for (Method method : methods) {
- System.out.println("cchen " + method.getName());
- if (method.getName().contains("getInstance")) {
- methodGetInstance = method;
- }
- if (method.getName().contains("injectInputEvent")) {
- methodInjectInputEvent = method;
- }
- }
- Object instance = methodGetInstance.invoke(ClassInputManager, null);
- boolean bool = InputManager.class.isInstance(instance);
- System.out.println("cchen -- " + bool);
- // methodInjectInputEvent =
- // InputManager.getMethod("injectInputEvent",
- // KeyEvent.class, Integer.class);
- methodInjectInputEvent.invoke(instance, evDown, 0);
- methodInjectInputEvent.invoke(instance, evUp, 0);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }.start();
- }
2.root方式
获得root权限,模拟在android机器上在shell中输入命令模拟按键
代码源于这里:
http://leoly-fullnexus4.googlecode.com/svn/trunk/FullNexus4/
要导入其中的类库。
- // String apkRoot="chmod 777 "+getPackageCodePath();
- // RootCommand(apkRoot);
- // full();
- ublic static boolean RootCommand(String command) {
- Process process = null;
- DataOutputStream os = null;
- try {
- process = Runtime.getRuntime().exec("su");
- os = new DataOutputStream(process.getOutputStream());
- os.writeBytes(command + "\n");
- os.writeBytes("exit\n");
- os.flush();
- process.waitFor();
- } catch (Exception e) {
- Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
- return false;
- } finally {
- try {
- if (os != null) {
- os.close();
- }
- process.destroy();
- } catch (Exception e) {
- }
- }
- Log.d("*** DEBUG ***", "Root SUC ");
- return true;
- }
- private void full() {
- try {
- InputShell localInputShell = getInputShell();
- String str1 = "keycode " + KeyEvent.KEYCODE_BACK;
- localInputShell.runCommand(str1);
- } catch (Exception localException) {
- String str2 = localException.getMessage();
- Log.e("Button Savior", str2);
- localException.printStackTrace();
- }
- }
- public InputShell getInputShell() throws Exception {
- String str1 = null;
- InputStream localInputStream = null;
- FileOutputStream localFileOutputStream = null;
- byte[] arrayOfByte = new byte[4096];
- InputShell localInputShell1 = this.mInputShell;
- AssetManager localAssetManager;
- File localFile;
- int m;
- if (localInputShell1 == null) {
- localAssetManager = this.getApplicationContext().getResources().getAssets();
- str1 = this.getApplicationContext().getFilesDir().getAbsolutePath();
- int i = Build.VERSION.SDK_INT;
- if (i > 15) {
- Log.d("button", "using JB code");
- String str2 = str1 + "/input2_jb.jar";
- localFile = new File(str2);
- str2 = "input2_jb.jar";
- localInputStream = localAssetManager.open(str2);
- } else if (i > 10 && i < 16) {
- String str2 = str1 + "/input2_hc.jar";
- localFile = new File((String) str2);
- str2 = "input2_hc.jar";
- localInputStream = localAssetManager.open(str2);
- } else {
- String str2 = str1 + "/input2.jar";
- localFile = new File(str2);
- str2 = "input2.jar";
- localInputStream = localAssetManager.open(str2);
- }
- localFileOutputStream = new FileOutputStream(localFile);
- m = localInputStream.read(arrayOfByte);
- if (m == -1)
- return null;
- localFileOutputStream.write(arrayOfByte, 0, m);
- localFileOutputStream.close();
- localInputStream.close();
- this.mInputShell = new InputShell("su", str1);
- }
- return this.mInputShell;
- }