• 安卓截屏;前台服务


      private var mediaProjectionManager: MediaProjectionManager? = null
    
        val REQUEST_MEDIA_PROJECTION = 10001
    
        private var isstartservice = true
    
        //启动MediaService服务
        fun startMediaService() {
            if (isstartservice) {
                startService(Intent(this, MediaService::class.java))
                isstartservice = false
            }
        }
    
        //停止MediaService服务
        fun stopMediaService(context: Context) {
            val intent = Intent(context, MediaService::class.java)
            context.stopService(intent)
        }
    
        // 申请截屏权限
        private fun getScreenShotPower() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                mediaProjectionManager =
                    getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
                if (mediaProjectionManager != null) {
                    val intent = mediaProjectionManager!!.createScreenCaptureIntent()
                    startActivityForResult(intent, REQUEST_MEDIA_PROJECTION)
                }
            }
        }
    
    
        @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) {
                    if (typeShare != -1) {
                        if (typeShare == 0) {
                            /**
                             * 微信分享
                             */
                            shareWechat(bitmap)
                        } else if (typeShare == 1) {
                            /**
                             * 保存到本地相册
                             */
                            bitmap?.let { it1 -> ImageSaver.saveBitmapToGallery(this, it1, "-", "+++") }
                            stopMediaService(this)
                        }
                    }
                }
    
    //            startRecord()    //三:录屏
    //            if (!isStart) {
    //                isStart = !isStart
    //                startPlayRoute()
    //                multiple = 150f
    //            } else {
    //                multiple = 150f
    //            }
    //            isShowShareTipsPop = true
            }
        }
    
        /**
         * 分享到微信
         * @param view View
         */
        private fun shareWechat(view: Bitmap?) {
    //        var bmp: Bitmap? = loadBitmapFromViewBySystem(view)
            val imgObj = WXImageObject(view)
            val msg = WXMediaMessage()
            msg.mediaObject = imgObj
            val thumbBmp = Bitmap.createScaledBitmap(
                view!!,
                150,
                150,
                true
            )
            msg.thumbData = bmpToByteArray(thumbBmp, true)
            val req = SendMessageToWX.Req()
            req.transaction = buildTransaction("img")
            req.message = msg
            req.scene = SendMessageToWX.Req.WXSceneSession // 分享到对话框
            api!!.sendReq(req)
            stopMediaService(this)
        }
    
    
        @RequiresApi(api = Build.VERSION_CODES.KITKAT)
        fun screenShot(mediaProjection: MediaProjection): Bitmap? {
            val wm1 = this.windowManager
            val width = wm1.defaultDisplay.width
            val height = wm1.defaultDisplay.height
            Objects.requireNonNull(mediaProjection)
            @SuppressLint("WrongConstant") val imageReader: ImageReader =
                ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 60)
            var virtualDisplay: VirtualDisplay? = null
            if (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)
        }
    
        // 位图转 Byte
        private fun getBitmapByte(bitmap: Bitmap?): ByteArray {
            val out = ByteArrayOutputStream()
            // 参数1转换类型,参数2压缩质量,参数3字节流资源
            bitmap!!.compress(Bitmap.CompressFormat.PNG, 100, out)
            try {
                out.flush()
                out.close()
            } catch (e: IOException) {
                e.printStackTrace()
            }
            return out.toByteArray()
        }
    
    
        @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.planes
            val buffer: ByteBuffer = planes[0].buffer
            val pixelStride: Int = planes[0].pixelStride
            val rowStride: Int = planes[0].rowStride
            val rowPadding = rowStride - pixelStride * width
            val 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
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169

    package com.allynav.iefa.service

    import 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.NotificationCompat
    /**
    *@author zd
    *@time 2023/4/10 8:55
    *@description : 截屏前台服务
    *
    **/

    class 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 notification
                val 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_DESC
                val notificationManager =
                    getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                notificationManager.createNotificationChannel(channel)
                startForeground(
                    1,
                    notification
                ) //必须使用此方法显示通知,不能使用notificationManager.notify,否则还是会报上面的错误
            }
        }
    
        override fun onBind(intent: Intent?): IBinder {
            throw UnsupportedOperationException("Not yet implemented")
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
  • 相关阅读:
    绕圆旋转动画组件,拿过来直接用
    算法|Day52 单调栈3
    Elasticsearch搜索优化-自定义路由规划(routing)
    RequestMappingHandlerAdapter类简介说明
    SpringBoot 常用配置
    浅谈智慧水务在供水厂企业中的应用发展-Susie 周
    计算机考研408有多难?25考研经验贴,开个好头很有必要
    【剑指Offer】12.矩阵中的路径
    数学分析复习:中值定理、反函数定理
    SpringBoot-43-文件上传
  • 原文地址:https://blog.csdn.net/weixin_45877710/article/details/132802507