Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

2023-11-09

技术背景

我们在Android平台实现GB28181设备接入,把摄像头和麦克风数据,采集过去,用于移动单兵、智能车载、智慧安防、智能家居、工业仿真等行业时,发现大多场景对视频水印的要求越来越高,从之前的固定位置静态文字水印、png水印等慢慢过渡到动态水印需求。

本文,我们要探讨的是,除了常规的时间、经纬度信息获png水印外,如何叠加电量和设备信号状态到视频view。

如何获取电量信息

在Android平台上获取电量信息可以使用以下三种方式:

  1. 通过BatteryManager类获取电量信息:

可以使用Context.getSystemService()方法获取BatteryManager实例,并使用该实例的getIntExtra()方法获取电量信息。具体代码如下:

 BatteryManager batteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);  
 int batteryLevel = batteryManager.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);  
 int batteryScale = batteryManager.getIntExtra(BatteryManager.EXTRA_SCALE, -1);  
 int batteryPlugType = batteryManager.getIntExtra(BatteryManager.EXTRA_PLUGED, -1);  
 boolean isCharging = batteryManager.getIntExtra(BatteryManager.EXTRA_CHARGING, 0) == 1;
  1. 通过PowerManager类获取电量信息:

可以使用Context.getSystemService()方法获取PowerManager实例,并使用该实例的isDeviceIdle()方法和isPowerSaveMode()方法获取电量信息。具体代码如下:

 PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);  
 boolean isDeviceIdle = powerManager.isDeviceIdle();  
 boolean isPowerSaveMode = powerManager.isPowerSaveMode();
  1. 通过UsageStatsManager类获取电量信息:

可以使用Context.getSystemService()方法获取UsageStatsManager实例,并使用该实例的queryStats()方法获取电量信息。具体代码如下:

 UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);  
 long time = System.currentTimeMillis();  
 UsageStats stats = usageStatsManager.queryStats(UsageStatsManager.INTERVAL_DAILY, time);  
 long totalTime = stats.getTotalTime();  
 long screenTime = stats.getScreenTime();  
 float batteryLevel = (totalTime * 100) / screenTime;

如何获取设备信号

要获取Android设备的信号强度,可以使用TelephonyManager类中的getSignalStrength()方法。以下是一个示例代码片段,演示如何获取设备的信号强度:

 TelephonyManager telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);  
 int signalStrength = telephonyManager.getSignalStrength();

此代码将返回设备的信号强度,单位为dBm(分贝毫瓦)。如果设备没有电话卡,则返回值为int最小值(0)。

请注意,要使用TelephonyManager类,您需要在AndroidManifest.xml文件中添加以下权限:

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

此权限允许您的应用程序访问设备的电话状态和信息。

如何把设备电量信息和设备信号状态叠加到view

叠加设备电量和设备实时信号状态,实际上,调用的是我们动态文字水印,通过生成TextBitmap,然后从bitmap里面拷贝获取到text_timestamp_buffer_,通过我们设计的PostLayerImageRGBA8888ByteBuffer()投递到jni层。

private int postTimestampLayer(int index, int left, int top) {

    Bitmap text_bitmap = makeTextBitmap(makeTimestampString(), getFontSize(),
            Color.argb(255, 0, 0, 0), true, Color.argb(255, 255, 255, 255),true);

    if (null == text_bitmap)
        return 0;

    if ( text_timestamp_buffer_ != null) {
        text_timestamp_buffer_.rewind();

        if ( text_timestamp_buffer_.remaining() < text_bitmap.getByteCount())
            text_timestamp_buffer_ = null;
    }

    if (null == text_timestamp_buffer_ )
        text_timestamp_buffer_ = ByteBuffer.allocateDirect(text_bitmap.getByteCount());

    text_bitmap.copyPixelsToBuffer(text_timestamp_buffer_);

    int scale_w = 0, scale_h = 0, scale_filter_mode = 0;

    libPublisher.PostLayerImageRGBA8888ByteBuffer(handle_, index, left, top, text_timestamp_buffer_, 0,
            text_bitmap.getRowBytes(), text_bitmap.getWidth(), text_bitmap.getHeight(),
            0, 0, scale_w, scale_h, scale_filter_mode,0);

    int ret = scale_h > 0? scale_h : text_bitmap.getHeight();

    text_bitmap.recycle();

    return ret;
}

文字水印

文字水印不再赘述,主要注意的是文字的大小、颜色、位置。

private int postText1Layer(int index, int left, int top) {
    Bitmap text_bitmap = makeTextBitmap("文本水印一", getFontSize()+8,
            Color.argb(255, 200, 250, 0),
            false, 0,false);

    if (null == text_bitmap)
        return 0;

    ByteBuffer buffer = ByteBuffer.allocateDirect(text_bitmap.getByteCount());
    text_bitmap.copyPixelsToBuffer(buffer);

    libPublisher.PostLayerImageRGBA8888ByteBuffer(handle_, index, left, top, buffer, 0,
            text_bitmap.getRowBytes(), text_bitmap.getWidth(), text_bitmap.getHeight(),
            0, 0, 0, 0, 0,0);

    int ret = text_bitmap.getHeight();

    text_bitmap.recycle();

    return ret;
}

最终投递接口设计如下,接口不再赘述,几乎你期望的针对图像的处理,都已覆盖:

/**
   * 投递层RGBA8888图像,如果不需要Aplpha通道的话, 请使用RGBX8888接口, 效率高
   *
   * @param index: 层索引, 必须大于等于0, 注意:如果index是0的话,将忽略Alpha通道
   *
   * @param left: 层叠加的左上角坐标, 对于第0层的话传0
   *
   * @param top: 层叠加的左上角坐标, 对于第0层的话传0
   *
   * @param rgba_plane: rgba 图像数据
   *
   * @param offset: 图像偏移, 这个主要目的是用来做clip的, 一般传0
   *
   * @param row_stride: stride information
   *
   * @param width: width, 必须大于1, 如果是奇数, 将减1
   *
   * @param height: height, 必须大于1, 如果是奇数, 将减1
   *
   * @param  is_vertical_flip: 是否垂直翻转, 0不翻转, 1翻转
   *
   * @param  is_horizontal_flip:是否水平翻转, 0不翻转, 1翻转
   *
   * @param  scale_width: 缩放宽,必须是偶数, 0或负数不缩放
   *
   * @param  scale_height: 缩放高, 必须是偶数, 0或负数不缩放
   *
   * @param  scale_filter_mode: 缩放质量, 传0使用默认速度,可选等级范围是:[1,3],值越大缩放质量越好, 但速度越慢
   *
   * @param  rotation_degree: 顺时针旋转, 必须是0, 90, 180, 270, 注意:旋转是在缩放, 垂直/水品反转之后再做, 请留意顺序
   *
   * @return {0} if successful
   */
  public native int PostLayerImageRGBA8888ByteBuffer(long handle, int index, int left, int top,
                       ByteBuffer rgba_plane, int offset, int row_stride, int width, int height,
                       int is_vertical_flip,  int is_horizontal_flip,
                       int scale_width,  int scale_height, int scale_filter_mode,
                       int rotation_degree);

以上水印的显示控制,我们通过LayerPostThread封装处理:

/*
 * LayerPostThread实现动态水印封装
 * Author: https://daniusdk.com
 */
class LayerPostThread extends Thread
{
  private final int update_interval = 400; // 400 毫秒
  private volatile boolean is_exit_ = false;
  private long handle_ = 0;
  private int width_  = 0;
  private int height_ = 0;
  private volatile boolean is_text_ = false;
  private volatile boolean is_picture_ = false;
  private volatile boolean clear_flag_ = false;

  private final int timestamp_index_ = 1;
  private final int text1_index_ = 2;
  private final int text2_index_ = 3;
  private final int picture_index_ = 4;
  private final int rectangle_index_ = 5;

  ByteBuffer text_timestamp_buffer_ = null;
  ByteBuffer rectangle_buffer_ = null;

  @Override
  public void run() {
      text_timestamp_buffer_ = null;
      rectangle_buffer_ = null;

      if (0 == handle_)
          return;

      boolean is_posted_pitcure = false;
      boolean is_posted_text1 = false;
      boolean is_posted_text2 = false;

      int rectangle_aplha = 0;

      while(!is_exit_) {
          long t = SystemClock.elapsedRealtime();

          if (clear_flag_) {
              clear_flag_ = false;
              is_posted_pitcure = false;
              is_posted_text1 = false;
              is_posted_text2 = false;

              if (!is_text_ || !is_picture_) {
                  rectangle_aplha = 0;
                  libPublisher.RemoveLayer(handle_, rectangle_index_);
              }
          }

          int cur_h = 8;
          int ret = 0;

          if (!is_exit_ && is_text_) {
              ret = postTimestampLayer(timestamp_index_, 0, cur_h);
              if ( ret > 0 )
                  cur_h = align(cur_h + ret + 2, 2);
          }

          if(!is_exit_&& is_text_&&!is_posted_text1) {
              cur_h += 6;
              ret = postText1Layer(text1_index_, 0, cur_h);
              if ( ret > 0 ) {
                  is_posted_text1 = true;
                  cur_h = align(cur_h + ret + 2, 2);
              }
          }

          if (!is_exit_ && is_picture_ && !is_posted_pitcure) {
              ret = postPictureLayer(picture_index_, 0, cur_h);
              if ( ret > 0 ) {
                  is_posted_pitcure = true;
                  cur_h = align(cur_h + ret + 2, 2);
              }
          }

          if(!is_exit_&& is_text_&&!is_posted_text2) {
              postText2Layer(text2_index_);
              is_posted_text2 = true;
          }

          // 这个是演示一个矩形, 不需要可以屏蔽掉
          if (!is_exit_ && is_text_ && is_picture_) {
                  postRGBRectangle(rectangle_index_, rectangle_aplha);
                  rectangle_aplha += 8;
                  if (rectangle_aplha > 255)
                      rectangle_aplha = 0;
          }

          waitSleep((int)(SystemClock.elapsedRealtime() - t));
      }

      text_timestamp_buffer_ = null;
      rectangle_buffer_ = null;
  }

实时文字水印可以通过控制显示还是隐藏:

public void enableText(boolean is_text) {
      is_text_ = is_text;
      clear_flag_ = true;
      if (handle_ != 0) {
          libPublisher.EnableLayer(handle_, timestamp_index_, is_text_?1:0);
          libPublisher.EnableLayer(handle_, text1_index_, is_text_?1:0);
          libPublisher.EnableLayer(handle_, text2_index_, is_text_?1:0);
      }
  }

如需移除图层,也可以调用RemoveLayer()接口,具体设计如下:

/**
   * 启用或者停用视频层, 这个接口必须在StartXXX之后调用.
   *
   * @param index: 层索引, 必须大于0, 注意第0层不能停用
   *
   * @param  is_enable: 是否启用, 0停用, 1启用
   *
   * @return {0} if successful
   */
  public native int EnableLayer(long handle, int index, int is_enable);


  /**
   * 移除视频层, 这个接口必须在StartXXX之后调用.
   *
   * @param index: 层索引, 必须大于0, 注意第0层不能移除
   *
   * @return {0} if successful
   */
  public native int RemoveLayer(long handle, int index);

针对启动水印类型等外层封装:

private LayerPostThread layer_post_thread_ = null;

  private void startLayerPostThread() {
      if (3 == video_opt_) {
          if (null == layer_post_thread_) {
              layer_post_thread_ = new LayerPostThread();
              layer_post_thread_.startPost(publisherHandle, videoWidth, videoHeight, currentOrigentation, isHasTextWatermark(), isHasPictureWatermark());
          }
      }
  }

  private void stopLayerPostThread() {
      if (layer_post_thread_ != null) {
          layer_post_thread_.stopPost();
          layer_post_thread_ = null;
      }
  }

总结

Android平台获取设备电量信息和设备实时信号状态,然后叠加到视频view,投递出去,比如执法记录仪之类场景下,非常有价值,可以让GB28181平台侧,获取到更多需要的信息,扩展性极强。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端 的相关文章

  • GB28181-2022相对2016版“基于TCP协议的视音频媒体传输要求“调整

    规范解读 GB28181 2022针对 基于TCP协议的视音频媒体传输 实时点播 历史视频回放与下载中 TCP媒体传输重连机制 做了说明 修改后的 基于TCP协议的视音频媒体传输要求 如下 实时视频点播 历史视频回放与下载的TCP媒体传输应
  • Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

    我们在做Android平台RTMP推送和GB28181设备对接的时候 遇到这样的问题 有的设备 麦克风采集出来的audio 音量过高或过低 特别是有些设备 采集到的麦克风声音过低 导致播放端听不清前端采集的audio 这时候 就需要针对采集
  • GB28181设备接入侧如何对接外部编码后音视频数据并实现预览播放

    技术背景 我们在对接GB28181设备接入模块的时候 遇到这样的技术诉求 好多开发者期望能提供编码后 H 264 H 265 AAC PCMA 数据对接 确保外部采集设备 比如无人机类似回调过来的数据 直接通过模块 对接到GB28181平台
  • ​​Android平台GB28181历史视音频文件下载规范探讨及技术实现

    技术背景 上篇blog 我们提到了 Android平台GB28181历史视音频文件检索规范探讨及技术实现 文件检索后 GB28181平台侧 可以针对文件列表进行回放或下载操作 本文主要探讨视音频文件下载相关 规范解读 视音频文件下载基本要求
  • NV21、NV12、YV12、RGB565、YUV等颜色编码格式区别和接口设计探讨

    NV21 NV12 YV12 RGB565 YUV扫盲 NV21 NV12 YV12 RGB565 YUV分别是不同的颜色编码格式 这些颜色编码格式各有特点 适用于不同的应用场景 选择合适的颜色编码格式取决于具体的需求和环境 NV21 NV
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨

    什么是智慧可视化指挥控制系统 智慧可视化指挥控制平台通过4G 5G网络 WIFI实时传输视音频数据至指挥中心 特别是在有突发情况时 可以指定一台执法仪为现场视频监控器 实时传输当前画面到指挥中心 指挥中心工作人员可通过麦克风向现场执法人员下
  • Android平台如何高效率实现GB28181对接?

    技术背景 GB28181协议是一种用于设备状态信息报送的协议 可以在不同设备之间进行通信和数据传输 在安卓系统上实现GB T 28181非常必要 GB28181协议实现分两部分 一部分是信令 另外一部分就是媒体数据的编码 信令主要包括SIP
  • GB/T28181设备接入端如何应用到数字城管场景?

    什么是数字城管 数字城管 又称 数字化城市管理 或 智慧城管 是一种采用信息化手段和移动通信技术来处理 分析和管理整个城市的所有城管部件和城管事件信息 促进城市管理现代化的信息化措施 数字城管通过建立城市管理信息化平台 实现城市管理信息的采
  • GB28181平台如何接入无人机实现智能巡检?

    大家都知道 无人机巡检系统 有效解决了传统巡查工作空间和时间局限问题 降低人力工作成本 有效替代人工巡检工作模式 智能巡检系统通过人工智能技术和机械智能技术完美结合 在工业等场景下 应用非常广泛 本文旨在讲如何实现无人机 如大疆无人机 数据
  • Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

    技术背景 我们在Android平台实现GB28181设备接入 把摄像头和麦克风数据 采集过去 用于移动单兵 智能车载 智慧安防 智能家居 工业仿真等行业时 发现大多场景对视频水印的要求越来越高 从之前的固定位置静态文字水印 png水印等慢慢
  • Android平台GB28181设备接入端如何调节实时音量?

    我们在对接Android平台GB28181设备接入端的时候 有开发者提出这样的疑惑 如何调整设备接入端的实时音量 实际上 这块我们前几年在做RTMP直播推送模块的时候 已经发布了相关的接口 这里再回顾下 SmartPublisherJniV
  • GB/T28181-2022针对H.265、AAC的说明和技术实现

    GB T28181 2022规范说明 GB T28181 2022相对来GB T28181 2016针对H 265 AAC的更新如下 更改了 联网系统通信协议结构图 媒体流通道增加了 H 265 G 722 1 AAC 见 4 3 1 20
  • GB/T28181-2022图像抓拍规范解读及技术实现

    规范解读 GB28181 2022相对2016 增加了设备软件升级 图像抓拍信令流程和协议接口 我们先回顾下规范说明 图像抓拍基本要求 源设备向目标设备发送图像抓拍配置命令 携带传输路径 会话ID等信息 目标设备完成图像传输后 发送图像抓拍
  • Android平台GB28181设备接入模块相关博客概览

    Android平台GB28181设备接入模块 可实现不具备国标音视频能力的 Android终端 通过平台注册接入到现有的GB T28181 2016服务 可用于如智能监控 智慧零售 智慧教育 远程办公 生产运输 智慧交通 车载或执法记录仪等
  • GB/T 28181联网系统通信协议结构和技术实现

    技术回顾 在本文开头 我们先一起回顾下GB T28181联网系统通信协议结构 联网系统在进行视音频传输及控制时应建立两个传输通道 会话通道和媒体流通道 会话通道用于在设备之间建立会话并传输系统控制命令 媒体流通道用于传输视音频数据 经过压缩
  • GB28181设备接入侧如何支持H.265?

    技术背景 一直以来 GB28181 2022之前的规范版本让人诟病的一点 没有明确针对H 265的说明 特别是监控摄像机 H 265已然成为标配 GB T28181 2022规范 终于针对H 265做了明确的说明 让我们来一起解读下规范 基
  • GB28181控制、传输流程和协议接口之注册

    注册和注销基本要求 SIP客户端 网关 SIP设备 联网系统等 SIP代理 SIP UA 使用IETFRFC3261中定义的方法 15 GB T28181 2016Register进行注册和注销 注册和注销时应进行认证 认证方式应支持数字摘
  • [技术分享]Android平台实时音视频录像模块设计之道

    实现背景 录像有什么难的 无非就是数据过来 编码保存mp4而已 这可能是好多开发者在做录像模块的时候的思考输出 是的 确实不难 但是做好 或者和其他模块有非常好的逻辑配合 确实不容易 好多开发者希望聊聊录像模块 实际上录像这块 需求层面的东
  • Android平台GB28181设备接入侧(编码前

    在之前 我有写过Android平台GB28181设备接入模块的好多blog 包括参数设置 功能支持与扩展等 以数据接入为例 支持的数据类型涉及编码前 编码后或直接流数据 RTSP或RTMP流 可用于如智能监控 智慧零售 智慧教育 远程办公
  • GB28181状态信息报送解读及Android端国标设备接入技术实现

    今天主要聊聊GB T28181状态信息报送这块 先回顾下协议规范相关细节 然后再针对代码实现 做个简单的说明 状态消息报送基本要求 当源设备 包括网关 SIP设备 SIP客户端或联网系统 发现工作异常时 应立即向本 SIP监控域 的SIP服

随机推荐

  • git push --force

    一 force命令 如果git要强制覆盖 那么可以使用 force命令 git push force origin 二 参考资料 1 阮一峰 Git远程操作详解
  • Java操作excel之POI和easyExcel 教程详解 狂神笔记

    文章目录 1 应用场景 2 Apache POI 简介 项目准备 代码演示 大文件写HSSF 03 大文件写XSSF 07 大文件写SXSSF 07升级版 POI Excel读 3 easyExcel 简介 项目准备 EasyExcel写入
  • 宝塔php7.0shell,BT_Panel 宝塔开心面板/V7.0.1开心版

    脚本简介 本次面板版本 7 0 1 本脚本支持一键安装开心版宝塔面板 以及 已经安装宝塔面板升级开心版 感谢大家使用 书记的脚本 本脚本未加密 有没有后门大家自己看就知道了 如果你使用了类似 书记的脚 出现问题 以及 脚本地址非本人的 或者
  • 金碟生产相关表

    生产订单表 SELECT FInterID from AIS20151222141907 dbo ICMO where left convert varchar FPlanCommitDate 120 10 gt 2020 08 01 an
  • Bridge桥接模式

    作用 将抽象部份与它的实现部份分离 使它们都可以独立地变化 将抽象 Abstraction 与实现 Implementation 分离 使得二者可以独立地变化 桥接模式号称设计模式中最难理解的模式之一 关键就是这个抽象和实现的分离非常让人奇
  • JVM基础知识

    目录 1 前言 2 JVM运行流程 3 JVM运行时数据区 4 JVM类加载 5 有关垃圾回收 1 前言 本文只是针对面试中比较常见的有关JVM的问题做出补充 俗称八股文 同时帮助大家对JVM建立一个感性的认识 所以并不会对JVM有过多的深
  • [原]Qt Designer中自定义控件的使用(提升法与插件法)

    准备乱写一点Qt自定义Widget在Designer中的使用 可是又不想重复提升法 promotion 及插件法基本用法 因为Manual中Using Custom Widgets with Qt Designer已经说的很清楚了 使用de
  • 解决:Jetson系列python3 import 报错 “Illegal instruction core dumped “

    解决 Jetson系列python3 import 报错 Illegal instruction cpre dumped 解决方法 解决方法 编辑环境变量 sudo gedit bashrc 在最后一行添加 export OPENBLAS
  • mongod: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file:

    mongod error while loading shared libraries libcrypto so 1 0 0 cannot open shared object file No such file or directory
  • 14个提高代码质量的好问题

    阅读本文大概需要 2 6 分钟 并不是代码写的越多 代码的质量就越高 思考才是 解决一个问题 打开电脑就手撕代码 最终的结果往往是各种代码问题 经过一系列迭代后 代码积重难返 最终的结果就是推到重来 前期的付出都白费 最典型的就是现在所谓的
  • 图像中不规则物体的长轴与短轴:OpenCV实现指南

    1 首先 读取图像并将其转换为灰度图像 2 进行图像预处理 包括使用高斯模糊和阈值化 以便更好地处理图像 3 通过使用OpenCV的cv2 findContours 函数 找到图像中的所有轮廓 4 遍历所有轮廓 如果轮廓点的数量大于等于5个
  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展 AI绘画已经成为一个非常热门的领域 AI绘画的应用范围非常广泛 它对于设计 摄影等领域产生了积极影响 但同时 由于AI绘画的版权究竟归属于谁 AI绘画也引起了版权的争议 那么 AI到底是创造艺术还是窃取艺术呢 本文将
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • html+css实现一个响应式管理平台架构模板

    文本将会带你使用html css实现一个响应式的管理平台架构模板 目前来说市面上的管理平台架构模板大同小异 文本的知识点都会符合场景所需 目录 1 管理平台的架构内容 2 顶部的布局 3 下半部分布局 4 左侧菜单区域实现 5 右侧主体区域
  • 【EasyExcel 教程】详解写入Excel -- 写入

    愿你如阳光 明媚不忧伤 目録 4 详解写入Excel 4 1 简单写入Excel 4 2 根据参数导出指定列 排除或指定 4 3 指定写入的列 4 4 复杂头写入 4 5 日期 数字或者自定义格式的转换 4 6 图片导出 列宽 行高注解 4
  • react简介

    1 React简介 1 1 react发展历史 react是facebook开发的 vue 尤雨溪 angular 谷歌 收购的 facebook在构建instagram网站的时候遇见两个问题 数据绑定的时候 大量操作真实dom 性能成本太
  • python爬虫遇到的问题:selenium引用chromedriver出现的问题

    traceback Traceback most recent call last File D Anaconda35 lib site packages selenium webdriver chrome service py line
  • 大佬,一款小而美的Application组件,了解一下

    简介 Android开发过程中 Application类的角色不容忽视 它不仅是程序启动的入口 同时也代表着整个应用程序的生命周期 在Application中 我们通常执行以下操作 初始化各种第三方库 注册ActivityLifecycle
  • jQuery 入门教程(16): 设置或取得元素的CSS class

    jQuery支持方法用来操作HTML元素的CSS 属性 下面的方法为jQuery 提供的CSS操作方法 addClass 为指定的元素添加一个或多个CSS类 removeClass 为指定的元素删除一个或多个CSS类 toggleClass
  • Android平台如何实时叠加电量信息和设备信号状态到GB28181接入端

    技术背景 我们在Android平台实现GB28181设备接入 把摄像头和麦克风数据 采集过去 用于移动单兵 智能车载 智慧安防 智能家居 工业仿真等行业时 发现大多场景对视频水印的要求越来越高 从之前的固定位置静态文字水印 png水印等慢慢