
この記事では、文書化されていないAPIを使用して標準のAndroidカレンダーを操作する方法について説明します。 このトピックに関するロシア語の記事は見つかりませんでした。英語では、古くなったデータを含む投稿はほとんどありません。 誰が興味がある-猫の下。
なぜ!?
大学のスケジュールをまとめるための申請書を書いていたとき、私はそのような問題に直面しました。 スケジュールを個別に用意しておくと便利です。標準カレンダーでも、1週間後の繰り返しイベントはサポートされていません。これは2週間(奇数/偶数)のスケジュールに必要です。
修正のアイデアは、入力したスケジュールでAndroidカレンダーに「入力」できるアプリケーション機能でした。 利点は明白です:グーグルカレンダーグーグル(トートロジーの申し訳ありません)、組み込みのカレンダーウィジェット(このウィジェットはHTC Senseから非常に優れています)、および少なくとも次のイベント、少なくとも毎週のワークロードなどを表示する山のサードパーティウィジェットとの同期 ここで、Androidカレンダーを操作する必要がありました。
文書化されていないAPIの使用は悪いです! プナネンコ?

この明らかな問題を解決するには、文書化されていないAPIを使用する必要が本当にありますか? 答えはノーです。 最も正しい方法は
、Google Calendar APIを使用することです。これは、開発時に行うことをお勧めします。
しかし、「正しい」方法にはいくつかの制限があります。
•インターネット接続がない場合は使用できません。
•カレンダーに記入した後に同期が必要。
•データ(1年を埋めるときに少なからず)はサーバーに送られ、同期中に戻ります。これにより、明らかにトラフィックが2倍になります。
私の意見では、オフラインバージョンのカレンダーを使用する方がはるかに便利です。オフラインバージョンは、いつでもGoogleカレンダーと同期できます。 残念ながら、googleはAndroidの開発者の面倒をみず、公式のAPIを公開しませんでしたが、Androidのソースコードは公開されており、賢い人々は長い間、マジックURIコンテンツプロバイダーを見つけました。
ユーザーにカレンダーを使用する許可を求めます
パラドックス。 APIはありませんが、ドキュメントには許可があります。
AndroidManifest.xmlに追加するだけです。
<uses-permission android:name="android.permission.READ_CALENDAR"> </uses-permission> <uses-permission android:name="android.permission.WRITE_CALENDAR"> </uses-permission>
統一リソース識別子またはロシア語-URI
Androidカレンダーを使用するには、特定のURIでコンテンツプロバイダーに連絡する必要があります。 残念なことに、このURIはOSのバージョンによって異なり、以下(ドキュメントに記載されていないAPIを使用するコスト)で大きく変わる可能性があります。 しかし、問題は解決可能です。
Froyo [2.2]の場合、次のバージョンの可能性が高い-
コンテンツ://com.android.calendar/calendars 。
バージョン<2.2-
content:// calendar / calendarsの場合 。
ご覧のとおり、すべてがそれほど悪くはありません。 システムのバージョンを判別し、適切なURIを使用できますが、私は別の方法で行った。 <2.2のURIによって何かがあるかどうかを確認し、そこに誰もいない場合は、残りを使用します。
URIが受信されたと仮定します。
カレンダーのリストを取得する
Googleカレンダーのユーザーについては説明する必要はありませんが、残りについては説明します。 共有カレンダーは1つ以上の小さなカレンダーで構成され、マーカーによって色が異なる場合があります。 通常、これは「個人」、「仕事」、「勉強」などのようなものです。 このようなカレンダーは、Googleカレンダーウェブサイトでのみ作成できます。Android自体では、標準ツールでは作成できません。
イベントを追加するには、カレンダーIDを知る必要があります。 このタスクを達成するために、前の段落の構成を使用します。
String[] projection = new String[] { "_id", "name" }; Cursor managedCursor = this.managedQuery(URI, projection, null, null, null); if (managedCursor != null && managedCursor.moveToFirst()) { String calName; String calID; int nameColumn = managedCursor.getColumnIndex("name"); int idColumn = managedCursor.getColumnIndex("_id"); do { calName = managedCursor.getString(nameColumn); calID = managedCursor.getString(idColumn); if (calName != null)
これで、名前の結果セットがインターフェイスに表示され、ユーザーが選択できるようになります。
イベントを追加
ここでは、他のコンテンツプロバイダーと同様に、カレンダーの操作が行われます。 これは
ドキュメントに記載されてい
ます 。
ContentValues event = new ContentValues(); event.put("calendar_id", calID);
イベントフィールドについて話しましょう。 説明フィールドを使用してイベントを示すことをお勧めします。 このフィールドを使用すると、プログラムで作成されたすべてのイベントを一括で削除できます。 名前、説明、場所のフィールドは文字列です。 それとは別に、時間フィールドに言及する価値があります。 これらのフィールドはlong型であり、これらのフィールドの値は、たとえば次の関数によって生成できます。
public static long pickDate(int year, int month, int day, int hour, int minute) { Calendar rightNow = Calendar.getInstance(); int timeShift = rightNow.get(Calendar.ZONE_OFFSET); return Date.UTC(year - 1900, month, day, hour - (timeShift / 3600000), minute, 0); }
あなたは自分でそれを理解するだろうと思う、私はそれが現在のタイムゾーンを考慮に入れていることだけに注意します。
イベントを削除
IDでメッセージを削除するには、そのメッセージをURIに追加する必要があります。
他のフィールドで削除するには、カレンダーで行ったようにカーソルを使用してすべてのイベントを引き出し、IDで選択的に削除できます。
おわりに
結論として、私はあなたがあなた自身の危険とリスクでこれを使用することをもう一度思い出します。 開発中にURIを1回間違えて書いたため、同期中に携帯電話でエラーが発生し始めました(カレンダーの情報をまったく消去して修正しました)。
別の迷惑-エミュレータにはカレンダーがないため、上記のすべてを繰り返すことはできません。
そして結論として。 この記事で説明したように、私は機会を利用してアプリケーションを宣伝するしかありません。
uTimetableと呼ばれる市場で見つけることができます。




そして結論として、私はhabrastudentsに尋ねたいと思います:あなたはあなたの大学でどのような形式を持っていますか(1/2週間)、そしてそれらが2-偶数/奇数または異なる場合、これらの週は何と呼ばれますか? 外国の大学にも興味があります。