今天来介绍个这段时间做的功能,手机摇晃截图。因为这个功能比较常见,所以记录一下以便于之后用到时查阅。
这里说上去是一个功能,其实是有两个需求,即摇晃&截图。
摇晃
首先介绍这个摇晃,也就是我们常说的“手机摇一摇”。这个看起来高端,其实实现起来很简单,就是通过SensorManager来检测手机的重力感应,进而判读用户是否在主动的摇晃手机。
核心Service类
我们选择建立一个Service,在里面创建我们的SensorManager,并为其注册SensorEventListener,在监听里实现摇晃的判断。具体代码如下。
1 | package com.chen.screenshot; |
这样,当service启动时,只要用户摇晃,我们就可以监听到,并触发handleShakeAction()方法。在该方法里写入我们所需要的逻辑即可。
功能调用
接着我们在想要使用的时候只需start这个service,想要关闭的时候只要stop这个service就可以了。在Demo里,我在主Activity中使用了一个Switch开关控件来控制摇晃功能的开启与关闭。
布局文件如下。
1 | <?xml version="1.0" encoding="utf-8"?> |
最后是Activity中的调用。
1 | package com.chen.screenshot; |
至此我们的“手机摇一摇”功能就算是完工了。
截图
接下来就是要完成手机截图了。截图的方法有很多种,这里介绍最具代表性的三种。
方法一:View截屏
1 | public Bitmap capture(Activity activity) { |
这里的思路很清晰,就是获取Activity的Decor View,然后通过View的getDrawingCache()方法获取View的截屏。这种方法不需额外权限,也不需要Root。但是它不能截取到状态栏,也不能截取SurfaceView及WebView。
方法二:adb截屏
这个方法用起来更加简单,只需要在代码中执行一行截屏的adb shell命令即可。麻烦的一点是,需要Root权限。
1 | // 命令格式: adb shell screencap -p + 文件路径 + 文件名 |
方法三:虚拟桌面截屏
鉴于上面两种方法的局限性,我们实际项目中采取了第三种方法,利用Android 5.0开放的录屏API来进行截屏。说到这可能你也发现了,这个方法也是有局限性的,就是只能在Android 5.0以上的手机使用。不过手机更新越来越快,4.X的手机也越来越少,5.0其实也并不算一个很过分的门槛。
该方法的原理是启动屏幕捕捉,使用MediaProjection和ImageReader创建一个虚拟桌面,然后将捕捉的数据传递到虚拟桌面,最后使用ImageReader截取虚拟桌面的一帧画面。
先建立一个AutoScreenShot类,里面写入截屏的核心方法。
1 | package com.chen.screenshot; |
接着,创建一个透明的Dialog Activity,用来显示截屏权限的dialog。
1 | package com.chen.screenshot; |
AndroidManifest里记得设置theme为Theme.Dialog。
1 | <activity |
总结
这样,摇晃手机截屏的基础功能就算是基本完成了。你可以根据项目的特地需求,在这个基础上再做调整修改。