SurfaceControl.screenshot()用法 | SurfaceControl.screenshot()使用后返回null的解决方案

这篇具有很好参考价值的文章主要介绍了SurfaceControl.screenshot()用法 | SurfaceControl.screenshot()使用后返回null的解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

SurfaceControl.screenshot()是系统的截屏方法,属于系统API,对用户不开放,因此要使用的话需要系统的签名(platform.keystore文件)才能调用到。
在高版本的android上(例如android 11),如果没有系统签名,即使用反射也会报找不到方法的异常,但是有系统签名的话,直接调用就行。



旧方法使用

网上不少教程展示的是旧的调用方式,这些调用方式在高版本中已经不适用了,如下:

  1. 使用反射调用截屏
//获取屏幕尺寸
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels};
//调用screenshot()
try {
    Class<?> demo = Class.forName("android.view.SurfaceControl");
    Method method = demo.getDeclaredMethod("screenshot", int.class,int.class);
    mScreenBitmap = (Bitmap) method.invoke(null,(int) dims[0],(int) dims[1]);
} catch (Exception e) {
    e.printStackTrace();
}
//显示bitmap
ImageView image = findViewById(R.id.image);
image.setImageBitmap(mScreenBitmap);
  1. 直接调用screenshot方法截屏
//获取屏幕尺寸
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels};
//调用screenshot()
Bitmap mScreenBitmap = SurfaceControl.screenshot((int) dims[0],(int) dims[1]);
//显示bitmap
ImageView image = findViewById(R.id.image);
image.setImageBitmap(mScreenBitmap);


新方法使用

在后期的android版本中,已经取消了screenshot(width, height)方法,因此只传入两个int值的方式行不通了

在剩下的screenshot()构造参数中,使用起来最方便的就是screenshot(Rect sourceCrop, int width, int height, int rotation)这个方法。
对于参数说明如下:

参数 作用
sourceCrop 要捕获到位图中的屏幕部分;如果不需要裁剪,调用者可以传入new Rect()
width 返回位图的所需宽度;原始屏幕将缩小到该大小;如果不需要缩放,调用者可以传入0
height 返回位图的所需高度;原始屏幕将缩小到该大小;如果不需要缩放,调用者可以传入0
rotation 将自定义顺时针旋转应用于屏幕截图,即Surface.ROTION_0,90,180,270。默认情况下,SurfaceFlinger将始终以其原始纵向方向拍摄屏幕截图,因此这对于返回独立于设备方向的屏幕截图非常有用

因此,在新的android系统上,我们可以这样写:

//调用screenshot()
//参数传入默认的,表示直接截全屏并且不缩放,不裁剪,不旋转
Bitmap mScreenBitmap = SurfaceControl.screenshot(new Rect(), 0, 0, Surface.ROTATION_0);
//显示bitmap
ImageView image = findViewById(R.id.image);
image.setImageBitmap(mScreenBitmap);

由于此方法不依赖于Activity,所以可以用来实现后台截屏的效果。但是要注意的是,调用此方法需要系统的签名(platform.keystore),或者增加android:sharedUserId="android.uid.system"



screenshot()始终返回null的解决方案

如果你调用后不报错,但同时返回的bitmap又一直为null,则可能是权限问题。解决方案如下:

  1. AndroidManifest.xml增加android:sharedUserId="android.uid.system"
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xxx"
    android:sharedUserId="android.uid.system">
	...
  1. 如果你不想将app变成系统应用,可以在AndroidManifest.xml中增加单独的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xxx">

	<!-- 增加此权限 -->
    <uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
	...

以上两个方法使用一种就行文章来源地址https://www.toymoban.com/news/detail-495699.html

到了这里,关于SurfaceControl.screenshot()用法 | SurfaceControl.screenshot()使用后返回null的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决SUM函数返回为NULL

    SUM函数的作用:计算某一字段中所有行的数值和, 使用SUM函数进行对符合条件的结果行数进行求和。 sum 求和时会对 null 进行过滤,不计算,但如果没有返回结果,则sum 函数的返回值为 null,不是 0: 1. IFNULL 使用IFNULL函数进行查询,判断第一个参数是否为null,如果是 则返回

    2024年02月08日
    浏览(27)
  • React onBlur回调中使用document.activeElement返回body解决方案

    最开始想实现一个功能,点击img图标后给出购物下拉框CartDropdown,当img及CartDropdown失去焦点时隐藏CartDropdown。 最开始的核心代码如下: 这个版本的代码中在onBlur回调中使用document.activeElement函数想要获取当前聚焦的元素,之后通过判断聚焦的元素是cart组件内的来判断是否需要

    2023年04月16日
    浏览(22)
  • json_decode返回NULL

    最近在调用某公司的API时,将对方返回的数据,使用PHP的json_decode函数解析,但是返回NULL,最终排查为对方传送来的json格式有误 打印$_REQUEST,数据结构大致如下: 1 2 3 4 5 6 7 8 9 10 array   (    \\\'TeleRec\\\'   = \\\'{    Tel:\\\'17090114281\\\',    Type:2,    StartTime:\\\'2016/9/19 10:19:29\\\',    EnteTime

    2024年02月10日
    浏览(16)
  • java实体类属性值为null不返回或者某个属性不返回

    java实体类值为null或者无关紧要的属性,也返回给了前端,看起来不太高明。可以使用JsonInclude注解或者JsonField注解过滤掉。 用在实体类前或者属性前都可以。 用在属性前。 以上示例中,当total为null时不返回,适用于没有分页的情况。

    2024年02月12日
    浏览(34)
  • Mybatis 批量新增 只返回第一主键ID 其他返回null

    出现 问题 是加 on duplicate key update 受了影响, 去掉 on duplicate key update代码 ON DUPLICATE key update是根据索引字段是否重复来判断是否执行,如果重复则执行update,否则则执行insert。 优先级主键唯一索引 当主键重复时则执行update 当主键不重复,唯一索引重复时也执行update 当主键

    2024年02月16日
    浏览(33)
  • SpringBoot返回响应排除为 null 的字段

    可以通过全局配置,使返回响应中为 null 的字段,不在出现在返回结果中。 注意:这样配置,使得返回响应包含的字段随请求结果变化,响应到底包含哪些字段不直观;除非业务明确有这种需求,否则不建议配置。 PS:Gson将Bean转为JSON时,默认会排除null字段。 添加配置前:

    2024年02月11日
    浏览(31)
  • 微信小程序获取节点的位置返回null

    微信小程序获取元素节点时,返回值为null的原因,是因为元素在页面数据渲染前,先调用的微信小程序的方法,此时元素节点还未渲染出来,所以拿不到节点位置,返回null。 解决办法:尽量避免动态生成元素节点,若避免不了,就设置个定时器,在页面加载几秒后再调用该

    2024年02月12日
    浏览(40)
  • war包读取properties配置文件错误,返回null

    现象:使用intellij Idea编写java项目,debug调试时,使用redis.properties文件的类A,A的代码可以使用 “InputStream in = RedisUtils.class.getClass().getResourceAsStream(\\\"/\\\" + proPath);” 方式正常读取redis.properties配置文件;但当打包为war包,A同样的代码方式读取失败,返回null 原因:debug时取的是绝

    2024年02月15日
    浏览(25)
  • Oracle sql sum函数返回null,默认值0

    在Oracle SQL中,当你使用 SUM 函数对一组值进行求和时,如果这组值中包含 NULL ,那么 SUM 函数将忽略这些 NULL 值,并返回非 NULL 值的总和。 如果你希望在 SUM 函数返回 NULL 时有一个默认值,你可以使用 COALESCE 或 NVL 函数。 使用 COALESCE 函数: 使用 NVL 函数: 在这两个例子中,

    2024年01月16日
    浏览(29)
  • Android11 相机拍照权限,以及解决resolveActivity返回null

    一、配置拍照和读写权限 二、手动申请权限         implementation \\\'com.permissionx.guolindev:permissionx:1.4.0\\\'         1、手动申请读写,拍照权限         2、手动申请文件管理权限 三、Manifest中配置queries(解决resolveActivity为null) 四、Manifest中配置provider 五、配置file_paths文件

    2024年02月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包