直接上代码:

入口方法: startTakeScreenShot()

出口方法:返回的Bitmap对象在onActivityResult()  有todo的注释

注意:该截屏方式 在 build.gradle属性 stargetSdk >=30 的情况下会报错。我这边是28。

    val EVENT_SCREENSHOT = 22 //截图事件private var mediaProjectionManager: MediaProjectionManager? = nullprivate var mediaProjection: MediaProjection? = nullprivate var image: Image? = null// 开始截屏方法fun startTakeScreenShot() {mediaProjectionManager =application.getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManagerstartActivityForResult(mediaProjectionManager!!.createScreenCaptureIntent(),EVENT_SCREENSHOT)}@SuppressLint("WrongConstant")override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_PIC) {if (data != null) {val pathList: List<String>? =data.getStringArrayListExtra(Repair_ImgSelActivity.INTENT_RESULT)doPicDataS(pathList)}}if (requestCode == EVENT_SCREENSHOT) {super.onActivityResult(requestCode, resultCode, data)Log.e("whh0914", "captureScreen...")val displayMetrics = DisplayMetrics()val windowManager = this.getSystemService(WINDOW_SERVICE) as WindowManagerwindowManager.defaultDisplay.getMetrics(displayMetrics)val width = displayMetrics.widthPixelsval height = displayMetrics.heightPixelsval mImageReader: ImageReader =ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2)mediaProjection = mediaProjectionManager?.getMediaProjection(resultCode, data!!)val virtualDisplay = mediaProjection?.createVirtualDisplay("screen-mirror",width,height,displayMetrics.densityDpi,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,mImageReader.surface,null,null)Handler().postDelayed(Runnable {try {image = mImageReader.acquireLatestImage()if (image != null) {val planes: Array<Image.Plane> = image!!.planesval buffer: ByteBuffer = planes[0].bufferval width: Int = image!!.widthval height: Int = image!!.heightval pixelStride: Int = planes[0].pixelStrideval rowStride: Int = planes[0].rowStrideval rowPadding = rowStride - pixelStride * widthvar bitmap = Bitmap.createBitmap(width + rowPadding / pixelStride,height,Bitmap.Config.ARGB_8888)bitmap!!.copyPixelsFromBuffer(buffer)bitmap =Bitmap.createScaledBitmap(bitmap, bitmap.width, bitmap.height, false)val pipelineFragment = viewPagerAdapter.fragmentList[1] as PipelineFragmentpipelineFragment.mWebView.visibility = View.GONEif (bitmap != null) {// 这里获取到截到的Bitmap对象// 下面是将bitmap保存到SD卡中的方法:如有需要请参考博客:https://blog.csdn.net/qq_39731011/article/details/123640342 如不需要请删除ImageSaveUtil.saveAlbum(this,bitmap,Bitmap.CompressFormat.JPEG, 80, true)}bitmap.recycle()}} catch (e: java.lang.Exception) {Log.e("截图", "出现异常:$e")} finally {if (image != null) {image!!.close()}if (mImageReader != null) {mImageReader.close()}virtualDisplay?.release()//该代码为了避免出现BufferQueueProducer: [ImageReader] dequeueBuffer: BufferQueue has been abandonedmImageReader.setOnImageAvailableListener(null, null)mediaProjection?.stop()}}, 300)//这里的延迟是为了 不截取到 系统提示是否允许录屏的弹框,可自行调整,经深海测试一般100-500为最佳}}

Android WebView截屏空白或者一片黑如何解决?使用MediaProjection截图。相关推荐

  1. Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)

    Android截屏 Android截屏的原理:获取具体需要截屏的区域的Bitmap,然后绘制在画布上,保存为图片后进行分享或者其它用途 一.Activity截屏 1.截Activity界面(包含空白的 ...

  2. Android实现截屏和截长图功能的几种方法

    一般情况下各种型号的手机都会有自带的截屏功能,也会有诸如"开关机键+音量键"的截屏快捷键,只要手机是亮屏状态,都会将手机屏幕的可视区域(包含状态栏)全部截取下来. 如果开发中想要调 ...

  3. Android实现截屏方式

    本文介绍了Android 实现截屏方式整理,分享给大家.希望对大家有帮助 可能的需求: 截自己的屏 截所有的屏 带导航栏截屏 不带导航栏截屏 截屏并编辑选取一部分 自动截取某个空间或者布局 截取长图 ...

  4. android WebView截长图实现

    1.先简单介绍下webview截屏,看代码: //开启缓存 webview.setDrawingCacheEnabled(true); webview.buildDrawingCache();Bitm ...

  5. Android系统截屏的实现(附代码)

    1.背景 写博客快两年了,写了100+的文章,最火的文章也是大家最关注的就是如何实现android系统截屏.其实我们google android_screen_shot就会找到很对办法,但那些都是很多 ...

  6. android 截长图 方法,Android实现截屏与截长图功能

    本文实例为大家分享了Android实现截屏与截长图功能展示的具体代码,供大家参考,具体内容如下 Demo在GitHub的地址:ScreenShoot 在Android开发中,有时候会遇到需要截屏分享到 ...

  7. android后台截屏实现(2)--screencap源码修改

    首先找到screencap类在Android源码中的位置,/442/frameworks/base/cmds/screencap/screencap.cpp. 源码如下: [cpp] view pla ...

  8. android长截屏代码,android长截屏原理及实现代码

    android长截屏原理及实现代码 发布时间:2020-08-31 06:55:16 来源:脚本之家 阅读:158 作者:Android笔记 小米系统自带的长截屏应该很多人都用过,效果不错.当长截屏时 ...

  9. Android手机截屏

    对于android手机截屏,据我所知,现在主要有三种方法. 第一种,通过DDMS. 把手机连接上电脑,运行DDMS,选中你的手机设备,然后点击菜单"设备"->"Sc ...

最新文章

  1. 2015c语言成绩查询,2015年3月全国计算机二级C语言选择第1套
  2. SQL语句like子句中的转义符
  3. buu 权限获得第一步
  4. 使用HTML5在浏览器中开发虚拟现实业务
  5. linux KVM win虚拟机磁盘扩容(qcow2)
  6. C++ 数据指针(-)
  7. Ubuntu目录结构简单介绍笔记
  8. [vscode] 显示空格
  9. 亚马逊的新Linux发行版对红帽造成了威胁
  10. LeetCode简单题目(#27 #28 #35 #38)-2019.10.23-4道
  11. 【MySQL】Unknown column 'column_name' in 'field list'
  12. html5类似ios下拉选择器,iosselect:一个js picker项目,在H5中实现IOS的select下拉框效果 - mufc-go...
  13. Matlab中实现均匀量化
  14. 并查集算法最全最详细讲解
  15. 微信小程序 指纹识别
  16. 计算机音乐名侦探柯南简谱,《名侦探柯南》主题旋律|卡林巴琴简谱专用谱...
  17. 美赛数模论文之表的格式
  18. 巨头发力,社区电子商务发展加速
  19. Nginx服务详细篇从基础到反向代理和负载均衡
  20. java开发手机app_java 怎么开发手机app接口?

热门文章

  1. 我司何晓磊续签立命馆大学的客座研究员
  2. swift学习资料2022
  3. 软文营销是什么,怎么理解
  4. instruction-tuning
  5. 福建省谷歌卫星地图下载
  6. Mapped Statements collection does not contain value for XXX错误
  7. matlab如何编辑幂函数,如何编辑excel幂函数(如何用excle输入公式幂)
  8. C# 一些零零碎碎的方法,都是些帮助类,留存,也希望能帮助到各位
  9. BW维护操作:处理链的一切
  10. 干电池电量采集_干电池电量检测方法