Android 2.2 のカレンダーContentProvier に対応

タオソフトウェアさんの Android 2.2 のカレンダーパッケージ名 | の記事を見て、
カレンダーのRead/Writeを行っている自アプリも対応させないといけないなあ、と思いつつ
何となく動いている(時々、カレンダーアイテム削除の反応が遅いくらい)ので放置していたのですが、やっと対応しました。

自アプリの場合、カレンダーパッケージを叩いているわけではなく、ContentProvier経由でカレンダーのRead/Writeを実行しているのですが、
下記のようにContentProvierが変更されていました。

Android 2.2未満
content://calendar
Android 2.2以上
content://com.android.calendar

自アプリでは、Androidの元ソースのandroid.provider.Calendar をコピペしてCONTENT_URIを参照していました。

package android.provider;

import ....

public final class Calendar {

    public static final String AUTHORITY = "calendar";

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

その部分を今回、下記のように置き換えました。
定数:CONTENT_URIの部分を、static初期化ブロック内でAndroidバージョンを判定して置換しているのがポイントです。
自アプリ側では、Androidバージョンの違いを意識することはありません(正確には、新規追加されたColumnがあるのだが、自アプリでは使っていないので)。

package android.provider;

import ....

public final class Calendar {

    // AUTHORITY は、static{} で初期化。
    public static final String AUTHORITY;

    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

    static {
        final int sdkVersion = Build.VERSION.SDK_INT;
        // 8=Build.VERSION_CODES.FROYO
        if (sdkVersion < 8) {
            AUTHORITY = "calendar";
        } else {
            AUTHORITY = "com.android.calendar";
        }
    }

これで、Android 2.2 のカレンダーContentProvierに対応できたのですが、HTC SenseやAUのカレンダーContentProvierも違うらしいです。HTC Senseは、Desireがあるので対応する予定です。AUのやつは、実機が無いので検証できないのと、自アプリのニーズが少ないと思うので対応予定はありません。
HTCの場合でも、ContentProvierの部分はAndroid標準のAPIと互換性があるので上記の"content://com.android.calendar"のままでいけました。