[英]How can I show a preferences screen on older Android devices i.e. Gingerbread and Froyo?
[英]How can I use BitmapRegionDecoder code in android 2.2.2 (Froyo)?
我正在阅读关于 SO的另一个问题的答案,其中@RomainGuy 评论说可以(如果我解释不正确,请纠正我)将代码从 android 的更高版本反向移植到早期版本。 具体来说,我有兴趣将 BitmapRegionDecoder 的代码从 Android 版本 2.3.3 (Gingerbread) 反向移植到版本 2.2.2 (Froyo)。
我宁愿更笼统地问这个问题,因为最佳实践是什么/当将代码从 Android 的较新版本反向移植到旧版本时应该避免什么,但 stackoverflow 暗示我的问题可能会因为过于主观而被关闭。
也许如果对该主题有足够的兴趣,这个问题可以“变形”为更一般的问题..可能是社区维基?
无论如何,如果能深入了解这是如何完成的,我将不胜感激。无论是针对我的用例,还是更一般的建议。 从 java class 内部调用本地方法是否会使事情复杂化(必然涉及 NDK)?
如果确实有可能(并且合理地)以这种方式挑选和向后移植代码,我想很多人会发现知道如何做非常有用。
正如@hackbod 提到的, BitmapRegionDecoder
基于外部skia
库。 但这可能是一个好处。
让我们检查原始来源:
BitmapRegionDecoder.java
。 主要围绕本地方法定义包装器:
private static native Bitmap nativeDecodeRegion(int lbm, int start_x, int start_y, int width, int height, BitmapFactory.Options options); private static native int nativeGetWidth(int lbm); private static native int nativeGetHeight(int lbm); private static native void nativeClean(int lbm); //...multiply nativeNewInstance overloads follow
Class 不使用我们需要向后移植的任何新的 Java API。
BitmapRegionDecoder.cpp
。 它包含的 Header 个文件由Froyo
中存在的文件组成,除了以下两个:
AutoDecodeCancel.h
。 唯一使用它的行:
AutoDecoderCancel adc(options, decoder);
这个 class 处理SkDecoder
实例生命周期。 这是一小段代码,可以很好地向后移植。
SkBitmapRegionDecoder.h
正如文件名所述,这是一个核心组件。 事实上,之前的所有内容都是它的一种包装。 好消息是我们可能不需要向后移植它,因为它应该可以从Gingerbeard
获取整个skia
库并在Froyo
下编译它,因为它是外部的并且不包含任何新的依赖项。
PS 我实际上并没有深入研究代码,所以如果有任何我忽略的地方,请纠正我。
我们需要的源代码位于分支 froyo froyo-release
和gingerbread-mr4-release
的以下存储库中:
include/core
和include/images
graphics/java/android/graphics/BitmapRegionDecoder.java
core/jni/android/graphics/...
您可以向后移植一些代码,如果它可以存在于您要移植到的 SDK 之上。
你不能向后移植任何东西。 例如,您无法向后移植 kernel 功能。 :)
在这种情况下,没有简单的解决方案来向后移植它。 它的实现位于 Skia 和 jpeg 解码器之上,它们都是本机代码。 您将需要自己执行该代码。 您可以尝试从平台复制/粘贴代码,使用 JNI 将其与您的代码粘合在一起,但这将是大量工作,并且留给您需要继续维护的本机代码。
抱歉,没有简单的解决方案。
您应该考虑BitmapRegionDecoderCompat ,它是标准BitmapRegionDecoder (API 10+) 的API 8+版本。
decodeBestRegion()
,它根据您的参数(重力,大小)提取“最佳”图像子区域。 此方法也适用于 API < 10。为了在您的项目中使用它,您可以手动下载库并将其添加为AAR文件:
或者您可以在build.gradle中添加依赖项(需要jCenter存储库):
dependencies {
//...your dependecies
compile 'org.bonnyfone:brdcompat:0.1'
}
如文档中所述,为了迁移到 BRDCompat,您只需将基本名称 class 从BitmapRegionDecoder
为BitmapRegionDecoderCompat
:
//BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(...);
BitmapRegionDecoderCompat brd = BitmapRegionDecoderCompat.newInstance(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.