android 截图,网络发送,只需1.8秒

时间:2021-02-24 15:23:50

【功能说明】

此功能,不但可以截安卓OSD层,还可以截取Video层。代码可以直接用,不懂得可以留言,谢谢!


【编码前的原理分析】

1.通过类名获取类:

Class SurfaceControl= Class.forName("android.view.SurfaceControl");

参数1:类的包名


2.获取方法:

Method method = SurfaceControl.getMethod("screenshot", Integer.class);   

参数1:类的方法

参数2:参数列表 -- 参数是按声明顺序标识,该方法形参类型的Class 对象的一个数组。

    如果 parameterTypes 为 null,则按空数组处理。


3.调用方法:

method.invoke(SurfaceControl, 1000,1000);

参数1:类实例对象

参数2:方法参数1

参数3:方法参数2

(注意:invoke的返回值是class,那么,根据自己所调用的方法的返回值的类型,对class返回值进行强制类型转换一下,就可以了!

例如:object obj =Method.Invoke(..)方法得到返回值是object,如何实现转换呢? ---- (string[])obj 


【本人项目代码】

1.截图工具类

package com.harison.terminalMonitoring;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.WindowManager;
public class ScreentShotUtil{
private static final String TAG = "ScreentShotUtil";
private static final String CLASS1_NAME = "android.view.SurfaceControl";
private static final String CLASS2_NAME = "android.view.Surface";
private static final String METHOD_NAME = "screenshot";
private static ScreentShotUtil instance;
private Display mDisplay;
private DisplayMetrics mDisplayMetrics;
private Matrix mDisplayMatrix;
private WindowManager wm;
private SimpleDateFormat format;
private ScreentShotUtil()
{

}

public static ScreentShotUtil getInstance()
{
synchronized (ScreentShotUtil.class)
{
if (instance == null)
{
instance = new ScreentShotUtil();
}
}
return instance;
}

public Bitmap screenShot(int width, int height){
Method method = null;try{if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2){surfaceClass = Class.forName(CLASS1_NAME);}else{surfaceClass = Class.forName(CLASS2_NAME);}surfaceClass = Class.forName(CLASS1_NAME);method = surfaceClass.getDeclaredMethod(METHOD_NAME, int.class, int.class);method.setAccessible(true);return (Bitmap) method.invoke(null, width, height);}catch (NoSuchMethodException e){Log.e(TAG, e.toString());}catch (IllegalArgumentException e){Log.e(TAG, e.toString());}catch (IllegalAccessException e){Log.e(TAG, e.toString());}catch (InvocationTargetException e){Log.e(TAG, e.toString());}catch (ClassNotFoundException e){Log.e(TAG, e.toString());}return null;}}
2.代码的调用

   Bitmap bmp = ScreentShotUtil.getInstance().screenShot(500, 500);   //这个在不影响显示的情况下,尽量小  ---- 可以节省时间
3.Bitmap 转 byte[],进行网络发送数据准备  --- 因为本人网络通讯,数据都是转换为    byte[]

public static byte[] Bitmap2Bytes(Bitmap bm) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
return baos.toByteArray();
}

【温馨提示】

有时候,截取的图片,可能是倒的,需要进行旋转,这里贴出相对应的接口。

public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(degree);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}