android---利用反射实现的屏幕录制技术
来源:互联网 发布:淘宝达人有什么用 编辑:程序博客网 时间:2024/05/19 11:49
ScreenShotService.java
package com.screenshot.ui; import android.annotation.SuppressLint; import android.app.Service; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Environment; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.view.View; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.Field; public class ScreenShotService extends Service { public static final boolean SSS_DEFAULT_START = false; public static final boolean SSS_START = true; public static final boolean SSS_STOP = false; public static final String TRANSCRIBE_TAG = "TRANSCRIBE_TAG"; public static final long SSS_DELAY_MILLIS = 100L; public static final String SSS_FILE_PATH = "/luzhi/"; public static final int SSS_MSG_WHAT = 256; private ScreenShotServiceHandler handler; private boolean isStart = SSS_STOP; private View[] getWindowDecorViews() throws Exception { Class<?> windowManager = Class .forName("android.view.WindowManagerImpl"); Field viewsField = windowManager.getDeclaredField("mViews"); Field instanceField = windowManager.getDeclaredField("mWindowManager"); viewsField.setAccessible(true); instanceField.setAccessible(true); Object instance = instanceField.get(null); View[] viewarray = (View[]) viewsField.get(instance); if ((viewarray == null) || (viewarray.length < 0)) { return null; } int i = 0; View[] views = new View[viewarray.length]; for (View v : viewarray) { views[i++] = v; } int[] arrayOfInt = new int[2]; View localView; int j = 0; int length = views.length; for (i = 0; i < length; i++) { localView = views[i]; localView.getLocationOnScreen(arrayOfInt); if ((arrayOfInt[0] > 0) || (arrayOfInt[1] > 0)) { for (j = i + 1; j < views.length; j++) { views[j - 1] = views[j]; } views[views.length - 1] = localView; length--; i--; } } return views; } private void savePic(Bitmap paramBitmap, String paramString) { FileOutputStream fos = null; try { fos = new FileOutputStream(paramString); if (null != fos) { paramBitmap.compress(Bitmap.CompressFormat.PNG, 90, fos); fos.flush(); fos.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private void screenShot() { try { View[] arrayOfView = getWindowDecorViews(); Bitmap localBitmap = view2Bitmap(arrayOfView); new saveFileThread(localBitmap).start(); } catch (Exception localException) { localException.printStackTrace(); } } private Bitmap view2Bitmap(View paramView) { Log.e("saveFileThread view2Bitmap(View view)"); paramView.setDrawingCacheEnabled(true); paramView.buildDrawingCache(); Bitmap localBitmap1 = paramView.getDrawingCache(); Bitmap localBitmap2 = null; if (localBitmap1 != null) { localBitmap2 = Bitmap.createBitmap(localBitmap1); } paramView.destroyDrawingCache(); return localBitmap2; } private Bitmap view2Bitmap(View[] paramArrayOfView) { Canvas localCanvas = null; Paint localPaint = null; Bitmap newbitmap = null; int[] arrayOfInt = new int[2]; for (View localView : paramArrayOfView) { Bitmap localBitmap = view2Bitmap(localView); localView.getLocationOnScreen(arrayOfInt); if (localBitmap != null) { if (localCanvas == null) { newbitmap = Bitmap.createBitmap(localView.getWidth(), localView.getHeight(), Config.ARGB_8888);// 创建一个新的和SRC localCanvas = new Canvas(newbitmap); localPaint = new Paint(); } localCanvas.drawBitmap(localBitmap, arrayOfInt[0], arrayOfInt[1], localPaint); localBitmap.recycle(); localBitmap = null; } } if (localCanvas != null) { localCanvas.save(Canvas.ALL_SAVE_FLAG);// 保存 localCanvas.restore();// 存储 } return newbitmap; } public IBinder onBind(Intent paramIntent) { return null; } public void onCreate() { super.onCreate(); Log.e("ScreenShotService onCreate"); handler = new ScreenShotServiceHandler(); } public void onStart(Intent paramIntent, int paramInt) { super.onStart(paramIntent, paramInt); Log.e("ScreenShotService onStart -----start----"); String str = TRANSCRIBE_TAG; boolean localstart = paramIntent .getBooleanExtra(str, SSS_DEFAULT_START); if (this.isStart != localstart) { this.isStart = localstart; if (this.isStart == SSS_START) { handler.sendEmptyMessageDelayed(SSS_MSG_WHAT, SSS_DELAY_MILLIS); } else { handler.removeMessages(SSS_MSG_WHAT); } } } @SuppressLint({ "HandlerLeak", "HandlerLeak" }) private class ScreenShotServiceHandler extends Handler { public void handleMessage(Message paramMessage) { if (paramMessage.what == SSS_MSG_WHAT) { ScreenShotService.this.screenShot(); if (ScreenShotService.this.isStart) { ScreenShotService.this.handler.sendEmptyMessageDelayed( SSS_MSG_WHAT, SSS_DELAY_MILLIS); } } } } private class saveFileThread extends Thread { private Bitmap mbitmap; public saveFileThread(Bitmap arg2) { this.mbitmap = arg2; } public void run() { if (this.mbitmap == null) { Log.e("saveFileThread run mbitmap is null "); } File localFile1 = Environment.getExternalStorageDirectory(); File localFile2 = new File(localFile1, SSS_FILE_PATH); if (!localFile2.exists()) { localFile2.mkdirs(); } String filename = localFile2.getAbsolutePath() + "/" + System.currentTimeMillis() + ".png"; Log.e("saveFileThread run picPath = " + filename); ScreenShotService.this.savePic(mbitmap, filename); this.mbitmap.recycle(); this.mbitmap = null; } } }
PlayActivity.java
package com.screenshot.ui; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.view.Window; import android.view.WindowManager; import android.widget.ImageView; import java.io.File; import java.util.Arrays; import java.util.Comparator; import com.screenshot.R; public class PlayActivity extends Activity { private PlayActivityHandler mHandler; private ImageView play_iv; private File[] arrayOfFile2; private File[] getFileList() { File localFile1 = Environment.getExternalStorageDirectory(); File localFile2 = new File(localFile1, ScreenShotService.SSS_FILE_PATH); File[] arrayOfFile; if (!localFile2.exists()) { return null; } arrayOfFile = localFile2.listFiles(); Arrays.sort(arrayOfFile, new Comparator<File>() { @Override public int compare(File paramFile1, File paramFile2) { long file1name = Long.valueOf(getFileNameNoEx(paramFile1 .getName())); long file2name = Long.valueOf(getFileNameNoEx(paramFile2 .getName())); return (int) (file1name - file2name); } }); return arrayOfFile; } private void play() { arrayOfFile2 = getFileList(); mHandler.setCount(0); mHandler.sendEmptyMessageDelayed(ScreenShotService.SSS_MSG_WHAT, ScreenShotService.SSS_DELAY_MILLIS); } public String getExtensionName(String paramString) { if ((paramString != null) && (paramString.length() > 0)) { int i = paramString.lastIndexOf('.'); if (i > -1) { int j = paramString.length() + -1; if (i < j) { int k = i + 1; paramString = paramString.substring(k); } } } return paramString; } public String getFileNameNoEx(String paramString) { if ((paramString != null) && (paramString.length() > 0)) { int i = paramString.lastIndexOf('.'); if (i > -1) { int j = paramString.length(); if (i < j) paramString = paramString.substring(0, i); } } return paramString; } protected void onCreate(Bundle paramBundle) { super.onCreate(paramBundle); // 设置无标题 requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.play); this.play_iv = (ImageView) findViewById(R.id.play_iv); mHandler = new PlayActivityHandler(); play(); } private class PlayActivityHandler extends Handler { private int count = 0; //private Bitmap localBitmap; public void setCount(int vaule) { count = vaule; } @Override public void handleMessage(Message msg) { if (arrayOfFile2 != null && count < arrayOfFile2.length) { Bitmap localBitmap = BitmapFactory .decodeFile(arrayOfFile2[count++].getAbsolutePath()); play_iv.setImageBitmap(localBitmap); mHandler.sendEmptyMessageDelayed( ScreenShotService.SSS_MSG_WHAT, ScreenShotService.SSS_DELAY_MILLIS); } } } }
- android---利用反射实现的屏幕录制技术
- android---利用反射实现的屏幕录制技术
- android---利用反射实现的屏幕录制技术
- Android录制屏幕的实现方法
- Android 中利用反射技术实现加减乘除
- Android Lollipop (5.0) 屏幕录制实现
- Android中利用5.0系统屏幕录制UI漏洞骗取应用录制屏幕授权
- Android中利用5.0系统屏幕录制UI漏洞骗取应用录制屏幕授权
- Android 中利用反射技术
- 屏幕录制在h323上的实现
- 录制Android屏幕Gif的方法
- 利用反射技术实现POJO的数据库操作
- C#实现屏幕录制
- Android 录制屏幕工具
- Android移植ffmpeg.so实现屏幕录制功能(上)
- Android移植ffmpeg.so实现屏幕录制功能(下)
- android屏幕录制adb及转换gif实现
- Android视频录制--屏幕录制
- HDU 1009
- 如何获得android手机拍照后照片的存放目录
- BeautifulSoup库的基本使用说明-01
- Flex入门指南—PHP开发者
- Install Greenplum Hadoop on VirtualBox 4.2 + centos 6.2
- android---利用反射实现的屏幕录制技术
- Android 开发之多线程处理、Handler 详解
- linux下破解Python集成开发环境WingIDE4.1,以及使用PyCharm的使用
- GPT转MBR分区格式图文教程
- poj 1207 3n+1
- 嵌入式经典笔试题-----不看后悔啊
- XP下,文件夹添加右键命令行
- PowerDesigner15使用时的十五个问题
- 按钮形状---超链接