当前位置: 首页>編程日記>正文

android 截屏实现的几种方式

android 截屏实现的几种方式

Android 截屏分为四种:View 截屏WebView 截屏系统截屏adb 截屏

1、View 截屏

View 截图是将当前 View 界面截取下来,而对于屏幕上其他信息比如:状态栏或其他应用的界面将无法截取。

1.1 截取除了导航栏之外的屏幕

// 开始截屏
private static byte[] screenshotView() {View view = getWindow().getDecorView();// view.setDrawingCacheEnabled(true); // 设置缓存,可用于实时截图Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);view.draw(canvas);// view.setDrawingCacheEnabled(false); // 清空缓存,可用于实时截图byte[] drawByte = getBitmapByte(bitmap); // 位图转为 Bytereturn drawByte;
}// 位图转 Base64 String
private static String getBitmapString(Bitmap bitmap) {String result = null;ByteArrayOutputStream out = null;try {if (bitmap != null) {out = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);out.flush();out.close();byte[] bitmapBytes = out.toByteArray();result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);}} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.flush();out.close();}} catch (IOException e) {e.printStackTrace();}}return result;
}// 位图转 Byte
private static byte[] getBitmapByte(Bitmap bitmap){ByteArrayOutputStream out = new ByteArrayOutputStream();// 参数1转换类型,参数2压缩质量,参数3字节流资源bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);try {out.flush();out.close();} catch (IOException e) {e.printStackTrace();}return out.toByteArray();
}

1.2 截取某个控件或者区域

// 方法1
private static byte[] screenshotView1() {View view = title;view.setDrawingCacheEnabled(true);view.buildDrawingCache();Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());byte[] drawByte = getBitmapByte(bitmap);return drawByte;
}// 方法2
private static byte[] screenshotView2() {View view = title;Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);// 使用 Canvas,调用自定义 view 控件的 onDraw 方法,绘制图片Canvas canvas = new Canvas(bitmap);dView.draw(canvas);byte[] drawByte = getBitmapByte(bitmap);return drawByte;
}

2、WebView 截屏

WebView 截屏有四种方式

2.1 使用 capturePicture() 方法(已废弃)

private static byte[] screenshotWebView() {Picture picture = webview.capturePicture();//创建位图Bitmap bitmap = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);// 绘制(会调用 native 方法,完成图形绘制)picture.draw(canvas);byte[] drawByte = getBitmapByte(bitmap);return drawByte;
}

2.2 使用 getScale() 方法(已废弃)

private static byte[] screenshotWebView() {float scale = webView.getScale();int webViewHeight = (int) (webView.getContentHeight()*scale+0.5);Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(),webViewHeight, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);webView.draw(canvas);byte[] drawByte = getBitmapByte(bitmap);return drawByte;
}

2.3 使用 getDrawingCache() 方法

private static byte[] screenshotWebView() {Bitmap bitmap = webView.getDrawingCache();byte[] drawByte = getBitmapByte(bmp);return drawByte;
}

2.4 使用 draw() 方法

private static byte[] screenshotWebView() {// webView.setDrawingCacheEnabled(true); // 设置缓存Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);webView.draw(canvas);webView.destroyDrawingCache();byte[] drawByte = getBitmapByte(bitmap);// webView.setDrawingCacheEnabled(false); // 清空缓存return drawByte;
}

2.5 截长图配置

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {WebView.enableSlowWholeDocumentDraw();
}
setContentView(R.layout.activity_webview);

WebView 截图可能截取不到 cavans 元素,原因是开启了硬件加速,可在 AndroidManifest.xml 中设置属性 android:hardwareAccelerated="false"

关闭硬件加速可能导致页面出现意外情况

3、系统截屏

3.1 MediaProjection

public static final int REQUEST_MEDIA_PROJECTION = 10001;
// 申请截屏权限
private void getScreenShotPower() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {MediaProjectionManager mProjectionManager = (MediaProjectionManager) getSystemService(Context.MEDIA_PROJECTION_SERVICE);if (mProjectionManager != null) {startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);}}
}private MediaProjection mMediaProjection;
// 回调
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_MEDIA_PROJECTION && data != null) {if (resultCode == RESULT_OK) {MediaProjection mediaProjection = mMediaProjectionManager.getMediaProjection(resultCode, data);if (mediaProjection == null) {Toast.makeText(this,"程序发生错误:MediaProjection@1",Toast.LENGTH_SHORT).show();return;}// mediaProjection 就是当前屏幕流} else if (resultCode == RESULT_CANCELED) {Log.d(TAG, "用户取消");}}
}

3.2 Surface(需要 root 权限)

使用前需要:

  • AndroidMenifest.xml 中添加 android:sharedUserId="android.uid.system" 属性
  • 需要给程序添加系统签名
  • 或者 root 系统

使用 Java 反射机制,调用系统 API 截图:

private void screenshotSystem() {Class<?> surfaceClass;Method method = null;Bitmap bitmap = null;try {if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR2) {surfaceClass = Class.forName("android.view.SurfaceControl");} else {surfaceClass = Class.forName("android.view.Surface");}method = surfaceClass.getDeclaredMethod("screenshot", Integer.TYPE, Integer.TYPE);method.setAccessible(true);bitmap =  (Bitmap)method.invoke((Object)null, webview.getWidth(), webview.getHeight());byte[] drawByte = getBitmapByte(bitmap);} catch (ClassNotFoundException e){e.printStackTrace();} catch (NoSuchMethodException e){e.printStackTrace();} catch (IllegalAccessException e){e.printStackTrace();} catch (InvocationTargetException e){e.printStackTrace();}
}

3.3 PixelCopy

private void screenshotSystem() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {PixelCopy.request(getWindow(), bitmap, new PixelCopy.OnPixelCopyFinishedListener() {@Overridepublic void onPixelCopyFinished(int copyResult){if (PixelCopy.SUCCESS == copyResult) {byte[] drawByte = getBitmapByte(bitmap);} else {// onErrorCallback()}}}, new Handler());}
}

3.4 framebuffer(需要 root 权限)

String DEVICE_NAME = "/dev/graphics/fb0";
File deviceFile = new File(DEVICE_NAME);
Process localProcess = Runtime.getRuntime().exec("supersu");
String str = "cat " + deviceFile.getAbsolutePath() + "\n";
localProcess.getOutputStream().write(str.getBytes());
return localProcess.getInputStream();

3.5 screencap 命令(需要 root 权限)

private static String getScreenshot(){Process process = null;String filePath = "mnt/sdcard/" + System.currentTimeMillis() + ".png";try {process = Runtime.getRuntime().exec("su");PrintStream outputStream = null;outputStream = new PrintStream(new BufferedOutputStream(process.getOutputStream(), 8192));outputStream.println("screencap -p " + filePath);outputStream.flush();outputStream.close();process.waitFor();} catch (Exception e) {e.printStackTrace();} finally {if(process != null){process.destroy();}}return filePath;
}

4、adb 截屏

$ adb shell
shell@ $ screencap /sdcard/screen.png
shell@ $ exit
$ adb pull /sdcard/screen.png


https://www.fengoutiyan.com/post/13660.html

相关文章:

  • 安卓长截屏
  • android截屏
  • 安卓手机截屏方法
  • 安卓截图
  • 电脑如何截屏截图
  • iphone截屏快捷键
  • 安卓截屏怎么按
  • 苹果快速截屏
  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機