悬浮菜单+虚拟按键

1.首先控制悬浮窗要用service 

2.悬浮窗的参数 

Java代码   收藏代码
  1. if (wm == null)  
  2.     wm = (WindowManager) getApplicationContext().getSystemService("window");  
  3. if (ballWmParams == null) {  
  4.     ballWmParams = new WindowManager.LayoutParams();// ((MyApplication)  
  5.                                                     // getApplication()).getMywmParams();  
  6.     ballWmParams.type = WindowManager.LayoutParams.TYPE_PHONE;  
  7.     ballWmParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;  
  8.     ballWmParams.gravity = Gravity.LEFT | Gravity.TOP;  
  9.     ballWmParams.x = 50;  
  10.     ballWmParams.y = 50;  
  11.     ballWmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  12.     ballWmParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  13.     ballWmParams.format = PixelFormat.RGBA_8888;  
  14.     // 添加显示层  
  15. }  
  16. wm.addView(ballView, ballWmParams);  


移除的时候要wm.removeViewImmediate(v); 

3.LinearLayout的边框,用drawable类型的xml画出 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle" >  
  4.   
  5.     <gradient  
  6.         android:angle="180"  
  7.         android:centerX="5"  
  8.         android:centerY="5"  
  9.         android:endColor="#22080808"  
  10.         android:gradientRadius="100"  
  11.         android:startColor="#ddffffff"  
  12.         android:type="radial" />  
  13.   
  14.     <stroke  
  15.         android:dashWidth="2dp"  
  16.         android:width="2dp"  
  17.         android:color="#99ffffff" />  
  18.   
  19.     <corners android:radius="5dp" />  
  20.     <!-- <solid android:color="#11ffffff" /> -->  
  21.     <padding  
  22.         android:bottom="1dp"  
  23.         android:left="1dp"  
  24.         android:right="1dp"  
  25.         android:top="1dp" />  
  26.   
  27. </shape>  



---------------------------------------------虚拟按键 

分为两种思路,一种是使用系统签名+反射机制,一种是root 
前一种,如果有签名的很方便,后一种可以适用大多是机型。 




1.反射方法调用按键,反射+签名+特殊权限+平台编译 
    <uses-permission android:name="android.permission.INJECT_EVENTS" /> 


Java代码   收藏代码
  1. void test() {  
  2.   
  3.         new Thread() {  
  4.             public void run() {  
  5.                 KeyEvent keyEventDown = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK);  
  6.                 KeyEvent keyEventUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK);  
  7.                 final int repeatCount = (KeyEvent.FLAG_VIRTUAL_HARD_KEY & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;  
  8.                 final KeyEvent evDown = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),  
  9.                         KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD,  
  10.                         0, KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,  
  11.                         InputDevice.SOURCE_KEYBOARD);  
  12.   
  13.                 final KeyEvent evUp = new KeyEvent(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(),  
  14.                         KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK, repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,  
  15.                         KeyEvent.FLAG_VIRTUAL_HARD_KEY | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,  
  16.                         InputDevice.SOURCE_KEYBOARD);  
  17.   
  18.                 Class<?> ClassInputManager;  
  19.                 try {  
  20.                     ClassInputManager = Class.forName("android.hardware.input.InputManager");  
  21.                     Method[] methods = ClassInputManager.getMethods();  
  22.                     System.out.println("cchen " + Arrays.toString(methods));  
  23.                     Method methodInjectInputEvent = null;  
  24.                     Method methodGetInstance = null;  
  25.                     for (Method method : methods) {  
  26.                         System.out.println("cchen " + method.getName());  
  27.                         if (method.getName().contains("getInstance")) {  
  28.                             methodGetInstance = method;  
  29.                         }  
  30.                         if (method.getName().contains("injectInputEvent")) {  
  31.                             methodInjectInputEvent = method;  
  32.                         }  
  33.                     }  
  34.                     Object instance = methodGetInstance.invoke(ClassInputManager, null);  
  35.                     boolean bool = InputManager.class.isInstance(instance);  
  36.                     System.out.println("cchen  -- " + bool);  
  37.                     // methodInjectInputEvent =  
  38.                     // InputManager.getMethod("injectInputEvent",  
  39.                     // KeyEvent.class, Integer.class);  
  40.                     methodInjectInputEvent.invoke(instance, evDown, 0);  
  41.                     methodInjectInputEvent.invoke(instance, evUp, 0);  
  42.                 } catch (Exception e) {  
  43.                     e.printStackTrace();  
  44.                 }  
  45.             }  
  46.         }.start();  
  47.     }  



2.root方式 

获得root权限,模拟在android机器上在shell中输入命令模拟按键 

代码源于这里: 
http://leoly-fullnexus4.googlecode.com/svn/trunk/FullNexus4/  

要导入其中的类库。 

Java代码   收藏代码
  1.         // String apkRoot="chmod 777 "+getPackageCodePath();  
  2.         // RootCommand(apkRoot);  
  3.         // full();  
  4.   
  5. ublic static boolean RootCommand(String command) {  
  6.     Process process = null;  
  7.     DataOutputStream os = null;  
  8.     try {  
  9.         process = Runtime.getRuntime().exec("su");  
  10.         os = new DataOutputStream(process.getOutputStream());  
  11.         os.writeBytes(command + "\n");  
  12.         os.writeBytes("exit\n");  
  13.         os.flush();  
  14.         process.waitFor();  
  15.     } catch (Exception e) {  
  16.         Log.d("*** DEBUG ***""ROOT REE" + e.getMessage());  
  17.         return false;  
  18.     } finally {  
  19.         try {  
  20.             if (os != null) {  
  21.                 os.close();  
  22.             }  
  23.             process.destroy();  
  24.         } catch (Exception e) {  
  25.         }  
  26.     }  
  27.     Log.d("*** DEBUG ***""Root SUC ");  
  28.     return true;  
  29. }  
  30.   
  31. private void full() {  
  32.     try {  
  33.         InputShell localInputShell = getInputShell();  
  34.         String str1 = "keycode " + KeyEvent.KEYCODE_BACK;  
  35.         localInputShell.runCommand(str1);  
  36.     } catch (Exception localException) {  
  37.         String str2 = localException.getMessage();  
  38.         Log.e("Button Savior", str2);  
  39.         localException.printStackTrace();  
  40.     }  
  41. }  
  42.   
  43. public InputShell getInputShell() throws Exception {  
  44.     String str1 = null;  
  45.     InputStream localInputStream = null;  
  46.     FileOutputStream localFileOutputStream = null;  
  47.     byte[] arrayOfByte = new byte[4096];  
  48.     InputShell localInputShell1 = this.mInputShell;  
  49.     AssetManager localAssetManager;  
  50.     File localFile;  
  51.     int m;  
  52.     if (localInputShell1 == null) {  
  53.         localAssetManager = this.getApplicationContext().getResources().getAssets();  
  54.         str1 = this.getApplicationContext().getFilesDir().getAbsolutePath();  
  55.         int i = Build.VERSION.SDK_INT;  
  56.         if (i > 15) {  
  57.             Log.d("button""using JB code");  
  58.             String str2 = str1 + "/input2_jb.jar";  
  59.             localFile = new File(str2);  
  60.             str2 = "input2_jb.jar";  
  61.             localInputStream = localAssetManager.open(str2);  
  62.         } else if (i > 10 && i < 16) {  
  63.             String str2 = str1 + "/input2_hc.jar";  
  64.             localFile = new File((String) str2);  
  65.             str2 = "input2_hc.jar";  
  66.             localInputStream = localAssetManager.open(str2);  
  67.         } else {  
  68.             String str2 = str1 + "/input2.jar";  
  69.             localFile = new File(str2);  
  70.             str2 = "input2.jar";  
  71.             localInputStream = localAssetManager.open(str2);  
  72.         }  
  73.   
  74.         localFileOutputStream = new FileOutputStream(localFile);  
  75.         m = localInputStream.read(arrayOfByte);  
  76.         if (m == -1)  
  77.             return null;  
  78.         localFileOutputStream.write(arrayOfByte, 0, m);  
  79.         localFileOutputStream.close();  
  80.         localInputStream.close();  
  81.         this.mInputShell = new InputShell("su", str1);  
  82.     }  
  83.     return this.mInputShell;  
  84. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值