关于android:如何在使用特定版本的功能时使我的项目与不同的sdk版本兼容

How to make my project compatible with different sdk versions while using features for an specific version

我正在开发一个在Web视图中使用Flash视频的项目。我解决了所有与代码有关的问题,但仅在Honeycomb之下工作。

阅读此书后,我发现了如何解决Android 3.0及更高版本(包括ICS)的问题,但是现在这是一个大问题……如果我使我的项目与ICS兼容,则必须使用该指令,但是那么我就不会在Gingerbread上运行。

要提供更多信息...有问题的代码段是这样的:

1
android:hardwareAccelerated="true"

这是Android 3.0中包含的属性。

那么,我能做些什么来避免构建两个不同的apk(类似于honeyComb之前的apk和post-HoneyComb的后apk)吗?

这是我的Android清单的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<application android:label="@string/app_name"
             android:icon="@drawable/elabora"
             android:theme="@android:style/Theme.NoTitleBar">
    <activity android:name="es.fundacionvodafone.elabora.android.controlador.InicioElaboraTest"
              android:label="@string/app_name"
              android:noHistory="true">
        <intent-filter>
           
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="es.fundacionvodafone.elabora.android.controlador.InicioElabora"
              android:configChanges="orientation|keyboardHidden"
              android:label="@string/app_name"  
              android:hardwareAccelerated="true">
            <!--            
            <intent-filter>
               
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            -->
    </activity>

预先感谢。

更新:
我已经在使用Mike所说的,也就是说,正确定义了minSdk和targetSdk,但是我对以下事实感到困惑。使用这样的项目配置,当您在eclipse中运行项目时,它会提示以下窗口:
Capture
红叉表示项目targetSdk级别高于设备API级别。因此,我认为它只是无法在此设备上运行,但事实是您可以实际运行它,并且可以按预期工作。


OP在他的问题下方发表的评论(基本上表明targetSDK不会影响应用的编译)是完全错误的!不好意思。

简而言之,这里的目的是声明与minSDK不同的targetSDK:这意味着您使用的是更高级别的SDK中的功能,而不是最低级别的SDK,但您已确保向后兼容。换句话说,假设您要使用的功能是最近才引入的,但对您的应用程序而言并不重要。然后,您可以将targetSDK设置为引入此新功能的版本,并将最小值设置为较低的值,以便每个人仍然可以使用您的应用程序。

举个例子,假设您正在编写一个广泛使用手势检测的应用程序。但是,手势可以识别的每个命令也可以通过按钮或菜单来完成。在这种情况下,手势是"很酷的附加功能",但不是必需的。因此,您可以将目标sdk设置为7(引入了GestureDetection库时为" Eclair"),将minimumSDK设置为3级(" Cupcake"),这样即使是拥有旧手机的人也可以使用您的应用。您要做的就是确保您的应用在尝试使用手势库之前检查了其运行的Android版本,以避免在不存在的情况下尝试使用它。 (不可否认,这是一个过时的示例,因为几乎没有人仍然拥有v1.5手机,但是有一段时间保持与v1.5的兼容性确实很重要。)

再举一个例子,如果您想使用Gingerbread或Honeycomb中的功能,可以使用它。有些人很快就会获得更新,但是其他人,尤其是使用较旧的硬件的人,可能会在购买新设备之前坚持使用Eclair。这将使您可以使用一些很酷的新功能,但又不排除您可能的市场的一部分。

Android开发者博客上有一篇非常好的文章,内容涉及如何使用此功能,尤其是我上面提到的如何设计"在使用该功能之前先检查该功能是否存在"。

致OP:我写这篇文章主要是为了将来碰巧碰到这个问题的任何人的利益。


我在对Android清单进行版本控制时遇到类似的问题。对于较旧的电话,我希望具有一些预定义大小的小部件,对于支持调整大小的较新的电话,我希望具有单个可调整大小的小部件。找不到解决方法。这可能就是为什么Google带有多个APK支持的原因。

上面提到的亚当·鲍威尔(Adam's Powell)文章并未解决这种版本问题。 (伟大的文章BTW)。

编辑:找到了解决方案。 android清单中的小部件定义具有可从布尔资源值设置的布尔"已启用"功能。使用标准版本限定的资源目录名称,资源值可以具有每个版本的值。问题已解决。