悬浮菜单+虚拟按键
1.首先控制悬浮窗要用service
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-permissionandroid: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(); public 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; }
--------------------------------------------
整个源码上传到http://download.csdn.net/detail/ccsosnfs/5790721
相关推荐
huha 2020-10-16
xfcyhades 2020-11-20
sgafdsg 2020-11-04
Michael 2020-11-03
fengyeezju 2020-10-14
ziyexiaoxiao 2020-10-14
业余架构师 2020-10-09
OuNuo0 2020-09-29
moses 2020-09-22
Angelia 2020-09-11
qinxu 2020-09-10
刘炳昭 2020-09-10
Nostalgiachild 2020-09-07
Nostalgiachild 2020-08-17
leavesC 2020-08-14
一青年 2020-08-13
AndroidAiStudy 2020-08-07
ydc0 2020-07-30
绿豆饼 2020-07-28