Android 2.2 のカレンダーContentProvier に対応
タオソフトウェアさんの Android 2.2 のカレンダーパッケージ名 | の記事を見て、
カレンダーのRead/Writeを行っている自アプリも対応させないといけないなあ、と思いつつ
何となく動いている(時々、カレンダーアイテム削除の反応が遅いくらい)ので放置していたのですが、やっと対応しました。
自アプリの場合、カレンダーパッケージを叩いているわけではなく、ContentProvier経由でカレンダーのRead/Writeを実行しているのですが、
下記のようにContentProvierが変更されていました。
自アプリでは、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"のままでいけました。