WX330Kに機種変更した管理人がJavaアプリの作り方を勉強するカテゴリー。 偉いひと、何かアドバイスあったらよろしく。m(__)m
管理人のプログラム暦:Javaはまったくの初めてだけど、perlとBASICとcはちょっと経験あり、最近やっとperlの参照渡しの意味が分かってきた。クラスって何?オブジェクト指向ってなに?
おそらくここで作ったプログラムはWX320TやWX321Jでも動くはず
■■■記事一覧■■■
2008/05/07auto GPSMAN ver1.0のソースコードとメモ
2008/04/24Command制御
2008/04/23RecordStoreの使い方
2008/04/23ファイルからの文字列読み込みに成功
2008/04/23ファイルへの文字列書き込みに成功
2008/04/21教えて下さい。javax.microedition.io.fileを使用したコードをコンパイルするためのダミークラスライブラリ
2008/04/07ウィルコム万歩計「ウィルポ君ver.1.2」(WX330K、WX321J、WX320T用Javaアプリ)
2008/04/06WX330K専用?Javaアプリ「ウィルコム万歩計ウィルポ君」ver.1
2008/04/05マルチタスク処理の仕方
2008/04/05現在位置の経度、緯度を表示するアプリの作成に成功
2008/04/01カメラを起動するアプリが出来た
2008/03/31位置情報取得およびカメラ起動も簡単に出来そう
2008/03/29Socket通信でWebからのデータ取得に成功
2008/03/29ループのさせ方
2008/03/29初めてのjavaアプリの作成に成功!w
(1・) 2008/05/07
auto GPSMAN ver1.0のソースコードとメモ
ソースはgpsman1.javaとGetFromURL(リンク先はファイル名に2がついているけど本当はいらない) GW前に公開したものです。 基本はRecoedStoreの使い方と、ウィルコム万歩計を組み合わせただけ
- 何キロ以上移動するとネットアクセスするかは117行目で定義、後日、選べるようにしたい。
- TextFieldというクラスを新たに使用、文字を入力出来るFormに配置出来るアイテムの1つで使い方は以前使用したSringItemと同じオブジェクトを作る時のパラメーターはタイトル、初期文字列、最大文字数の3つ、生成した後はスレッド化したクラスが別に動いているなら、中の文字列を常時読み取れる。TextField自体がスレッド化されて動いている?
- RecoedStoreの使い方だが、今回は最初に実行されるクラスの中で読み込み、destroyAppの中で保存を行っているが特に意味は無い、最初のクラスの中のコードをstartAppで実行したいところ。getRecordする前には必ずgetNumRecords()でレコード数を調べる。レコードが無いのに読んではいけない。最初のレコード番号は1となる。
- GetFromURLは前回からいじっている。取得したURLの表示等は必要ないので新たなFormの作成等表示部分を削除
- 動くまでに色々苦労したが、時間が経ちすぎて忘れてしまった。thisの使い方がいまいち分からん。
- フィールドテストを行ったが、うまく動いた。WX330Kは最初に通信を許可した後はなんの確認も無く極めて安定してWebアクセスするね。アクセス失敗することや圏外等であった時もアプリの実行になんら例外は生じなかったようだ。
- gpsmanに渡す因数では経緯度は.区切りだがjavaのapiは,で区切るのでreplaceというメソッドを使う、これはStringオブジェクトで使える、Stringオブジェクトは生成後、中身を書き換えられないって書いてあった気がするので中身は書き換わっていないかも(未確認)
- このアプリを起動したままにした場合WX330Kのバッテリーは3,4時間ぐらいしか持たない。激しく移動した条件のため、もともとバッテリーは持たない環境だがバッテリー持続時間を伸ばすにはどうしたら良いだろう?
つーか、俺の生命線って以下の2つのリンクだ、感謝
2008/04/24
Command制御
ソースはここ、インストールはここ。とりあえず必要だと思っていた要素テクはそろったかな 以下、個人的メモ
- implements CommandListenerが必要。
- ケータイ画面の下に表示されるコマンドメニューなどを扱うのがCommandクラス。これはすごく良くできている。Command(ラベル,コマンドコード(任意で良いのかな?),優先順位(1でよいのかな))で定義出来る。優先度によって直接ボタンやメニュー表示などが自動で切り替えられるらしい(未確認)
- setCommandListener(this)しないとコマンドボタンのクリックを認識しない。
- addCommandで定義したコマンドを付与する。付与出来るのはディスプレイに表示出来る能力を持つDisplayableクラス、実際はこれを継承するScreenクラス、でこれを継承するAlert、Form、List、TextBoxクラスのみ、TextFieldクラスなどにaddするとaddCommandは受け付けるが、setCommandListenerは受け付けない。ゆえに利用できない。
- TextBox、List、Alertなどはどうやら画面いっぱいに表示される系のオブジェクトみたい、今回はformにaddしているのでformが表示されている間は下のメニューに表示される。どの場所に表示されるかなどはこちらで制御出来ない(というか自動で制御してくれる)ようだ、エミュレーターではメニュー形式で表示され、WX330Kでは2つ設定すると3つある下段メニューの両側に設定された。これらはformにappendなどの使い方をするのではなく、formと同列のオブジェクト、すなわちFormとTextBoxを両方作るとDisplay.getDisplay(this).setCurrent(form);とDisplay.getDisplay(this).setCurrent(TextBox);で表示を切り替えられる。そして切り替えた場合addされているCommandに応じてメニューが表示される。
- メニューがクリックされた時の制御はソースコード参照。。
2008/04/23
RecordStoreの使い方
ソースはここ、インストールはここ。このプログラムは起動回数をカウントします。起動回数は電源OFFなどでも保持されています。ファイル入出力はファイル場所を相対位置で指定出来ないなど異なるプラットフォームで使いにくそうなので一次保留。以下個人的メモ
- javaMEにはRecordStoreという便利な機能がある。これは電源を切っても保持されるハッシュ(連想配列)みたいなものだ、試して無いがアプリを消去すると、そのアプリの使っていたRecordStoreは削除されるらしい。別のアプリからはRecordStoreにアクセス出来ないらしい。
- 詳細な説明がここにある。
- openRecordStore(a,b)のaはユニークな32文字以内の名前、bをtrueにすると無い場合はRecordStoreが作成される。
- getNumRecords()でレコード数が取得出来る。1つ作ると1を返す。
- レコードの取得はgetRecord(1)、1つ入れた場合は1を指定。リターンはbyteの配列らしい。めんどくさい。file入出力でも似たような感じだった気がする。byte name[ ]=でbyteの配列に入れてくれる。
- getRecord(1)は1つもレコードが無いと例外スルーしやがる、軟弱だ。
- String(バイト変数)でバイト変数をStringオブジェクト(変数)に変換してくれる。
- Integer.parseInt(Stringオブジェクト)でString変数をintに変換してくれる。toStringの逆ってやつ
- Stringオブジェクト.getBytes()でStringオブジェクトをbyte変数の配列に変換してくれる。file入出力でも見たやつだ。
- レコードのセットはsetRecord(レコードナンバー,登録する文章を格納するバイト配列,開始オフセット(通常は0で良い),文字列の長さ)、これはレコードが存在する時以外は例外スルーしやがる、最初はaddRecordで登録する
- try、catchのcatchは複数設定することが可能、参考、ただし今回のコードでは順番を逆にすると怒られる。なぜならRecordStoreNotFoundExceptionクラスはRecordStoreExceptionを継承したクラスだから。えらく細かいところまでチェックしてるなぁ。
文字列←→バイト配列の変換は重要だ
2008/04/23
ファイルからの文字列読み込みに成功
ソースはここ、インストールはここ。 以下、個人的メモ
- 必要なクラス、構成、ターゲットプラットフォームは前回と同じ
- とりあえずソースコードが最小セットとして使えそう。どうやら1バイトずつ読み込んでいる?、今回はかなり意味がわからない。Stringの使い方を勉強する必要あり
- ファイルが存在しないとcatchに飛ばされている。
2008/04/23
ファイルへの文字列書き込みに成功
ソースはここ、インストールはここ。
始めにいろいろ教えてくださった皆様、本当にありがとうございました。色々勘違いしていたみたいでダミーライブラリは必要ありませんでした。以下、個人的メモ
- ターゲットプラットフォームはJTWI構成CLDC1.1でOK、その他のAPIの「PDA Profile for J2ME(JSR 75)」を選択するのが必要。
- FileConnectionを使うのにimport javax.microedition.io.file.FileConnection;が必要
- Connectorを使うのにimport javax.microedition.io.Connector;が必要
- OutputStreamを使うのにimport java.io.*;が必要
- 意味は色々分からないが、リンク先のソースコードでSDメモリのトップにtest.txtを作ることが出来る。ファイル場所の記述方法注意。試していないが、本体メモリ部分としてphoto/とdata/がアクセス出来そう。ただし他の機種では違いそうな予感。file://test.txtとかfile:/test.txtとかアプリ位置からの相対アドレス指定を試みたが使えなかった。
- このコードはすでにtest.txtが存在する時はうまく動かない。スロー?されてしまうようだ
- write()の中身の書き方の意味はいまいち分からないが、こう書けばOKのようだ、"aaaa".getBytes()も可能だった。ただしこの行を2つ書くことは出来なかった。
参考
2008/04/21
教えて下さい。javax.microedition.io.fileを使用したコードをコンパイルするためのダミークラスライブラリ
WX330Kでファイル読み書きするプログラムを作っているんですがjavax.microedition.io.fileがWX330Kで使えてファイル読み書き出来る事はこのアプリで分かったんですが、いざ自分で使おうと思うとコンパイル時に「そんなクラス無いよ」と言われコンパイル出来ません。位置情報を取得した時はACCESSのサイトにコンパイル用のダミーライブラリがあったので良かったのですが、今回はどうやれば良いんでしょうか?どこかで配布されているんでしょうか? コンパイルはSunのWireless Toolkitで行い、Eclipseとかの環境は使って無くてテキストエディタでプログラムしております。
2008/04/07
ウィルコム万歩計「ウィルポ君ver.1.2」(WX330K、WX321J、WX320T用Javaアプリ)
雨なのでフィールドテストしておりません。ちょっと修正してみたんだけどWX320TとWX321Jの人、実行して30秒待つと表示されたりしませんかね?(^−^;WX321J、WX320Tでは起動してから30秒後に表示開始するそうです。
- 起動してからの経過時間を分で表示するようにしました。
- 取得時間を1分から30秒ごとにした。ちなみに日曜日に実行しっぱなしでおでかけしたが、2,3時間実行していても電池は一つも減らなかった。sleepしまくりのJavaアプリ実行させても電池は消費しないみたいだ。
コードはここ、インストールはここ以下は個人的メモ
- コメント欄で指摘されて、緯度の距離計算式を修正、緯度はcos(緯度)をかけた。cos30はMath.cos(Math.toRadians(30))で表せる。
- WX320TやWX321Jで動かない理由はいまだ不明、位置取得に時間がかかるのかもと思って、最初にdeviceActiveした後はdeActiveしないようにした。Locationオブジェクトのスコープ?をtryの外に持っていくのに苦労した、この書き方でよいんだろうか?・・・・・
- whileのダミーフラグをbooleanにかえた。booleanの存在は10年前から知っていたが人生で初めて使ったw。恥ずかしすぎる。orz
- jarファイルは単なるzip圧縮したjavaファイル、拡張子を変えて解凍すればコメント行を省いたコードが出てくる
- 現在時刻を保持するクラスはDate、使用するにはimprt java.util.*;が必要。これでgetTime()メソッドするとlongのいわゆるUNIXタイムのミリ秒版が出てくる。
- Dateオブジェクトの中身は自動で更新されないみたい。同じ値を返す。更新する方法は無いのか?毎回オブジェクト作るのか?
追記:
- WX330KではdeviceActive直後に経緯度を取得出来るが、WX320T、WX321JではdeviceActive後、getLatitudeなどで位置情報が取得出来るまでに時間がかかる。wait入れたプログラムも試したが1秒以上はかかるようだ。本プログラムでは30秒後に表示され始めるという感じでかっこわるいなぁ。どうやらdeviceActive後は自分勝手なタイミングで定期的に位置情報を取得して保持しているようだ。
2008/04/06
WX330K専用?Javaアプリ「ウィルコム万歩計ウィルポ君」ver.1
出来た〜、コードはここ、インストールはここ。アプリを起動したまま移動すると移動距離を表示してくれます。基地局情報を元に計算しているので場所によっては誤差が大きいかもしれませんが、カバンの中からでも計測してくれますよ。個人的にジョギング時に使いたくて作りました。実際の使用感を教えてもらえると、まだまだ改善の余地はあります。位置測定にパケット通信はしていないので使ってもお金はかかりません。
計測の仕組みとしては1分に1度現在位置情報を取得します(別にもっと細かく取得しても良いんだけど、電池の減りが激しいかな?)(WX330KがJavaアプリで取得出来る位置情報はどうやら基地局の位置みたいです)。1分前に測位した位置と現在の位置が変わっていたら、現在位置を2つの基地局の中間地点とみなし、以前の場所からの距離をカウントします。移動合計距離としては少し長めに出るかもしれませんね。経緯度取得失敗した時のエラー処理をしていないので突然移動距離が飛ぶことがあるかも
生の基地局情報どうにかして取得出来ないもんかねぇ〜、jarファイルとか逆アセンブルするソフト無い?w。Location APIに対応しているはずのWX320Tで動かないとの話があるのですが何ででしょう?
以下は個人的プログラムメモ
- //で始めるとコメントとして扱われる。
- Formクラスに表示する方法としてはappend,delete,setなどがある。appendメソッドでは戻り値としてアイテムno.が取得出来る。アイテムNo.は単なる上からの行番号のようだが、この番号を指定してsetで書き換えが可能。ただしappendで最初に番号を生成してやらないと最初からsetで表示は出来ないようだ。setではitemのみ扱える。文字列を表示する場合は単なるStringオブジェクトは使えず、StringItem("title","文章")というクラスを使う。titleは何も書かなくて良いが必須。他に入力可能なTextFieldやImageクラスのオブジェクトも使えるみたい。
- 平方根を求めるのはMath.sqrtメソッドが使える。距離を一気に計算するhypotなんでメソッドもあるみたいだが、ケータイ(Java ME(micro edition?))で使えるかどうかは未確認、実際、小数点を取り除くround()は無かった、代わりにfloor()が使えた。
- 経緯度1度あたりは10000/90キロメートル(地球一周360°が4万キロと定義されているため)
- Locationオブジェクトでは今回は一応deviceActive()の後にinfoRenew()を実行している、また繰り返し実行するため、deviceDeactive()で毎回閉じている。蛇足かもしれない。
- Javaでは内部がunicodeらしいので2バイト文字も1文字として計算されるそうだ(未確認)
- LocationクラスにconvertDegreeというメソッドがあり、getして得られた,で区切られているウィルコムの昔ながらの経緯度60進表示を10進表示に変換出来る。
- if文の文法はperlと同じ、比較演算子も一緒。
参考:
Keyword:【WX330K(38)】
【WX320T(5)】
2008/04/05
マルチタスク処理の仕方
興味無い人も多いだろうからトップページでは非表示
別にマルチタスク処理をしたかったわけではないのだが、「1分ごとに実行」ってのがやりたかった。タイマー割り込みとかで実行出来るクラスが作れると良かったのだがそれも分からず、唯一sleepというメソッド見つけたんだけどスレッド化しないと使えなかったのでついでに学習。でもsleepさせるとスレッド化してない部分の実行も止まるんだよな。意味分からん。もしかしてThead.sleepは1つもスレッド化したクラスが無くても実行可能なのかも(試していない)。 副産物として本コードのように見ているとどんどん新しい内容が表示されるってのが出来るようになった。スレッド化せずに実行するとmainのコードを実行し終わるまで画面が書き換えられない。Visual BasicでいうDoEventsみたいな別の方法があるかも 出来たコードはここ、インストールはここ。
- スレッド化する方法は2つ Threadクラスを継承(Extends)する方法とRunnableをimplementsする方法。継承は1つしか出来ないみたいなので、MIDlet継承しないといけないケータイ用アプリじゃ使えない??というわけで後者でやってみた。方法はバックグラウンド実行させたいコードをimplements Runnableつけて定義(Runnableインターフェースを付けると表現するそうだ)、そしてこのクラスのオブジェクトを作り、Thread (スレッド化したオブジェクト名) = Thread(Runnableつけたオブジェクト名)と宣言する。
- スレッド化したオブジェクトはstartとかstopメソッドが使える。
- Thread.sleep(ミリ秒)で時を止められる。ただしすべてのコード実行が止まるみたい。いつもの例外処理が必要。
- 変数(数字)を文字(string)に変換するにはint型からの場合はInteger.toString()とかやる、すべての変数型(Double)とかのクラス名でこのメソッドが使えるみたい。
- DisplayクラスのsetCurrentメソッドは現在の最新情報を画面に表示というわけではないみたい、いつ表示されるかは端末まかせだし、いったん実行しておけば何もしなくても最新の情報に書き換わる。
あれ?import java.io.*;しなくても例外処理が出来てる?いらなかったのか・・・(勘違い、sleepではException e、上記のインポートが必要なのはIOException e) ちなみに今、テキストエディタでプログラムしているんだけど噂を聞いてEclipseとNetBeansを試してみた。Eclipseはケータイ向けアプリのプロジェクトの作り方が分からなかった。NetBeansは最新バージョンのベータ版を入れたらMobility Packが入っていてMIDletアプリを作れるみたいだが最初の雛型から山ほどコード書かれて俺みたいな初心者には何が最小セットなのか分からなかったので結局使わず、しばらくテキストエディタでいこう。ただしNetBeansはエディタでクラス名を入力するとどんなメソッドが宣言されているのか自動で表示されて、説明文まで出る。すげー。使い方が分かった便利そう。Eclipseも同様の機能があるのかな?
参考:
2008/04/05
現在位置の経度、緯度を表示するアプリの作成に成功
コードはここ、インストールはここ。このアプリってWX330Kでしか確認してないけど、ウィルコムのほかの機種でも動きます?
オブジェクト指向を正確に理解していないので、いろいろと細かいところでつまずいてしまうぜ(^−^;
- Javaには文字列の変数は無いので文字列を使う時はStringというクラスを使ってオブジェクト?を作って使う。
- Javaでは変数のスコープが厳密に決まっているっぽい(普通はそうか?(^−^;)、変数やStringオブジェクト?を宣言する位置に注意が必要
- Locationクラスも前回のCameraクラスと使い方は似たようなもの、deviceActiveメソッドでオブジェクトを作って、そのオブジェクトでgetLatitudeメソッドとか実行すると経緯度が取得出来る。deviceActiveはやっぱり例外処理が必要。
- 文字列は”で囲まないといけないみたい、’は使えなかった。文字列は+で結合出来る。
- Location locOb = Location.deviceActive()ってのはLocation locObでLocationオブジェクトの使用を宣言して、=以降で中身を作って注いでいる感じかな
参考:
2008/04/01
カメラを起動するアプリが出来た
あくまで起動するだけ、ACCESSのライブラリのインポートの仕方と例外処理のやり方が分かったって感じ。出来たソースはこれ、インストールはここ
個人的メモ
- 慣習としてクラス名は大文字で始め、メソッド名は小文字で始める。そうだ
- CameraまたはLocationクラス?を使うためには[プロジェクト名]\lib\にTCKに含まれるwjs06_ext.jarを置く。この中にパッケージとして下記のクラスが含まれている?
- 上記のファイル中に含まれるクラスを使うには最初に「import com.jvlite.device.*;」と書く
- 例外処理のIOException eを使うには最初に「import java.io.*;」と書く(このパッケージ(クラス?)は標準付属か?)
- 今回使ったメソッドはgetCameraInstance(カメラアプリにアクセスし、Cameraオブジェクトを生成)、setsize(カメラアプリにサイズを指定、SIZE_QQVGA)など、撮影開始はcaptureStart(返り値に成功したかどうか)
- javaの例外処理はtry{例外が起きる可能性あるコード}catch(例外の種類){例外が起きた時にどうするか}finally{いずれにしても最後に実行すること(無くてもOK)}というのを使うらしい、無いとコンパイル時に怒られる。どういう時に怒られる基準が分からない。
- 今回の例外処理はIOException eと書いた、ワケ分からん。
try〜catch〜finallyの文法に関して参考にしたページ
2008/03/31
位置情報取得およびカメラ起動も簡単に出来そう
ここにACCESSのJava ME向け独自プロファイル「ACCESS Device Profile 1.0」のAPI仕様書とTCK(Technology Compatibility Kit)があります。TCKの中にはコンパイル済みの「CameraTest」と「LocationTest」ってjarファイルとjadファイルがあるのですが、そのままWX330Kにインストール出来て実行出来ましたよ。
そして、このテストファイルでセピアモードでカメラ起動したり、通信無しで現在位置や現在位置の郵便番号を取得したりしています。仕様書の中にはテストアプリそのもののソースコードは含まれていないので、自在に上記機能を使えるようになるまでに、つまずく可能性もあるけど、とりあえず一歩進んだ♪
W-SIMの時も不思議だったのだが、郵便番号のデータベースってチップの中に入っているんでしょうか?
俺なんか、へなちょこJava初心者なので、なかなか大変だけど、これを見て簡単じゃん♪って人たくさんいるんじゃない?しょーも無いモノでも、なんか作ったら教えてくださいね〜。
2008/03/29
Socket通信でWebからのデータ取得に成功
文字コードとか考えていないので日本語は化けるけど、とりあえず任意のURLからデータは簡単に取れるみたい。
- アプリ作成の設定は一緒、最初はなんとなくAPIの「Wireless Messaging API2.0」をチェックしていたけど、外しても普通に動いた。わけ分からん
- ウィルコムの電話機はCLUB AIR-EDGE経由でJava通信出来ない意味不明仕様らしいので(google mapは出来るのにね、小銭稼ぎか?)Javaアプリの通信設定を他のプロバイダに設定していないといけないっぽい(CLUB AIR-EDGE経由で下記をクリックしてインストールして、そのまま起動すると動かないので注意)
- 参考にしたのはSUNのこのページに掲載されているEメール送信アプリのソースコード、このリンク先のソースもそのまま動いたが(smtpサーバー名を自分のsmtpサーバーに設定した)今時好きにメール送信させてくれるSMTPサーバー無いしPOP before smtpとかに対応させる変更が面倒だったので、とりあえずHTTPアクセス用にソースを適当に変更した。
- 出来たソースコードはこれとこれ、ほとんとSUNのサイトそのままのコードでつ。意味分からん所たくさんあるけど、動いたからいいやw。
- インストールは端末からここをクリック。インストールしてCLUB AIR-EDGE以外のプロバイダ経由に設定して、URLを例に従って入力すると、数秒待たされることもあるけど、生HTMLファイルがヘッダ付きで表示されます。ちょっと感動♪
2008/03/29
ループのさせ方
for(int i=0; i<10; i++){ } で囲ったらループした。perlと一緒や〜。ソースはここ 出来たJAVAアプリは端末からこれをクリック
参考ページ
2008/03/29
初めてのjavaアプリの作成に成功!w
個人的にお勉強中、とりあえずHello World!
- Java JDK Update5のダウンロードここ
- Wireless Toolkit 2.5.2 for CLDCをダウンロードインストールここ
- wireless toolkitを起動→新規プロジェクト→プロジェクト名、クラス名とも「fetuin01」
- ターゲットプラットフォーム「JTWI」、「CLDC 1.1」、その他のチェック外す。(実は意味まったく分かっていない)
- ドキュメントフォルダに出来ているフォルダに(〜\j2mewtk\2.5.2\apps\fetuin01\src)にfetuin01.javaの名前でこの内容を書く
- 属性設定→MIDletsを編集し、アイコンのファイルを消す
- プロジェクト→パッケージ→パッケージの作成でbinフォルダにfetuin01.jarとfetuin01.jadファイルが出来る。
このファイルをUSB経由とかメールで端末に送ってjadファイルを実行すればインストール出来る。WEBに置く場合はサーバーにAddType application/java-archive .jar AddType text/vnd.sun.j2me.app-descriptor .jad の設定が必要。
出来たJAVAアプリはこれをクリックすればインストール出来る。インストールして驚くなぁ〜w
参考サイト
(1・)
|