1.PixelCopy这个类是安卓提供的截取SurfaceView 的一个类:

        val surfaceView: SurfaceView = binding.realTimeMap.getBinding()val bitmap = Bitmap.createBitmap(surfaceView.width, surfaceView.height, Bitmap.Config.ARGB_8888)val surfaceHolder = surfaceView.holderif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {val copyResult = PixelCopy.request(surfaceHolder.surface,bitmap,PixelCopy.OnPixelCopyFinishedListener { copyResult ->if (copyResult == PixelCopy.SUCCESS) {// 截图成功,可以在这里处理Bitmap对象binding.ivMaxSpeed.setImageBitmap(bitmap)} else {// 截图失败,根据需要进行处理}},Handler() // 可选的Handler对象,用于指定回调在哪个线程执行,如果不指定,默认在主线程执行)}

2.使用MediaProjection ,这个是系统级的截屏方法,但是比较繁琐:
a.建立前台服务;
//启动MediaService服务

    fun startMediaService() {if (isstartservice) {startService(Intent(this, MediaService::class.java))isstartservice = false}}***## MediaSercice:***:
package com.allynav.iefa.serviceimport android.R
import android.app.*
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Build
import android.os.IBinder
import androidx.core.app.NotificationCompatclass MediaService : Service() {private val NOTIFICATION_CHANNEL_ID = "com.tencent.trtc.apiexample.MediaService"private val NOTIFICATION_CHANNEL_NAME = "com.tencent.trtc.apiexample.channel_name"private val NOTIFICATION_CHANNEL_DESC = "com.tencent.trtc.apiexample.channel_desc"override fun onCreate() {super.onCreate()startNotification()}fun startNotification() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Call Start foreground with notificationval notificationIntent = Intent(this, MediaService::class.java)val pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0)val notificationBuilder: NotificationCompat.Builder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.alert_dark_frame)).setSmallIcon(R.drawable.alert_dark_frame).setContentTitle("Starting Service").setContentText("Starting monitoring service").setContentIntent(pendingIntent)val notification: Notification = notificationBuilder.build()val channel = NotificationChannel(NOTIFICATION_CHANNEL_ID,NOTIFICATION_CHANNEL_NAME,NotificationManager.IMPORTANCE_DEFAULT)channel.description = NOTIFICATION_CHANNEL_DESCval notificationManager =getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManagernotificationManager.createNotificationChannel(channel)startForeground(1,notification) //必须使用此方法显示通知,不能使用notificationManager.notify,否则还是会报上面的错误}}override fun onBind(intent: Intent?): IBinder {throw UnsupportedOperationException("Not yet implemented")}
}b.// 申请截屏权限private fun getScreenShotPower() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {mediaProjectionManager =getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManagerif (mediaProjectionManager != null) {val intent = mediaProjectionManager!!.createScreenCaptureIntent()startActivityForResult(intent, REQUEST_MEDIA_PROJECTION)}}}c.  @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)override fun onActivityResult(requestCode: Int, resultCode: Int, @Nullable data: Intent?) {super.onActivityResult(requestCode, resultCode, data)if (requestCode == REQUEST_MEDIA_PROJECTION && data != null) {//            mediaProjection = mediaProjectionManager!!.getMediaProjection(RESULT_OK, data)val mediaPro = mediaProjectionManager!!.getMediaProjection(RESULT_OK, data)val bitmap = screenShot(mediaPro)      //截屏val bs = getBitmapByte(bitmap)//对图片进行处理逻辑  例如可以保存本地、进行图片分享等Log.e("WWW", "EEE" + bitmap)if (bitmap != null) {shareTipsPop.setShare(bitmap)shareTipsPop.showPopupWindow()}}}
d.处理图片的方法:@RequiresApi(api = Build.VERSION_CODES.KITKAT)fun screenShot(mediaProjection: MediaProjection): Bitmap? {val wm1 = this.windowManagerval width = wm1.defaultDisplay.widthval height = wm1.defaultDisplay.heightObjects.requireNonNull(mediaProjection)@SuppressLint("WrongConstant") val imageReader: ImageReader =ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 60)var virtualDisplay: VirtualDisplay? = nullif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {virtualDisplay = mediaProjection.createVirtualDisplay("screen",width,height,1,DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,imageReader.getSurface(),null,null)}SystemClock.sleep(1000)//取最新的图片val image: Image = imageReader.acquireLatestImage()// Image image = imageReader.acquireNextImage();//释放 virtualDisplay,不释放会报错virtualDisplay!!.release()return image2Bitmap(image)}@RequiresApi(api = Build.VERSION_CODES.KITKAT)fun image2Bitmap(image: Image?): Bitmap? {if (image == null) {println("image 为空")return null}val width: Int = image.getWidth()val height: Int = image.getHeight()val planes: Array<Image.Plane> = image.planesval buffer: ByteBuffer = planes[0].bufferval pixelStride: Int = planes[0].pixelStrideval rowStride: Int = planes[0].rowStrideval rowPadding = rowStride - pixelStride * widthval bitmap =Bitmap.createBitmap(width + rowPadding / pixelStride, height, Bitmap.Config.ARGB_8888)bitmap.copyPixelsFromBuffer(buffer)//截取图片// Bitmap cutBitmap = Bitmap.createBitmap(bitmap,0,0,width/2,height/2);//压缩图片// Matrix matrix = new Matrix();// matrix.setScale(0.5F, 0.5F);// System.out.println(bitmap.isMutable());// bitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);image.close()return bitmap}

3.使用 holder.lockCanvas():

// 获取SurfaceView
SurfaceView surfaceView = findViewById(R.id.surface_view);
// 获取SurfaceView的Holder对象
SurfaceHolder holder = surfaceView.getHolder();
// 创建Canvas对象
Canvas canvas = holder.lockCanvas();
// 绘制你想要的内容
// ...
// 将Canvas中的内容转换为Bitmap
Bitmap bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
canvas.setBitmap(bitmap);
// 解锁Canvas并刷新SurfaceView
holder.unlockCanvasAndPost(canvas);
// 至此,你已经成功获取SurfaceView的图片了或者:
// 1. 创建一个与 SurfaceView 大小相同的 Bitmap 对象
val surfaceView: SurfaceView = findViewById(R.id.your_surface_view_id)
val bitmap = Bitmap.createBitmap(surfaceView.width, surfaceView.height, Bitmap.Config.ARGB_8888)// 2. 获取 SurfaceView 的 SurfaceHolder
val surfaceHolder = surfaceView.holder// 3. 锁定 Surface,并将其绘制到 Bitmap 中
var canvas: Canvas? = null
try {canvas = surfaceHolder.lockCanvas(null)canvas?.drawBitmap(bitmap, 0f, 0f, null)
} finally {if (canvas != null) {surfaceHolder.unlockCanvasAndPost(canvas)}
}// 现在,bitmap 中就包含了 SurfaceView 的内容

其他方法不做表述。

SurfaceView 截屏方案相关推荐

  1. Android rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)

    网上很多资料都是说使用View的getDrawingCache接口,这种方式有一个问题,无法截取到状态栏,因此个人不推荐. View view = getWindow().getDecorView() ...

  2. android截全屏方法,Android rom开发:最完整的截屏方案(支持全屏截屏+区域截屏)

    网上很多资料都是说使用View的getDrawingCache接口,这种方式有一个问题,无法截取到状态栏,因此个人不推荐. View view = getWindow().getDecorView() ...

  3. 安卓SurfaceView截屏

    关于安卓SurfaceView截屏 2015.12.9号是一个值得记得日子,开始拖着背包从学校出来,挤上火车,做着接近30小时的硬座,来到了美丽的成都,那时候赵雷的<成都>还没火,'走到玉 ...

  4. Android平台监听系统截屏方案预研及相关知识点

    最近有个针对系统截屏的需求,所以预研了Android平台上捕获系统截屏的方案. 最直接的方式就是监听手机的系统截屏组合键(电源键+音量下键),但是这种方式实现难度大,且有的机型使用特殊手势进行截屏,兼 ...

  5. 一种实现(无须root)手机截屏方案

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/53966818 前言:一年半多以前 ...

  6. Aandroid截屏遇到SurfaceView

    最近做项目遇到个问题,网上搜索了一下,很多人也遇到这个问题,觉得很有必要拿出来说一下,做个总结!嗯,内容精华,千万别错过! 项目具体的需求说起来又要大费周章说半天,我就直接简单地说下我们的目的是什么, ...

  7. Android实现截屏方式

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

  8. android获取activity截图,Android Activity 不能被截屏的解决方法

    Android Activity 不能被截屏的解决方法 在Activity 添加即可 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECU ...

  9. Android监听截屏事件

    截屏方案对比(截屏事件没有同一的api) 方案一:利用FileObserver监听某个目录中资源变化情况 优点:操作简单 缺点: 不同的手机,默认截屏图片储存的文件夹可能不同 不同的手机,事件回调可能 ...

最新文章

  1. PTA---指针错误汇总(就自己做个笔记)
  2. Python入门之编程与编程语言
  3. 探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
  4. EasyUI中Datebox日期框的简单使用
  5. 日常必备的16条Linux命令
  6. 学科实践活动感悟50字_课改实践提素养 示范引领促教研 ——复兴镇小学语文课堂教学改革“五环四让”教学模式 研讨成果展示活动...
  7. 解决spring-session升级到2.0.0报错的问题
  8. RabbitMQ消息幂等性问题
  9. 小米11终于来了,12月28日见!
  10. c++工程模式+配置文件+动态调用类
  11. jroo,已开源,一个java web快速开发工具
  12. Unity3D 调用Java,Java调用Unity3D
  13. 如何开发和维能hold住全场的软件
  14. 3、SpringBoot集成Storm WorldCount
  15. 十几次CATIA安装重装系统吐血问题总结
  16. C++ 保存txt文本文件
  17. 给想上MIT的牛学生说几句
  18. 零基础转行到软件测试如何拿到所谓的高薪?
  19. 超市销售数据分析python、求某一个人的营业额总和_Python+pandas使用交叉表分析超市营业额数据!这超市怕是!...
  20. 介绍一款迷你版win10系统!电脑内存小的用户可入

热门文章

  1. table1 | 一秒搞定你的三线表
  2. 3DMAX教程:《战神》次世代人物制…
  3. 一篇关于JSPatch, 线上直接改BUG的利器,OC语法转换时遇到的坑
  4. linux系统么播放音乐,在linux环境下播放MP3
  5. 博士申请 | ​美国UIUC信息学院汪浩瀚老师课题组招收全奖博士生及合作者
  6. Android应用资源文件替换方法
  7. 大厂超多!985厦门大学,计算机研究生就业情况如何?
  8. 凌力尔特的 Dust Networks 无线传感器网络产品现已进入中国
  9. SitePoint Podcast#190:Dave Rupert的开源项目
  10. 公务员计算机科学与信息类,公务员计算机科学与技术类包含哪些专业?