加密图片

更新时间:2024-03-04 08:53:15

设备在触发侦测报警时,通常会上传并存储一张实时视频的截图。通过 IPC SDK 获取到的 告警消息 或者 云存储事件 中,都会携带一张加密后的视频截图,需要使用加密图片组件来展示加密图片。

初始化 Fresco

图片解密组件 DecryptImageView 是基于 Fresco 开发的图片加载组件,在加载图片之前,您需要初始化 Fresco 类。

如果其他 SDK 也使用到 Fresco,请将 IPC SDK 的初始化放到最后,避免被覆盖。否则,可能无法正常显示加密图片。

示例代码

public class MyApplication extends Application {
	@Override
	public void onCreate() {
		super.onCreate();
        FrescoManager.initFresco(this);
	}
}

显示加密图片

接口说明

public void setImageURI(String url, byte[] key);

参数说明

参数 说明
url 加密的图片地址
key 加密的图片密钥

示例代码

String encroption = "xxx";
DecryptImageView bg = view.findViewById(R.id.decrypt_image_view);
bg.setImageURI(imgUrl, encroption.getBytes());

报警消息图片

  • 报警消息的加密图片 URL 的值由 图片地址加密密钥 两部分组成,以 {path}@{key} 的格式拼接。展示图片时,您需要将 URL 拆分。
  • 如果图片 URL 字符串的值没有 @{key} 的后缀,则表示这是一张未加密的普通的图片。

示例代码

val img: SimpleDraweeView = findViewById(R.id.img);
if (mUriString.contains("@")) {
    val index = mUriString.lastIndexOf("@")
    try {
        val decryption = mUriString.substring(index + 1)
        val imageUrl = mUriString.substring(0, index)
        val builder = ImageRequestBuilder.newBuilderWithSource(Uri.parse(imageUrl))
                .setRotationOptions(RotationOptions.autoRotateAtRenderTime())
                .disableDiskCache()
        val imageRequest = DecryptImageRequest(builder, "AES", "AES/CBC/PKCS5Padding",
                decryption.toByteArray())
        controller = Fresco.newDraweeControllerBuilder().setImageRequest(imageRequest)
                .build()
    } catch (e: Exception) {
        e.printStackTrace()
    }
} else {
    try {
        uri = Uri.parse(mUriString)
    } catch (e: Exception) {
        e.printStackTrace()
    }
    val builder = Fresco.newDraweeControllerBuilder().setUri(uri)
    controller = builder.build()
}
img.controller = controller

云存储事件图片

云存储事件中,事件截图 TimeRangeBean.snapshotUrl 的值是一个完整的加密过的图片地址,并使用云存储视频播放的统一密钥。

示例代码

String mEncryptKey = "";

CloudBusiness cloudBusiness =new CloudBusiness();
   cloudBusiness.getCloudSecret(devId, new Business.ResultListener<JSONObject>() {
            @Override
            public void onFailure(BusinessResponse bizResponse, JSONObject bizResult, String apiName) {

            }

            @Override
            public void onSuccess(BusinessResponse bizResponse, JSONObject bizResult, String apiName) {
                    mEncryptKey = bizResult.getString("encryptKey");
            }
        });

CloudDayBean dayBean = dayBeanList.get(0);
cloudCamera.getMotionDetectionInfo(devId, dayBean.getCurrentStartDayTime(), dayBean.getCurrentDayEndTime(), offset, limit, new IThingResultCallback<List<TimeRangeBean>>() {
@Override
public void onSuccess(List<TimeRangeBean> result) {
        //获取指定时间相应的移动侦测数据
        TimeRangeBean timeRangeBean = list.get(0);
        if (timeRangeBean.getV() == 2 && !TextUtils.isEmpty(mEncryptKey)) {
          mSnapshot.setImageURI(timeRangeBean.getSnapshotUrl(),            mEncryptKey.getBytes());
        } else {
          mSnapshot.setImageURI(timeRangeBean.getSnapshotUrl());
        }
      }

@Override
public void onError(String errorCode, String errorMessage) {

        }
 });

下载加密图片

接口说明

void downloadEncryptedImg(String url, String key, IThingResultCallback<Bitmap> callback);

参数说明

参数 说明
url 加密图片的地址
key 加密图片的密钥
callback 下载回调,下载成功返回 Bitmap

示例代码

IThingIPCTool tool = ThingIPCSdk.getTool();
if (tool != null) {
    tool.downloadEncryptedImg(url, key, new IThingResultCallback<Bitmap>() {
        @Override
        public void onSuccess(Bitmap result) {

        }

        @Override
        public void onError(String errorCode, String errorMessage) {

        }
    });
}