0

我正在寻找能够使用 PESDK for android 和 ios 将文件系统中的图像放在原始图像上方的解决方案。正如我所见,PESDK 默认不支持此类功能,但贴纸功能看起来与我需要的非常相似。所以,我尝试自定义贴纸行为。这个想法是使用文件系统中的图像提供自定义贴纸列表,并使用适当的预览和图像源创建自定义 ImageStickerConfig。

我面临的第一个问题是贴纸列表屏幕上发生的 OutOfMemory 异常。当我提供与图像源相同的预览源时会发生这种情况(贴纸列表不进行图像缩小)。

第二个问题是当一些不可读(损坏)的图像作为预览源提供时发生的崩溃。我可以提供需要的崩溃日志。

根据上面的故事,我有以下问题:

  1. 除了自定义贴纸行为之外,还有其他方法可以将图像作为叠加层添加到另一个图像吗?
  2. 我可以期望支持预览图像缩小吗?从性能角度来看,将所有图像的缩略图存储在文件系统中的解决方法并不好。
  3. 我可以期望 SDK 以适当的方式处理损坏的图像吗?

提前致谢

编辑 16.01.2018,回答 Sven Nähler 的问题:

  1. 不幸的是,即使 ImageStickerConfig 被扩展,我仍然会收到 OOM 错误。该设备是 LG g3s,android 5.1。日志:

java.lang.OutOfMemoryError:无法在 dalvik.system.VMRuntime.newNonMovableArray(Native Method) 在 android.graphics.nativeDecodeStream(Native Method) 在 dalvik.system.VMRuntime.newNonMovableArray(Native Method) 分配 23970828 字节分配和 16777216 个可用字节和 19MB。 BitmapFactory.decodeStreamInternal(BitmapFactory.java:635) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:611) 在 android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:649) 在 ly.img.android.sdk.decoder.RasterDecoder.getBitmap(RasterDecoder.java:53) 在 ly.img .android.sdk.decoder.ImageSource.getBitmap(ImageSource.java:389) 在 ly.img.android.sdk.decoder.ImageSource.getBitmap(ImageSource.java:376) 在 ly.img.android.sdk.models.config .AbstractConfig.createThumbnailBitmap(AbstractConfig.java:195) 在 ly.img。android.sdk.models.config.AbstractConfig.getThumbnailBitmap(AbstractConfig.java:189) 在 ly.img.android.sdk.models.config.AbstractConfig.getThumbnailBitmap(AbstractConfig.java:173) 在 ly.img.android.sdk。 models.config.AbstractConfig.generateBindDataAsync(AbstractConfig.java:128) 在 ly.img.android.sdk.models.config.AbstractConfig.generateBindDataAsync(AbstractConfig.java:34) 在 ly.img.android.ui.adapter.DataSourceListAdapter$ LoaderList.runEntryProcess(DataSourceListAdapter.java:381) 在 ly.img.android.ui.adapter。DataSourceListAdapter$LoaderList$Task.run(DataSourceListAdapter.java:416)

  1. 日志如下:

java.lang.NullPointerException:尝试在 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1047) 的空对象引用上调用虚拟方法“boolean java.lang.String.equals(java.lang.Object)”在 ly.img.android.sdk.decoder.vector.XmlDrawableDecoder.getDrawable(XmlDrawableDecoder.java:204) 在 ly.img.android.sdk.decoder 的 android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1033) .vector.XmlDrawableDecoder.decodeSize(XmlDrawableDecoder.java:84) 在 ly.img.android.sdk。ly.img.android.sdk.decoder.VectorDecoder.calculateExactSample(VectorDecoder.java:110) 在 ly.img.android.sdk.decoder.VectorDecoder.getBitmap(VectorDecoder. java:62) 在 ly.img.android.sdk.decoder.ImageSource.getBitmap(ImageSource.java:389) 在 ly.img.android.sdk.decoder.ImageSource.getBitmap(ImageSource.java:376) 在 ly.img .android.sdk.models.config.AbstractConfig.createThumbnailBitmap(AbstractConfig.java:195) 在 ly.img.android.sdk.models.config.AbstractConfig.getThumbnailBitmap(AbstractConfig.java:189) 在 ly.img.android.sdk.models.config.AbstractConfig.getThumbnailBitmap(AbstractConfig.java:173) 在 ly .img.android.sdk.models.config.AbstractConfig.generateBindDataAsync(AbstractConfig.java:128) 在 ly.img.android.sdk.models.config.AbstractConfig.generateBindDataAsync(AbstractConfig.java:34) 在 ly.img.android .ui.adapter.DataSourceListAdapter$LoaderList.runEntryProcess(DataSourceListAdapter.java:381)在ly.img.android.ui.adapter.DataSourceListAdapter$LoaderList$Task.run(DataSourceListAdapter.java:416)

4

2 回答 2

0

问题是您的扩展类“PBImageStickerConfig”没有可解析的“CREATOR”。所以android使用默认“ImageStickerConfig”类的“CREATOR”。这会导致忽略您的实现并创建一个普通的“ImageStickerConfig”。

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        super.writeToParcel(dest, flags);
    }

    protected PBImageStickerConfig(Parcel in) {
        super(in);
    }

    public static final Creator<PBImageStickerConfig> CREATOR = new Creator<PBImageStickerConfig>() {
        @Override
        public PBImageStickerConfig createFromParcel(Parcel source) {
            return new PBImageStickerConfig(source);
        }

        @Override
        public PBImageStickerConfig[] newArray(int size) {
            return new PBImageStickerConfig[size];
        }
    };
于 2018-01-23T10:40:16.057 回答
0
  1. 我不太确定,你想做什么,你能解释一下“作为覆盖”是什么意思吗?你是说混合模式吗?

    1. SDK 默认不会降级,因此您必须扩展 ImageStickerConfig 类,并覆盖这两个方法

      @Override public boolean hasStaticThumbnail() { return false; }

      @Nullable public Bitmap getThumbnailBitmap() { int maxWidth = Math.round(PESDK.getAppResource().getDisplayMetrics().scaledDensity * 56); int maxHeight = Math.round(PESDK.getAppResource().getDisplayMetrics().scaledDensity * 56); ImageSource imageSource = getThumbnailSource(); 位图预览 = imageSource != null ?imageSource.getBitmap(maxWidth, maxHeight, true) : null; 返回预览!= null ?预览:BitmapFactoryUtils.NOTING_BITMAP;}

这会将缩小的图像加载到内存中以防止 OutOfMemory 异常。

  1. 当然,损坏的图像不应该导致崩溃。请给我们崩溃日志好吗?也许这是一个错误。

最好的,斯文

于 2018-01-12T19:21:38.590 回答