7

Android用の条件付きコンパイルはありますか?

API 5 (!!??) で登場したという事実にもかかわらず、ExifInterfaceには Android 2.3 (API 10) で有用な属性がほとんどないという理由だけで、Android 3 (API 11) 用のプロジェクトを作成する必要がありました。アプリを ICS ユーザーに限定したくありません。

ありがとう!

4

3 に答える 3

10

デバイスの現在の API バージョンを動的に確認し、それに応じてさまざまなことを行うことができます。

    if(Build.VERSION.SDK_INT < 14) {
        // Crappy stuff for old devices
    }
    else {
        // Do awesome stuff on ICS
    }

ただし、すべての API で使用できないクラスをインスタンス化する必要がある場合は、実行可能なクラスまたは別のラッパー クラスでインスタンス化する必要があることに注意してください。

    if(Build.VERSION.SDK_INT < 14) {
        // Crappy stuff for old devices
    }
    else {
        // Do awesome stuff on ICS
        new Runnable() {
            new AmazingClassAvailableOnICS();
            (...)
        }.run();
    }
于 2012-11-14T14:02:11.607 に答える
9

import android.annotation.TargetApi;

次に、注釈を使用します。

@TargetApi(11)
public void methodUsesAPI11()
{
...

このトリックを使用すると、非常に単純なことを行うことができます。これにより、API レベル 11 呼び出し (クラス、メソッドなど) を含みandroid:minSdkVersion="8"、マニフェストに設定されたままのコードをコンパイルできます。それ以上、他には何もありません。

後は君しだい。methodUsesAPI11()アプリのクラッシュを防ぎ、古いプラットフォームで他のアクションを実行するには、呼び出す前にプラットフォームのバージョンを確認するか、例外を処理する必要があります。

于 2012-11-14T14:03:40.447 に答える
2

Build.VERSION.SDK_INT を確認するか、注釈を使用するだけで十分ですが、ブックマークしたこのリンクがあなたのケースに関連している可能性があります: http://android-developers.blogspot.com/2010/07/how-to-have-your -cupcake-and-eat-it-it-too.html?m=1

そこに記述されている内容を使用して、互換性がない可能性があるが決してロードされないクラスを持つことができます。これは条件付きコンパイルではありませんが、必要なものかもしれませんが、もう少し複雑です。

于 2012-11-14T14:04:55.343 に答える