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

在几个月前有接到项目老大这样一个需求:实时获取用户当前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的最外层
Android进阶之路 - 动态获取用户当前操作界面

截图 - 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;
    }
上一篇:PAT乙级 1024 科学计数法 (20 分)


下一篇:Spring的lazy-init详解