Android 截屏

前几天有朋友让我帮忙做一个获取微信收款记录的app,但是查了一圈也没有看到微信有开放接口。再说,一般微信收款不都是会有后台的吗?怎么需要去根据收款的记录来生成转账记录呢?好,不管具体情况是怎么样,有需求就要完成。程序员永远不能说不!!!

首先需要解决的就是Android截屏问题。普通的截屏问题只能截取到开发者自己的app内部的图片,而不能截取到其他app的图片。惊喜的是,Android从5.0开始开放了系统截屏的方法。看下面的文章:

https://www.cnblogs.com/tgyf/p/4851092.html

还有github的项目地址:

https://github.com/VincentWYJ/CaptureScreen

这篇文章主要参考这位大哥的成功,主要是修改了一些运行上的问题。

这位大哥的项目上传于3年前,排除掉由于Android版本更新带来的问题,比如gradle升级等,我这里做了一些修正:

1.悬浮窗问题

在我的荣耀8 android8.0.0上测试以后,发现虽然悬浮窗权限不需要用户手动同意,单独实现大哥的悬浮窗程序也没有问题,只不过要去设置里手动打开悬浮窗权限而已。但是问题在于,一旦我在AndroidMenifast.xml中添加了读写sd卡的权限,设置中的悬浮窗权限就没有了。这里的“没有”就是没有了打开悬浮窗权限的按钮。猜测可能是手机的一个bug,或者是偶然出现的bug而已。

因此在我的程序并没有采用悬浮窗而是使用了一个常驻的通知栏消息,这样来保证后台服务的存活。

2.读写存储问题。

由于大哥写的到时候可能并没有用户手动允许权限的问题,因此代码中也没有相关的代码。我这里采用了曲线救国的方式,先在MainActivity中存下了一张已有的图片到本地,触发一次权限申请。

3.获取截屏。

参考的代码中采用延时的方法来获取,实际在运行中我一开始并没有注意到这个问题,每一次截屏后ImageReader获取到的图片一直为null,查了一圈以后,有人说是生成图片也要一段时间,因此直接访问是可能为null的,所以此处改为监听图片生成。

mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
                    @Override
                    public void onImageAvailable(ImageReader mImageReader) {

                        Image image = null;
                        try {
                            image = mImageReader.acquireLatestImage();
                            if (image != null) {
                                final Image.Plane[] planes = image.getPlanes();
                                if (planes.length > 0) {
                                    final ByteBuffer buffer = planes[0].getBuffer();
                                    int pixelStride = planes[0].getPixelStride();
                                    int rowStride = planes[0].getRowStride();
                                    int rowPadding = rowStride - pixelStride * windowWidth;


                                    // create bitmap
                                    bmp = Bitmap.createBitmap(windowWidth + rowPadding / pixelStride,
                                            windowHeight, Bitmap.Config.ARGB_8888);
                                    bmp.copyPixelsFromBuffer(buffer);

                                    croppedBitmap = Bitmap.createBitmap(bmp, 0, 0, windowWidth, windowHeight);

//                                    runOnUiThread(new Runnable() {
//                                        @Override
//                                        public void run() {
//                                            mIvShow.setImageBitmap(croppedBitmap);
//                                            mainLayout.setVisibility(View.VISIBLE);
//                                        }
//                                    });

                                    if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){
                                        if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
                                            //没有权限则申请权限
                                            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
                                            Log.d(TAG, "onImageAvailable: 1111");
                                        }else {
                                            //有权限直接执行,docode()不用做处理
                                            Log.d(TAG, "onImageAvailable: 2222");
                                            saveBitmap(croppedBitmap);
                                        }
                                    }else {
                                        //小于6.0,不用申请权限,直接执行
                                        Log.d(TAG, "onImageAvailable: 3333");
                                        saveBitmap(croppedBitmap);
                                    }

                                    if (croppedBitmap != null) {
                                        croppedBitmap.recycle();
                                    }
                                    if (bmp != null) {
                                        bmp.recycle();
                                    }
                                }
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            if (image != null) {
                                image.close();
                            }
                            if (mImageReader != null) {
                                mImageReader.close();
                            }
                            if (mVirtualDisplay != null) {
                                mVirtualDisplay.release();
                            }
                            mImageReader.setOnImageAvailableListener(null, null);
//                mProjection.stop();

//                onScreenshotTaskOver();
                        }

                    }
                }, getBackgroundHandler());

以上三点是我觉得比较坑的地方,特此记录。

附上我自己的代码地址:

(1)Android端截屏(里面会把刚刚拍摄的图片发送到服务器做保存)

https://github.com/EchoBeTaken/book_keeping_android

(2)服务端就一个简单的保存图片的功能,一个简单的Springboot项目,很容易看懂,不多讲

https://github.com/EchoBeTaken/book_keeping_server

 

ps:只是在荣耀8_Android8.0.0上有少量测试,Android9的https还需要自己添加相关配置文件,不然默认不支持http哦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值