ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android进阶之路 - 动态获取用户当前操作界面

2021-08-04 11:30:58  阅读:325  来源: 互联网

标签:kb 进阶 1024 压缩 Bitmap 操作界面 baos Android bitmap


在几个月前有接到项目老大这样一个需求:实时获取用户当前app的操作界面 ~

因为近俩年主要做的是售货机业务,所以长连接使用的是mqtt,这里主要讲接收到消息后,我们去获取操作界面时的操作,即实时截屏+本地保存 ~

在早期的时候有记录过一篇关于截图的Blog,有需求也可以去扩展

根据以下操作后,亲测已实现需求功能,但是因售货机版本大多在5.0之前,所以在手机开发时要记得适配 6.0动态权限,7.0文件临时授权

在长连接中收到消息后,我采用eventbus传递消息,进行app当前界面截屏+图片保存

here:当执行完以选操作时,我们可以去查看本地是否已经保存好我们需要的用户操作界面图 ~

    case Constant.EventBus.SCREEN_SHOT:
    	//截图,mScreenParent为所截图区域的最外层布局控件
        Bitmap bitmap = BitmapTool.convertCanvasViewToBitmap(mScreenParent);
        //图片保存
        if (bitmap != null) {
        	//Constant.LocalPath.BASIC_PATH:Environment.getExternalStorageDirectory().getPath();
            BitmapTool.saveImage(bitmap, Constant.LocalPath.BASIC_PATH);
        }
        break;

mScreenParent控件id,处于layout的最外层
在这里插入图片描述

截图 - convertCanvasViewToBitmap

    /**
     * 创建一个bitmap放于画布之上进行绘制 (简直如有神助)
     */
    public static Bitmap convertCanvasViewToBitmap(View tempView) {
        Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
                tempView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tempView.draw(canvas);
        return bitmap;
    }

保存图片 - saveImage

    /**
     * 保存图片
     */
    public static void saveImage(Bitmap bitmap, String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }

        try {
            String tmpImgPath = path + "/" + "screenShot" + System.currentTimeMillis() + ".png";
            FileOutputStream fileOutputStream = new FileOutputStream(tmpImgPath);
            int bmSize = bitmap.getByteCount();
            int kb = bmSize / 1024;
            int mb = kb / 1024;
            kb = kb % 1024;
            Log.d("Bitmap", "bitmap size = " + mb + "MB " + kb + "KB");
            //图片压缩
            Bitmap bitmap1 = compressImage(bitmap);
            bitmap1.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
//            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            bmSize = bitmap1.getByteCount();
            kb = bmSize / 1024;
            mb = kb / 1024;
            kb = kb % 1024;
            Log.d("Bitmap", "bitmap size = " + mb + "MB " + kb + "KB");
//            bitmap.recycle();
            fileOutputStream.close();
        } catch (Exception e) {
            LogTool.e(e.getMessage());
        }
    }

图片压缩 - compressImage

    /**
     * 质量压缩方法
     *
     * @param image
     * @return
     */
    public static Bitmap compressImage(Bitmap image) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        int options = 90;
        // 循环判断如果压缩后图片是否大于100kb,大于继续压缩
        while (baos.toByteArray().length / 1024 > 100) {
            // 重置baos即清空baos
            baos.reset();
            // 这里压缩options%,把压缩后的数据存放到baos中
            image.compress(Bitmap.CompressFormat.JPEG, options, baos);
            // 每次都减少10
            options -= 10;
            if (options < 0) {
                break;
            }
        }
        // 把压缩后的数据baos存放到ByteArrayInputStream中
        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
        // 把ByteArrayInputStream数据生成图片
        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);
        return bitmap;
    }

标签:kb,进阶,1024,压缩,Bitmap,操作界面,baos,Android,bitmap
来源: https://blog.csdn.net/qq_20451879/article/details/119378910

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有