2011年1月13日木曜日

[android][AR]QualcommのAR SDKのサンプル動かしてみたよ。

ARをいじってみたいなぁ、と思ったので、紹介されていたQualcommのAR SDKを入れてみました。
ところどころ詰まったので、自分用にメモ。

こちらのサイト様を参考にしました。ありがとうございます。
http://d.hatena.ne.jp/kotamz/20101031/1288534811

1.まず以下のインストール。
 ・Android SDK/NDK

 自分はSDKは入ってたので、NDKだけインストールしました。
 現在の最新版は、Android NDK r5
 適当にインストールしてパスを通して完了。

2.次にQualcommのサイトにて、SDKをダウンロード
 https://ar.qualcomm.com/qdevnet/sdk

 現在のバージョンは qcar-sdk-0.10.0.zip
 
 上記の右上にLoginがあるので、そこから新規登録の必要あり。
 (なぜか間違えて、//developer.qualcomm.com/dev/androidから登録したら、
 Developper用のアカウントになってAR SDKは落とせなかった。なんてこった。)
 
3. DSOのコンパイル
 ダウンロードしたら、Android NDKでコンパイル。
 
 ※qcar-sdk-0.10.0だと、Sharedってフォルダはなくて、
  代わりに以下になってた。
  $ CD /Users/ユーザ名/Development/Android/qcar-sdk-0-10-0/
   samples/Dominoes

 で、Android NDKでコンパイルするんですが、
  $ ndk-build
 としたところ、以下のエラーが出ました。
  cannot find -lQCAR

 調べてみたら、MACだと変更しないといけないところがあるらしいです。
 以下のサイト様に解決方法が載ってました。
 http://kopanitsa.seesaa.net/article/178887188.html

 Android.mkの中身を書き換えて、再度 $ ndk-build したところ、
 今度は正常にコンパイルできました。

4.Eclipseで実際に動かしてみる。
 参考のサイト様では、Androidの新規プロジェクトを作成していますが、
 インポートすることでサンプルを読み込むことが出来ます。

 Eclipseで以下をインポート
 /Users/ユーザ名/Development/qcar-sdk-0-10-0/samples/Dominoes
 
 MACの場合インポートしたあとに、
 Dominoesのプロジェクトを右クリック->プロパティー->ビルダーで、
 Import QCAR(win)のチェックを解除し、Import QCAR(bash)をチェックする。
 
 プロジェクト > クリーン で実行。
 この時に、一旦エラーが出てたましたが、クラスパスに
 QCAR_SDK_ROOTという変数を追加したらちゃんと動くようになりました。
 
下がドミノを動かしてみたところです。





 

2010年12月15日水曜日

[android]ListViewを2列表示にする方法

今まで、ListViewを使用してViewの表示をしていたのですが、
横向き表示の時には2列にしたいと思って方法を探してました。


調べてみると、GridViewっていうのがあるみたい。
参考にさせていただきました。
hyoromoの日記-GridViewを使ってみたよ


使い方は、ListViewとほとんど同じで、
 1.Adapterを用意 (ListViewで使ってるので使い回し可能!)
 2.GridViewの用意
 3.GridViewにAdapterを設定
でいいらしい。


ということでListViewとGridViewの記述の違いだけをメモメモ。


ListViewとGridViewの/layout-land/main.xmlの違い
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent"> 

 <!--ListViewの場合はこっち-->
 <ListView android:id="@+id/list" android:layout_width="wrap_content"
  android:layout_height="wrap_content"> </ListView>

 <!--GridViewの場合はこっち-->
 <GridView android:id="@+id/list" android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:numColumns="2"
  android:stretchMode="columnWidth"
  android:gravity="center" />

</LinearLayout>

srcの違い(のある部分だけ)
// ListView listView;
 GridView gridView;

 // listView = (ListView) findViewById(R.id.list);
 gridView = (GridView) findViewById(R.id.list);

 //listView.setAdapter(mAdapter);
 gridView.setAdapter(mAdapter);

と変更した箇所はたったこれだけで、横表示の時に2行にすることが可能になりました!
ちなみに、縦表示は1行のままにしたいので、
GridViewの android:numColumns="1"とすることで、縦表示は1行にできました!



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","")の第二引数は、
このキーが登録されていないときの初期値になります。