2010年11月25日木曜日

[google calendar]繰返し登録方法


Googleカレンダーでイベントを繰り返し登録する方法を探したところ、
以下の話題がありました。
Google calendar API での繰り返しスケジュールの取得


"RRULE:FREQ=WEEKLY;..." といった形式で繰返しが登録できるとのこと。
詳しいフォーマットとしては、色いろあるようで
 FREQ=DAILY/WEEKLY/YEARLY (毎日/週ごと)
 BYDAY=MON/FRI (曜日指定)
 INTERVAL=2 (間隔)


これらを組み合わせて、以下の設定が可能。


隔週月曜日
 FREQ=WEEKLY; INTERVAL=2; BYDAY=MON;
毎年最終月曜日
 FREQ=YEARLY; BYDAY=-1MON; (-1で最終〜になる) 

で、今回は毎年同じ日に登録したい場合は、単純に以下だけ。
 FREQ=YEARLY;


で、ここから例えば、何年間だけ同じ日に登録したいときは
どうするのか?
方法は2つあるみたいですが、片方しか試してないので、
とりあえずわかった方を記載しておきます。


■UNTILを使う方法
 以下のように記載するとどうやら2015年1月1日まで
 繰り返し登録することが可能みたい。

 FREQ=YEARLY UNTIL=20150101;
 

以下が実際に書いたコード

ContentValues values = new ContentValues();
    ContentResolver cr = this.getContentResolver();

    values.put("calendar_id", calId);
    values.put("title", title);
    values.put("allDay", 1);
    values.put("dtstart", startDay);
    values.put("dtend", endDay);

    values.put("rrule", "FREQ=YEARLY;UNTIL=20150101T010000Z");
    values.put("duration", "P1D");

    cr.insert(events, values);



rruleで、2015年まで毎年登録。
durationは設定しておかないとエラーになってしまいますが、
なぜ必要なのかはまだ不明です…

■COUNTを使う方法
 こちらの方法でもいけるのかな?未確認です。


2010年11月17日水曜日

[android]連絡先から誕生日をGoogleカレンダーに登録するアプリ「Birth2Cal」1.0.1公開しました。

marketに公開中のアプリ「Birth2Cal」のバージョンアップしました。
ちょっと紆余曲折ありまして、アプリを再度登録しなおしております。


■旧 Birth2Calからver.1.0.1の変更点
・ユーザのリスト表示がふりがなソート順になりました
・誕生日だけでなく、記念日も表示しました。

・アイコンが透過できていなかったのを修正。
・実はandroid2.2 のみから2.1も対応。
 (但し、動作確認は出来ておりません。)

■今後の対応予定
・現在、カレンダーへの登録が1年分しか行っていないため、
 繰り返し登録年数の設定
・アプリ起動時の読込み時、2〜3秒かかっているため、
 「読込中」などの表示をつける。
・登録完了時のダイアログに[OK]ボタンの設置

となっております。
不具合、要望等ありましたらコメント等いただければと思います。

2010年11月16日火曜日

[android]ふりがなソートについて

連絡帳から情報をリスト化するときに、よくありがちな
「ふりがなでソートがしたい」のメモです。


managedQuery()メソッドを使用してリスト表示していました。
ふりがなソートを行うにあたり以下の情報で、
苗字/名前のふりがなが参照できます。
android.provider.ContactsContract.CommonDataKinds.StructuredName
PHONETIC_FAMILY_NAME
PHONETIC_GIVEN_NAME


それそを以下のsortOrderで指定すればソート完成!
managedQuery(uri,projection,selection,selectionArgs,sortOrder)


となるのですが、ふりがな情報と、別のクラスの情報を選択して表示する場合、
selection で設定ができませんでした。
よく見てみると、それぞれのクラスには「CONTACT_ID」データがあるので、
それを使えば他のクラスのデータと関連した選択が可能になるらしい。


以上を踏まえた結果、以下のコードのようになりました。

Cursor c1 = managedQuery(uri, projection,
Data.MIMETYPE + "=?",
 new String[] { StructuredName.CONTENT_ITEM_TYPE },
StructuredName.PHONETIC_FAMILY_NAME + " ASC ,"
+ StructuredName.PHONETIC_GIVEN_NAME + " ASC");
while (c1.moveToNext()) {
Cursor c2 = managedQuery(uri, projection,
Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[] { c1.getString(0),Event.CONTENT_ITEM_TYPE},
null);
while (c2.moveToNext()) {
//出力の記述
}
}



2010年11月14日日曜日

連絡先から誕生日をGoogleカレンダーに登録するアプリ「Birth2Cal」

あまりうまく探せていなかったせいかもしれませんが、ガラケーであった、
「連絡先に登録しているユーザの誕生日がカレンダーに表示」するアプリが
見当たらなかったので、自分で作ってみました。

欲しかった機能としては、
・連絡先のリストから、誕生日データが登録されているユーザの誕生日を拾って、
自分のGoogleカレンダーへ登録する
・Googleカレンダーは、自分が使っている他のアプリと連動したいので、
Googleカレンダーに登録できるようにしたいと考えていました。
・とりあえずは、自分が使用している環境(Nexus One)での動作が出来ればよい。

といった感じになっています。
実際に動かした画面が下のような感じです。


現在以下の不具合と要望が出ていますので対応予定です。

不具合
・登録していないカレンダーに対し、カレンダーに登録が可能。
ただし実際はカレンダーには出ていない。
・アイコンが微妙すぎるw

要望
・名前がソート順のほうが良い
・誕生日以外の記念日にも対応



2010年11月13日土曜日

アプリデータ保存方法のプリファレンスについて

androidアプリにて、データを保存する方法がいくつかあり、
そのうちの1つが「プリファレンス」。
あまりデータサイズが大きくないものに関して使用するのがほとんだそうで、
今回は簡単な設定を残すのに使用しました。

保存するデータ型は、String/boolean/float/int/long型が使用可能で、
下はString型を使用して、プリファレンスの保存をした例です。

SharedPreferences pref = getSharedPreferences("プリファレンス名", MODE_PRIVATE);
Editor e = pref.edit();
e.putString("キー名1"," Test1 ");
//e.putString("キー名2"," Test2 ");
e.commit();
一つのプリファレンスに対し、キーは複数登録できるみたいなので、
上記の記載が可能です。
なお、MODE_PRIVATEは自分のアプリでのみ使用できることを指しています。
他に、MODE_WORLD_READABLEで、他アプリから読み取り可能、MODE_WORLD_WRITEABLEで、他アプリから書き込み可能 となっています。

下はプリファレンスを取得した例です。

SharedPreferences pref = getSharedPreferences("プリファレンス名", MODE_PRIVATE);
String str1 = pref.getString("キー名1","");
String str2 = pref.getString("キー名2","hogehoge");
pref.getString("キー名1","")の第二引数は、
このキーが登録されていないときの初期値になります。

2010年11月2日火曜日

ListViewにCheckBoxを追加してみた。

前回の時点で連絡帳から、名前と誕生日をリスト表示することができました。
今回は、表示された名前と誕生日に対してチェックボックスを追加してみました。


まず、layoutにCheckBoxを追加して、そのIDに対して
view.findViewById(R.id.CheckBox)とかするわけですが、
ListViewを行っているため、チェックボックスにチェックを入れても、
そのチェックボックスが画面外に出てしまうと、
チェックが保持されません。


そこで、チェックボックスにチェックが入ったことを、
setOnClickListenerを使用して情報を保持できるようにしました。

chk01.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(chk01.isChecked() == true) {
item.setCheckFlag(true);
}else{
item.setCheckFlag(false);
    }
}
});

上のようにすれば、チェックボックスにチェックを入れると、
画面外から戻ってきてもチェックされたままになるし、
チェックを外しても、チェックを外した状態に出来ました。