加密图片

更新时间:2023-09-19 02:33:12下载pdf

设备在触发侦测报警时,通常会上传并存储一张实时视频的截图。通过 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) {

        }
    });
}