经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Android » 查看文章
Android利用反射机制调用截屏方法和获取屏幕宽高的方法
来源:jb51  时间:2021/3/1 12:56:46  对本文有异议

想要在应用中进行截屏,可以直接调用 View 的 getDrawingCache 方法,但是这个方法截图的话是没有状态栏的,想要整屏截图就要自己来实现了。

还有一个方法可以调用系统隐藏的 screenshot 方法,来进行截屏,这种方法截图是整屏的。
通过调用 SurfaceControl.screenshot() / Surface.screenshot() 截屏,在 API Level 大于 17 使用 SurfaceControl ,小于等于 17 使用 Surface,但是 screenshot 方法是隐藏的,因此就需要用反射来调用这个方法。
这个方法需要传入的参数就是宽和高,因此需要获取整个屏幕的宽和高。常用的有三种方法。

获取屏幕宽高

方法一

  1. int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
  2. int screenHeight = getWindowManager().getDefaultDisplay().getHeight();

这个方法会提示过时了,推荐后边两种。

方法二

  1. DisplayMetrics dm = new DisplayMetrics();
  2. getWindowManager().getDefaultDisplay().getMetrics(dm);
  3. int screenWidth = dm.widthPixels;
  4. int screenHeight = dm.heightPixels;

方法三

  1. Resources resources = this.getResources();
  2. DisplayMetrics dm = resources.getDisplayMetrics();
  3. int screenWidth = dm.widthPixels;
  4. int screenHeight = dm.heightPixels;

反射调用截屏方法

  1. public Bitmap screenshot() {
  2. Resources resources = this.getResources();
  3. DisplayMetrics dm = resources.getDisplayMetrics();
  4.  
  5. String surfaceClassName = "";
  6. if (Build.VERSION.SDK_INT <= 17) {
  7. surfaceClassName = "android.view.Surface";
  8. } else {
  9. surfaceClassName = "android.view.SurfaceControl";
  10. }
  11. try {
  12. Class<?> c = Class.forName(surfaceClassName);
  13. Method method = c.getMethod("screenshot", new Class[]{int.class, int.class});
  14. method.setAccessible(true);
  15. return (Bitmap) method.invoke(null, dm.widthPixels, dm.heightPixels);
  16. } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException | ClassNotFoundException e) {
  17. e.printStackTrace();
  18. }
  19. return null;
  20. }
  21.  

最后返回的 Bitmap 对象就是截取得图像了。

需要的权限

  1. <uses-permission android:name="android.permission.READ_FRAME_BUFFER"/>

调用截屏这个方法需要系统权限,因此没办法系统签名的应用是会报错的。

到此这篇关于Android利用反射机制调用截屏方法和获取屏幕宽高的方法的文章就介绍到这了,更多相关android 反射调用截屏方法内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号