1 名前:デフォルトの名無しさん mailto:sage [04/08/06 22:21] J2ME CLDC+MIDPベースの携帯電話用Java(主にEZアプリ、Vアプリ)に関するスレッドです。 質問でも議論でも何でもこい、と。 前スレ: CLDC+MIDP+携帯電話用Javaスレッド part 2 pc5.2ch.net/test/read.cgi/tech/1070858996/ 過去スレ 携帯JAVAのスレッド pc2.2ch.net/test/read.cgi/tech/1011977260/ (DAT落ち) -- Java一般に関しては: 【初心者】Java質問・相談スレ51【大歓迎】 pc5.2ch.net/test/read.cgi/tech/1091770298/ NTT DoCoMoのiモード携帯電話用Java(iアプリ)については: iモード携帯電話用Java(iアプリ) Part 6 pc5.2ch.net/test/read.cgi/tech/1091286071/ >>2-5 あたりにリンク集
415 名前:382 mailto:sage [04/10/01 21:40:43] ピープオーバーが原因でした。 残量は表示させてたのですが取得する場所が悪かったみたいでちゃんと計れていないのが原因でした。
416 名前:デフォルトの名無しさん mailto:sage [04/10/01 22:37:27] すごく気になるんだが 「ピープ」って……なに?
417 名前:デフォルトの名無しさん mailto:sage [04/10/01 23:13:07] ピープ…とも読めるな。 ところで、配列にデータが入ってる場合だけ処理したいんだけどデータが入ってるか調べるのってどうするの? if(str[0] != null) で合ってるのかな?
418 名前:デフォルトの名無しさん mailto:sage [04/10/01 23:19:48] >417 「配列にデータが入っている」という意味がいまいちよく分からんな。 String[] strについて、そもそもstrがnullなのか、 strの要素が1個以上はあるけどその要素がnullなのか。どっちかいな。 String[] str = null; // この時点では前者 str = new String[3]; // この時点では後者
419 名前:417 mailto:sage [04/10/01 23:26:41] 分かりにくくてごめん 配列にjar内のテキストを読みこませてるんだけど、中身の無いテキストと中身があるテキストで処理を振り分けたい。 かなり分かりにくいな・・・・
420 名前:デフォルトの名無しさん mailto:sage [04/10/02 00:02:50] >>418 String[] str = new String[100]; とかしただけなら str[0]〜str[99] == null; そこに byte[] b = 〜 ; str[ 0 ] = new String ( b ); とすると str[ 0 ] != null だわな。 こういう感じならif( str[0] != null ) 〜 とすればいいんじゃない? str[0]=new String( new byte[0] ) の場合も !=null ( str[0].equals("")==true )になるよ。 自分の場合、配列初期化直後 for(i=0;i<str.length;i++)str[i]=""; でそれぞれの要素も初期化して if(str[i].equals("") ) 〜 とかやっちゃう。 結局、未初期化(=null)かそうでないか、空の文字列(="")かそうでないか、 どっちの判定をやりたいのかを明確にした方が吉。 別に if( str[0]!=null && str[0]!="")〜 でもできなくは無いと思うが。
421 名前:417 mailto:sage [04/10/02 00:07:13] ようするに初期化してない配列は(=null)で 空の文字列とか入れて初期化すると(="")ってことかな… だとすると空の場合実行するってのは if (str[i].equals("") ) { 処理 } でいいの?
422 名前:デフォルトの名無しさん mailto:sage [04/10/02 01:37:10] >>421 空文字("")とnullは別物だぞ。 String[] str; // この時点ではstrはnull str = new String[10]; // この時点でstrは実体あり、str[0]-str[9]はnull for(int i=9; i>=0; i--){ str[i]=""; // ここでstr[0]-str[9]はnullでなく""(0個の文字からなる文字列)を指す } ""に特別な意味を持たせるのかnullに特別な意味を持たせるのかは、 アンタのアプリの中身次第。
423 名前:417 mailto:sage [04/10/02 02:16:02] なる。 ちなみに421に書いたやり方で解決できました。 かなりさんきゅうべりーまっち
424 名前:デフォルトの名無しさん mailto:sage [04/10/03 16:01:15] ezアプリって>>2 のツールでしかビルドできんのですか?
425 名前:デフォルトの名無しさん mailto:sage [04/10/03 16:31:20] >2の公開ツールに入ってるコマンドラインツールは必須だけど それらをバッチファイルなりMakefileなりbuild.xmlから呼び出して使うことは普通に出来る。 実際、公式のビルドツールにも、ビルド手順をバッチファイルへ書き出すコマンドあるし。
426 名前:デフォルトの名無しさん mailto:sage [04/10/03 20:54:06] >>424 Sun以外にもコンパイラやライブラリ売っているメーカー あるから、別にSunのじゃなきゃ駄目というわけでもないよ。
427 名前:デフォルトの名無しさん mailto:age [04/10/03 23:27:36] 質問です 4M程度のテキストファイルを一行ずつ読み込ませるにはどのようにすればいいのでしょうか? 一旦ファイルを読み込んで配列データにしてからなら一行ずつ表示させることは出来るのですが、ファイルから直接一行ずつ読み込むのが出来ません。 そもそもそのようなことが可能なのでしょうか?
428 名前:デフォルトの名無しさん mailto:sage [04/10/04 00:04:35] >>427 1バイトずつ読んで改行文字のところで自分で区切る。
429 名前:427 [04/10/04 00:13:31] すいません、改行文字って \n しか知らないのですが…。 具体的にどのような処理にすればいいのでしょうか? 初歩的なこと聞いてすいません。
430 名前:デフォルトの名無しさん mailto:sage [04/10/04 02:10:31] >>429 \nならバイト値で10のハズ。 try{ InputStream is=getClass().getResourceAsStream("/data.txt"); ByteArrayOutputStream os=new ByteArrayOutputStream(); String[] str=new String[1000]; int line=0; int data=data = is.read(); while (data != -1){ os.write(data); if(data==10){ str[line++]=new String( os.toByteArray() ); os=new ByteArrayOutputStream(); } data = is.read(); } is.close();os.close(); }catch(Exception e){} でいいと思うけど。String配列を可変長にするにはVectorでもつかえば・・。 厳密にはWindowsの改行は\r\nで13,10だけど\rが残ってもたぶん大丈夫。 というか4Mのテキストってドコに存在できるわけ?そういう意味では不可能だと思う。
431 名前:デフォルトの名無しさん mailto:sage [04/10/04 23:11:49] 致命的エラー: クラスパスまたはブートクラスパスでパッケージ java.lang を検出できません。 と出るんですけど、何の設定が間違ってるんでしょうか?
432 名前:デフォルトの名無しさん mailto:sage [04/10/04 23:14:42] >431 書いて有る通り 「クラスパスまたはブートクラスパス」 の指定が間違っとるのと違う?
433 名前:デフォルトの名無しさん mailto:sage [04/10/04 23:36:47] テキストビューア作ってるオレがアドバイスすると、 4MBのテキスト全部はヒープに収まらない。内部データ構造にもよるが500KBあたりが限度(V601T/V602SH) どうしても読みたいなら、メモリに全展開しない方式を考えた方がいい。 もちろんSDカードか本体のデータフォルダから読み込む。 あと、Javaは内部処理がすべてUnicode(たぶんUTF-16)なので、 文字コードとバイト数の違いに注意。 ちなみに、ケータイのプラットフォームはMS932でなくSJISっぽい。 絵文字はどうなるのか知らん。 >>430 ByteArrayOutputStream使ってないので何ともいえんが、 一文字ずつ処理するとたぶん読み込みが激しく遅くなると思う。 自前バッファでの環境だと、8192byteごとに処理するとエミュ・実機とも一番読み込みが早かった。 実装により多少前後すると思うが、1K-10Kくらいをまとめて処理した方が早くなると思う。 あと、読み込み中(ストリーム開いてる途中)にOutOfMemoryErrorがでると、 StorageConnectionが使い物にならなくなってしまうという現象に悩んでる。 ExceptionでなくErrorなのでどうにかなるもんではないという結論でいいんだろうか。。 つーことで、>427 ガンガレ
434 名前:427 mailto:sage [04/10/05 01:04:58] >>430 ソースまで書いていただいてありがとうです。 ちなみに4MのテキストファイルはSDカードに入れてます。 >>433 500KB程度で限界ですか…ピープ制限って結構厳しいですね。 全展開せずに開くとゆうことは、 例えば開こうとしてるファイルが100バイトだとすると、 50バイトから100バイトの範囲を読み込む、みたいな処理にすればいいのでしょうか? えと、それで、悪いのですがもう一つ質問です。 外部(SDメモリとか)に保存したJARファイルからリソースが読み込めると聞いたのですが、可能でしょうか? それなら、JARファイルはZIPと同じ圧縮だと聞いたのでZIPで圧縮して拡張子をJARに変えて使えばPCからファイルを送るときに楽な感じなのですが・・・。
435 名前:433 mailto:sage [04/10/05 02:50:56] >>434 > 50バイトから100バイトの範囲を読み込む 改行で折り返すんだから、たとえば1画面に収まるバイト数は一定でない。 だから、メモリに展開せず必要になったときに常時読み込むような処理を書くのはめんどい。 > 外部(SDメモリとか)に保存したJARファイルからリソースが読み込める 拡張子とかファイルの中身に制限はないので、(厳密にはjpz/pnzとかSD書き出し時.hufの保護されたファイルは読めない) ZIPだろうがjarだろうがlzhで独自解凍処理組み込もうが何でもかまわん。 何がやりたくてどう楽なのかは知らんが。 理論的には、外部ファイルを解釈するインタープリタ作れるかもな。NESエミュもその一種に該当するか。 ところで、質問ばっかでアンタがどこまで理解してどこまでできてて何をやりたいのがよくわからんのだが。 最初の質問 >427 は >430 ですべて解決してるし。 StreamTokenizerみたいなのが欲しいだけ?もちろんそんなものはJ2ME/MIDPにはないけど。
436 名前:430 mailto:sage [04/10/05 09:38:51] あとでよく見ると\nも残っちゃってるな。まぁその辺は適当に・・。 >>433 なるほど。軽いファイルばかりでしかやってなかったので特に遅さは感じなかったけど 確かにある程度まとめたほうがよさそうですね。 僕は4Mでも全部開くつもりでソース書いてしもたけどやっぱ一部のみしか使えないよね。 じゃあ430のように1バイトずつ読んで\n探すより、例えば100KB分のバイト列読んで その分を一度文字列化してindexOf("\n")、substringとか使って区切ったほうがいいかも。 その場合は行の途中から始まったり今何行目なのか分からなかったりだけど。 小説みたいに読めればいいならそれでもいいと思うが、きっちり行を意識するとすれば 例えば100B読んで途中で切れた行の先頭が95Bなら、つぎは95から100B読むとか。
437 名前:デフォルトの名無しさん mailto:sage [04/10/05 15:03:09] vアプリってコンパイラはどこですか? えみゅれーたしか見つかりません。
438 名前:デフォルトの名無しさん mailto:sage [04/10/05 17:19:06] >437 コンパイラ自体はJ2SEのjavacでよろし。 ただし最新のを使っていけるかどうかわからんから ボダの公式サイトをもう一辺よく読んでらっしゃい。
439 名前:417 mailto:sage [04/10/05 21:26:03] あ、ごめんちょっと勘違いしてた。 436みたいな感じで100KB文のバイト列読んで〜 って感じでいってみます。 ZIPから読もうとしてたのはリソースファイルが結構な数あるのでカードに転送する時、一つのファイルだけ転送すればいいので楽になるかなと思ったからです ちょいと色々試してみますね。
440 名前:デフォルトの名無しさん [04/10/07 12:31:21] VappliをDLサーバーにアップロードしたのですが ダウンロードHTMLの記述の仕方がイマイチよくわかりません いいサンプルとかありましたら教えてください
441 名前:デフォルトの名無しさん mailto:sage [04/10/07 16:11:20] おめでとうございます。440様あなた天然記念物・珍獣保護種に指定されました。 by Vアプリ普及委員会
442 名前:デフォルトの名無しさん mailto:sage [04/10/07 18:02:41] pashe3.0の拡張データストレージって"storage:"でアクセスできるのはわかったんだけど iアプリのpos=みたいにopen位置を指定できないの?
443 名前:デフォルトの名無しさん [04/10/07 18:31:29] Phraseプレイヤーで複数の音源を同時再生できるのは分かったんだけど、和音数少なくて使い物にならないので他ので試そうと思ったんですけど 他の音源での同時再生は不可能でしょうか?
444 名前:デフォルトの名無しさん mailto:sage [04/10/07 18:42:24] 携帯java環境でString配列のソートをおこないたいのですが、 Arraysクラスが使えないようで、他の方法を探っています。 みなさんは手作業でソートを行なっているのでしょうか? つかっているクラス、メソッドがあれば教えてください。
445 名前:デフォルトの名無しさん mailto:sage [04/10/07 19:13:39] >>440 VアプリはコンテンツアグリゲータのサーバでしかDLできませんので、 とりあえずアプリゲットとかその辺に作者登録して指示通りにやるべし。 そのDLサーバがそうだというなら話は別だけど、どうせ自サバかレンタルでしょ? >>442 storageというかInputStream作るんだから InputStream.read(byte[] b, int off, int len) 使ったら? >>443 Phraseはmmfとpcmを合成して音源鳴らすんで、コレも単音源と言える気がする。 合成が必要な分、負担を減らすための和音数削減だと思うし。 解決にはならないでしょうけど、SmafPlayerとHVは同時に鳴らせたよ。 >>444 getBytes()とかでバイト列作って先頭から比較していく。そうすっと文字コード順に並ぶ。 入れ替えは String tmp=str[i]; str[i]=str[j]; str[j]=tmp; って感じの手作業。
446 名前:デフォルトの名無しさん [04/10/07 23:54:35] あどれす家だって登録してます? ttp://www.adyada.com/
447 名前:デフォルトの名無しさん [04/10/09 01:41:04] RecordStoreを使ってゲームの途中データを保存させようとしていて、 セーブする際にレコードIDを指定してい保存したいのですが もし1〜5までのレコードIDを使ったとして、1に保存されてないのに2に保存することは不可能でしょうか?
448 名前:デフォルトの名無しさん mailto:sage [04/10/09 02:07:58] >>447 setRecordとaddRecordの違いをふまえよ。
449 名前:デフォルトの名無しさん mailto:sage [04/10/09 13:57:11] >>447 レコードIDが指定出来るのはsetRecordだけだから既にあるIDしか指定出来ない だから1に保存されてないのに2に保存は無理 IDが指定したいのなら、 起動時にレコードIDの5が存在するか調べて存在しない場合は空のデータをaddして5まで作成する でもそうするとデータが存在することにはなってるから読み込んだときに何も保存されてない訳だからエラーになるだろうな こんな感じに処理すれば指定は出来るけどどうやって処理するのかは知らん。 誰か追記してくれ
450 名前:デフォルトの名無しさん mailto:sage [04/10/09 14:27:39] まず>>447 が落ち着いて文章を書け。 どんな仮定で何を聞きたいのか意味不明。
451 名前:447 mailto:sage [04/10/09 14:57:50] >>450 ユーザーがセーブした順番通りにデータを並べたいのです 言葉だと自分でも何言ってるのか分からないので自分なりに説明してみます [セーブ1空] [セーブ2空]←ここにユーザーがセーブする [セーブ3空] [セーブ4空] これで、読み込む際に [セーブ1空] [セーブ2入] [セーブ3空] [セーブ4空] このように表示させる為に、RecordIDで順番を整列しようと思ってるのです 分かりにくくてすいません。
452 名前:450 mailto:sage [04/10/09 15:13:18] >>451 こんな処理手順でどうかな。 ・アプリの初回起動時に保存データをnullとしたレコードを4つ生成する(IDの1〜4)。 ・ユーザーの要求に従ってID1〜4の任意のレコードに保存する。 (レコードはすでに4つ存在しているのでどれでも指定できる) ・画面に表示する際は、レコードID1〜4を順番に読み出していき、 nullなら空、nullでないならデータありと判断して表示処理する。
453 名前:447 mailto:sage [04/10/09 15:36:51] >>452 初回起動時かの判断ってどうすればいいでしょうか? 私が思いつく限りでは毎回、 起動時にRecordStoreを開いてtry文でID4を読み込みエラーをキャッチしたら1〜4にnullを書き込む方法ですが この方法で大丈夫でしょうか
454 名前:デフォルトの名無しさん mailto:sage [04/10/09 16:27:53] MIDPだけでキーの押されているとき、いないときの 判定をしたいのですがどうすればいいのですか?
455 名前:デフォルトの名無しさん mailto:sage [04/10/09 16:44:05] >454 KeyPress用フラグとKeyRelease用フラグを用意して、 それぞれのイベントで立てたり倒したりする。 で、判定時にはそのフラグを見て処理。 が定石だと思うのですが如何か。
456 名前:447 mailto:sage [04/10/09 19:05:24] if(getNumRecords()==0)で String moziretu = null; byte[] savdata = moziretu.getBytes(); と、してfor文かなにか使ってsavdataをaddRecordで4回書き込めばいいのかな・・・
457 名前:447 mailto:sage [04/10/09 19:13:08] ごめん、追記です String moziretu = null; ではなく、 String[] moziretu = null; と言う配列データです。
458 名前:450 mailto:sage [04/10/09 21:57:45] >>447 レコードストアの有無を気にせずとりあえず読み込みモードでオープンする。 RecordStore rs = RecordStore.openRecordStore(〜, false); rsがnullなら初回、nullでないなら2回目以降、と判断できる。 初回起動だと判断したらレコードストアを新規作成する。 以下は考え方なので、実際にはtry-catchとかやってくれ。 //レコードストアを新規作成モードでオープン RecordStore rs = RecordStore.openRecordStore(〜, true); //内容がnullのレコードを4つ作成する for (int i = 0; i < 4; i++) rs.addRecord(null, 0, 0); //クローズ rs.closeRecordStore(); この時点で空のレコード(保存内容がnullのレコード)が4つできてる。 >>452 や上記の考えではレコードの内容がnullかどうかで"空"か"入"かの区別と しているが、nullの代わりに「"空"を示すデータ」をrs.addRecord()のところで 保存しても構わない。やりやすいように変えてくれ。
459 名前:デフォルトの名無しさん mailto:sage [04/10/09 22:58:55] >>447 ちょっと解決策というわけじゃないんだが、アイデアがあるなら一度やってみてはどう? 456や457を見る感じ、ある程度分かってるみたいだし、書けなくは無いと思うけど・・。 レスが来る前に結果出せると思うし、駄目だったらその時細かく聞けばいいと思うが・・。 個人的な考えかも知れんが「null」を使うのはあまりよくないと思う。 417〜423でも書いてたけど文字列なら「""」の方がいい気がする。 キッチリ if( str[ i ] == null ){ 無い時 } else { 有る時 } と毎回やればいいけど ウッカリすると「ぬるぽ」が発生しかねない希ガス。 たとえば457を例にして mojiretu[ 0 ] = null; → byte[] data = mojiretu[ 0 ].getBytes(); で「ぬるぽ」。 byte[] data = null; → addRecord( data , 0 ,data.length ); でも「ぬるぽ」。 となると if( mojiretu[ i ] == null )rs.addRecord( null , 0 ,0 ); else { byte[] data=mojiretu[i].getBytes(); rs.addRecord(data.0,data.length); みたいにする必要がある。 「""」なら読み書きは変える必要が無く、空入の区別が必要なときだけ if( mojiretu[ i ].equals( "" ) ){ 無い時 }else{ 有る時 } でいい。
460 名前:447 [04/10/09 23:58:40] すいません、自分なりにソース書いてみました コンパイラとVアプリエミュで試してみるとちゃんと動きましたが、実際に保存出来ているのか謎なので 念の為意見お願いできますでしょうか? catch{}はtry{}が実行出来なかった場合に実行するとゆう意味だと私は思っているので問題はないと思うのですが…。 try { RecordStore rs = null; RecordStore.openRecordStore("test",false); if (rs == null) { rs.closeRecordStore(); RecordStore.openRecordStore("test",true); for (int r=0;r<6;r++) { rs.addRecord(null,0,0); } rs.closeRecordStore(); } else { rs.closeRecordStore(); } } catch (Exception e) {} testと言うレコードストアにIDを6まで作っています。
461 名前:450 mailto:sage [04/10/10 00:08:53] 447へのQ&Aとは直接関係ないカキコになるけど、一応フォローというか… >>458 の最後に書いたけど、>>459 が示したようにnullを用いずに 空文("")をもって「データなし」とするやり方も、もちろん普通にありだ。 ただ、 >「null」を使うのはあまりよくないと思う。 からではない。これはアプリによる。 保存するデータがユーザー入力の文字列だったりする場合、もし空文("") で初期化していると、そこが未使用のレコードなのか、ユーザーが何も 入力しなかった文章を保存したレコードなのか、区別が付かない。 そういうアプリではnullで初期化するとよい。 ここでもnullの代わりに適当な文字列をもって”空”の印にすることもできるが ユーザーがその文字列を絶対に入力してこないという保障はないので、 その可能性を心配するくらいなら、やはりnullで初期化するのが妥当だろう。 >>447 はどんなデータを保存するか質問内容からは分からなかったので >>458 の最後はあのような書き方をした。 また、「レコードのデータの初期値としてnullを使う」と自分で分かってて 決めていれば、自然とヌルポを意識したコードを書くから過度に警戒する 必要はない。というか慣れの問題。
462 名前:450 mailto:sage [04/10/10 00:21:49] >RecordStore rs = null; >RecordStore.openRecordStore("test",false); オープンした戻り値をrsで受けなきゃ。 >if (rs == null) { >rs.closeRecordStore(); rsがnullなのにrs.〜();とメソッド書いたら、これがヌルポだ! ここでchatch(〜){〜}へ直行するハメに。
463 名前:447 mailto:sage [04/10/10 01:37:36] 直してみました。 初めに int selectdata = 1;//これにユーザーが選んだ番号が入る String[] data;//これに書き込む(読み込んだ)配列データが入る を宣言してるものとします // *初回に空レコードを作成する try { RecordStore rs = null; rs = RecordStore.openRecordStore("test", false); if (rs == null) { rs.closeRecordStore(); rs = RecordStore.openRecordStore("test", true); for (int r=0;r<6;r++) { rs.addRecord(null, 0, 0); } rs.closeRecordStore(); } else { rs.closeRecordStore(); } } catch (RecordStoreException e) {} // *セーブ data[0] = "1個目のデータ"; data[1] = "2個目のデータ"; data[2] = "3個目のデータ"; try { RecordStore rs = RecordStore.openRecordStore("test", false);//初回で既に作成されているのでfalse byte[] b = data.getBytes();//dataをバイトに変換(合ってる?) rs.setRecord(selectdata, b, 0, b.length); rs.closeRecordStore(); } catch (RecordStoreException e) {}
464 名前:447 mailto:sage [04/10/10 01:43:42] 463続き // *ロード try { RecordStore rs = RecordStore.openRecordStore("test", false); byte[] b = rs.getRecord(selectdata); data = new String(b);//バイトを配列に変換(変換方法分からず) rs.closeRecordStore(); } catch (RecordStoreException e) {} こんな感じで書いてみたのですがコンパイラが byte[] b = data.getBytes();の部分でシンボルを解決出来ません data = new String(b);で互換性のない型。 と言ってきます。 解決出来ませんのエラーは何故か分かりませんgetByte();ってのがあったはずですし…。 互換性のない型はどうやって配列に直すのかが分からないからです。 多分このエラー以外は間違い無しだと思うのですが…
465 名前:450 mailto:sage [04/10/10 02:42:19] >>464 >byte[] b = data.getBytes();の部分でシンボルを解決出来ません 配列の要素を個別に扱わないと。 String[] data; としてるんだから byte[] b = data[0].getBytes(); などとなる。 ところで、ズラーッとソース貼るのもなんなので、テキスト形式のファイルで どっかのアップローダに上げた方がいいかもしれんよ。
466 名前:450 mailto:sage [04/10/10 02:44:30] String rsName = "test"; boolean existed = false; //レコードストアの存在確認 try { RecordStore rs = RecordStore.openRecordStore(rsName, false); if (rs != null){ existed = true; rs.closeRecordStore(); } } catch (Exception e){ existed = false; } //レコードストアが存在しない場合→新規作成 if (!existed){ try { RecordStore rs = RecordStore.openRecordStore(rsName, true); for (int r = 0; r < 6; r++) rs.addRecord(null, 0, 0); rs.closeRecordStore(); } catch (Exception e){}
467 名前:447 mailto:sage [04/10/10 16:55:43] >>450 次から長いの貼るときはアップロード使いますね。 ふむふむ、配列の要素個別に扱わないといけないんですね。 とゆうことは配列に3つの要素があるのでIDは今の3倍必要になりそうですね…。 レコードストアの初期化はこっちのほうが短くて綺麗ですね if(!existed)ってのは初めてみたのですが「trueでなければ」てことですかね? ソース書き直してみます
468 名前:デフォルトの名無しさん mailto:sage [04/10/10 20:54:02] 既出だったら申し訳ないが、Vアプリの開発情報色々増えてる。 P6エミュも出てる。 developers.vodafone.jp/dp/ 2004/10/08 更新情報 Vアプリ開発ツール ・V-appli Emulator(P6型)Ver1.0 ・V-appli Emulatorサンプルアプリ(P6型) ・ユーザーズガイド(P6型) ・Eclipse連携マニュアル を追加しました。 2004/10/01 更新情報 Vアプリ技術資料 ・概要編 Ver.1.0.5 ・開発編 Ver.1.0.3 ・メディア編 Ver.1.0.2 ・シリアル制御編 Ver.1.0.2 ・Tips編 Ver.1.0.12 ・Vアプリ端末情報 Ver.1.0.11 を更新しました。 ・新機能導入の手引き2004 〜P6型端末編〜 Ver.1.0.5 ・APIリファレンスJavadoc版(P6型) を追加しました。
469 名前:デフォルトの名無しさん mailto:sage [04/10/10 23:30:49] 一瞬MIDP2.0かと思ったら256k ver2でしたか。
470 名前:447 [04/10/11 01:14:01] ソース書き換えてみたのですがコンパイラではエラー出ず、エミュで実行するとエラーは出ませんが表示させたい部分が表示されません。 ソースはこんな感じです // *ロード try { RecordStore rs = RecordStore.openRecordStore(rsName, false); for (r = 0; r < 5; r++) { byte[] b = rs.getRecord(r+1); if (b == null) { rsDate1[r] = "ぬるぽ"; } else { rsDate1[r] = new String(b); } } rs.closeRecordStore(); } catch (Exception e) {} for文使って1〜5のIDに入っているデータを読み出して、ifでbがnullの場合は"ぬるぽ"を代入してるのですが drawString(rsDate[0],〜)で表示させても何も表示されません。
471 名前:450 mailto:sage [04/10/11 01:47:36] 配列b自身はnullにならない。ややこしい話は省略するが if (b == null) を if (b.length == 0) として。
472 名前:450 mailto:sage [04/10/11 02:18:47] すまん。混乱した。>>471 は取り消し。
473 名前:447 mailto:sage [04/10/11 02:44:05] >>450 いや、それで今の問題は直ったが。 でもまた次の問題が出てるわけだがな…。 自分で修正してみて手負えなかったら書き込みま
474 名前:450 mailto:sage [04/10/11 03:07:39] 自分が使ってるソースではやっぱ>>471 のようにしてた。 >>472 の書き込みはすみませんでした。
475 名前:デフォルトの名無しさん mailto:sage [04/10/11 04:13:57] >>468 サンクス。 ITMediaあたりでニュースになってなかったから気づかんかった。 まぁ先がないJSCLですが。
476 名前:デフォルトの名無しさん mailto:sage [04/10/11 08:32:08] >>470 その部分におかしな所はないと思う。表示できないなら表示部分を疑ってみて。 例えばrsData[0]がnullとか""の時がありうるのか、その時はdrawするのか、 単に背景色と同色で描画とか、画面外にdrawとか、後に上書きしてないか、とか。 コンストラクタの段階で適当な文字列 rsData[0] = "てきとー"; とかで表示を確認して レコード読み取り後どう変わったのかを確認するといいと思う。 あと、エミュで実行するなら、tryでエラーが出てないかの確認のため }catch(Exception e){ System.out.println( e.toString() ); } とかした方がいい。特にレコード関連はコード以外にもエラー原因があるし。
477 名前:447 mailto:sage [04/10/11 13:14:21] >>476 e.toString()でエラー書き出したらrsDate1[0]に何も入ってないのが原因だった。 byte[] bなんで、if(b==null)じゃelseになってしまい、bに何も入ってないのにrsDate1[0]に代入して表示させてるからぬるぽ ところで、open〜close内でgetRecord();を何度かに分けて使ってるんだけど、 2回目のgetRecord()でデータがちゃんと読み込めてないみたいなのですが open〜closeを3回に分けて書くと正しく動きました。 もしかしてopen〜close内でgetRecord()は一回までって制限ある?
478 名前:476(459) mailto:sage [04/10/11 19:21:32] >>447 だ〜か〜ら〜、e.toString()したらエラーの原因が分かるでしょや。 メッセージの意味が分からんならそれを調べるか聞くかしなっせ。 ソースが470+471のままなら(違うなら言ってね)、r=1の時何が起こってるか、 いっそ一行ごとにprintln使ってどの行まで行けてるか、ifでどちらに飛んでるか、 めんどうでも細かく調べてみることをオススメ。理解への近道。 やはりnullかどうかが面倒になってきそうだからもう一度459を奨めてみるテスト。 なんなら保存したいデータの変数が分かればsaveとroadメソッド書くよ。 あと細かいけど ・getRecord() なんてメソッドは無い。 ・rsDate1て、日(date)は関係無いだろ。 ・所々敬語を混ぜるくらいならいっそ全部普通語のほうがいいと思う。
479 名前:447 mailto:sage [04/10/11 23:13:06] >>478 e.toString()でエラー書き出したらnullPointerExceptionになってたってことを書いたのですが・・・。 原因は空(null)のrsDate1[0]をdrawStringさせようとしたからです これはif(b.length==0){}で空の場合は適当に文字列代入させることで解決出来ました getRecord()はレコードストアの指定IDからバイトデータで読み込むやつ 確か、byte[] getRecord(int recordID) rsDate1[0]はString rsDate1[]って配列データの要素で date=日じゃなくてデータ=dataを間違ってdateにしてた。
480 名前:476 mailto:sage [04/10/12 08:38:39] >>44 nullをdraw、int id、data、そんなことは分かってた。 今回の問題は >getRecord()でデータがちゃんと読み込めてないみたいなの でしょ?じゃあソコでe.toString()使おうとか思わなかったの? 使ってたけど何もメッセージが無いなら、一つだけ読んで終わるようにしてたんだろ。 ソース変わったなら言って、と書いたが何も無いってことはそのままか。 じゃあ470の最後のcatchでメッセージをださせてみて。
481 名前:447 mailto:sage [04/10/12 13:24:01] >>480 すまんちょっと勘違い getRecord()でデータがちゃんと読めてないと思ってたのは、 >>466 のをID10まで作成するようにして使ってたのを途中で20変えたが既にレコードは存在するのでIDが追加されずに読み込もうとしたのがエラーの原因だった。 コンパイラもエラー吐かないしエミュでe.toString()使ってもNullPointerExceptionって出るしでgetRecord()でちゃんと読めてない物だと思ってた けどそれは妄想でIDが追加されてないのが原因だったと・・・。
482 名前:デフォルトの名無しさん mailto:sage [04/10/13 22:20:36] C4型、P4型では問題なく開発出来ていたのだが、 P5型のエミュが「fail prepareApplication」と出て動作せずに困っています。 ただ、サンプルの実行は出来るので実行ファイルを作成する段階でなにかミスを していると思うのですが、C4、P4と手順が違うところってあるのでしょうか?
483 名前:482 [04/10/14 01:50:11] MIDlet-Jar-URL:でスペルミスしてただけだった。 orz
484 名前:デフォルトの名無しさん mailto:sage [04/10/14 15:12:05] byteデータを数値に変換して比較したいのですが、直接intにbyteを入れても互換性のない型と出てコンパイルに出来なくて困ってます 調べてみるとintValueで変換出来ると書いてあったので試してみたのですがシンボルを解決出来ませんと出てしまいます。 byteデータをintに変換するにはどうしたらいいのでしょうか?
485 名前:デフォルトの名無しさん mailto:sage [04/10/14 15:39:24] すいません byteデータではなく、byte[]でした byte[] bytes;ってな感じに書いてますがint number = (int)bytesとしてもコンパイル出来ませんでした。
486 名前:デフォルトの名無しさん mailto:sage [04/10/14 19:49:22] >byte[] bytes;ってな感じに書いてますがint number = (int)bytesとしても >コンパイル出来ませんでした。 あたりまえです。こちらへどうぞ。 【初心者】Java質問・相談スレッド54【大歓迎】 pc5.2ch.net/test/read.cgi/tech/1096548618/
487 名前:デフォルトの名無しさん mailto:sage [04/10/14 22:51:41] 配列だからな w 超初心者の俺でも分かるぜ (エッヘン w
488 名前:デフォルトの名無しさん [04/10/15 12:11:20] 質問なんですが、 Vアプリ開発ガイド[Tips編]によれば、SH系でネイティブ連係機能を使う際はkeyReleasedイベントでやれとのことですが、 ソフトキーによるcommandAction処理の場合はどうすればいいんでしょうか。。 TextBoxで気にせず素直にcommandActionでネイティブ呼び出すような処理を書いたら、 次同じソフトキーを押したときのイベントが起こりませんでした。 おそらくCanvasでkeyReleasedでやれと書いてあるのと同じ理由によるんだと思います。 (Pressedイベントでネイティブに遷移するとReleasedイベントが処理されないから、次ボタンを押した際はPressedが起こらずReleasedのみ起こる) 仕方ないので、commandActionでは処理したいことをやるためのthreadを別に立ち上げ、 ユーザがボタンを放してReleasedイベント処理されたかなと思われるくらいの時間threadにwaitかけてそれから処理するように仕組んだんですが、 なんか回りくどいですし、ユーザがボタン押しっぱなしでwait時間切れしたらそもそもこんな処理入れる意味がないですし。。
489 名前:デフォルトの名無しさん mailto:sage [04/10/16 14:34:55] >>484 >>311
490 名前:デフォルトの名無しさん mailto:sage [04/10/17 01:03:15] ゲームを作っているのですがフレーズ再生で困っています。 フレーズ再生を共通のプログラムでC4型、P4型、P5型問わず 動作させたいのですが、C4型のcom.j_phone.amuse.PhrasePlayerに対し com.jblend.media.smaf.phrase.PhrasePlayer とパッケージ名が異なるためコンパイルさえ通りません。 jar中にcom.j_phone.amuse.PhrasePlayerクラスを掘り込んで 機種判別してクラスを使い分ける方法を考えたのですが、 どなたか実際に動かしたかたおられますか?
491 名前:デフォルトの名無しさん [04/10/18 17:23:48] Vodafoneを使っているのですが、 携帯電話の側面についているボタンやオーディオリモコンのボタンのキーイベントを取得する方法ってあるんでしょうか? 携帯を閉じたまま、イベントを発生させたいんですが、何かいい方法あれば教えてください!!
492 名前:デフォルトの名無しさん [04/10/18 19:02:24] 質問です。 EZアプリ(Java)でカメラ制御を行おうとしているのですが、 エラーが出て困っています。誰かご存知の方がいましたら教えて下さい。 以下、サンプルコードです。 PhotoConnection conn = ( PhotoConnection ) Connector.open("photo:"); conn.setMode(PhotoMode.MOBILE_MODE); PhotoContent photo = ( PhotoContent ) conn.capture(false); byte[] data = photo.getData(); conn.close(); kjxへのコンパイルは正常にいくのですが、エミュレータで起動すると 「ALERT: Cannot load class com/kddi/id/CameraConnection」 と出てしまいます。コンパイルは出来るので、プログラムは間違っていない と思うのですが、何が駄目なのでしょうか? よろしくお願い致します。
493 名前:デフォルトの名無しさん [04/10/18 22:19:20] >>492 自己レスです。 エミュレータが3.0に対応していないためみたいです。 実機では動きました。
494 名前:デフォルトの名無しさん mailto:sage [04/10/20 05:56:13] P5のエミュレータ GraphicsUtil.drawRegion()が遅すぎて使い物にならなくて困っています。 どうにもならないのでしょうか?
495 名前:デフォルトの名無しさん mailto:sage [04/10/20 05:58:41] >>494 homepage1.nifty.com/marukun/java/vapp.html > →GraphicsUtil.drawRegion()の処理がエミュレータでのみ著しく重いという事みたいです。
496 名前:デフォルトの名無しさん mailto:sage [04/10/20 14:22:41] P6のエミュでデバッグ情報がでなくなってるんだけど… コレは以前のエミュのようにデバッグ情報を出すにはどうすればいいでしょうか。
497 名前:デフォルトの名無しさん [04/10/20 23:00:22] テキストボックスを使って数値を入力したいのですが、どこを探してもiアプリのtextBoxしか見つかりませんでした。 前にVアプリでテキストボックスを利用しているアプリを見たような気がするのですが、 Vアプリにはテキストボックスは無いのでしょうか? 参考になるサイトなどご存知の方居ましたら教えてください
498 名前:デフォルトの名無しさん mailto:sage [04/10/20 23:24:06] >>497 参考になるドキュメント→>>2 テキストボックスはプログラマ各々が自作するものなのか、用意されているものなのか。 といった携帯アプリを作るJavaの構成が理解できてないってこったな。
499 名前:デフォルトの名無しさん mailto:sage [04/10/20 23:42:36] >>497 godwood.allnet.ne.jp/vioret/midpapi/javax/microedition/lcdui/TextBox.html
500 名前:名無しさん mailto:sage [04/10/21 05:26:08] JSCLを使って作られていたプログラムをMID-P2.0の機能で 実装し直そうとおもいます。 resフォルダに入れたファイルを読みたいのですが openDataInputStream(ss);あたりでエラーになるのですが どうすればいいのでしょうか? とりあえず画像ファイルはcreateImageで代替えできるのでいいのですが バイナリだとやり方が思いつきません エラー java.lang.ClassNotFoundException: com/sun/midp/io/j2me/resource/Protocol at javax.microedition.io.Connector.openPrim(+99) at javax.microedition.io.Connector.open(+15) at javax.microedition.io.Connector.open(+6 javax.microedition.io.ConnectionNotFoundException: The requested protocol does not exis 環境 j2me_wireless_toolkit-2_1_01-windows.exe JSCLと関係ないとおもうのですがわかりません 解決策をおしえてください よろしくおねがいします。
501 名前:500 mailto:sage [04/10/21 05:27:58] import java.io.*; import java.util.*; import javax.microedition.io.*; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; import javax.microedition.io.*; import javax.microedition.rms.*; try{ //byte buf1[] = new byte [0x3000]; //String s = "resource:///"; //String ss; //int buf_p=0; //for( int i = ReadCount; i < 13; i++ ){ //try { //ss = s+i+".png"; //DataInputStream _in = Connector.openDataInputStream(ss); //buf_p = _in.read(buf1); //_in.close(); // //} catch (IOException x) { //game_mode = -2; //break; //} //image_back[i] = Image.createImage(buf1, 0, buf_p); //ReadCount++; //} String str; for( int i = ReadCount; i < 13; i++ ){ str = i + ".png"; image_back[i] = Image.createImage("/" + str); } }catch(Exception e){ }
502 名前:494 mailto:sage [04/10/21 12:58:52] >>495 ありがとうございます。 実機では普通に動くのは知っていました。 エミュレータが遅すぎて困ってるんです。 正直デバックが苦痛です。 エミュレータで普通に動かすにはどのくらいのマシンスペックが必要なのでしょうか? ちなみに私の環境は P4の2.53GHz、メモリ512MB、OSは2000です。
503 名前:名無しさん mailto:sage [04/10/21 20:44:41] 週間ゲーム&アプリLiveでは0x, 30x, 40xと5x, 60x, 80xに分けられていますが どちらでも動作する50Kbyte未満のJAVAアプリ(jadはMIDlet-OCL: JSCL-1.0.1で定義)も 別々に登録される事になるんですか?
504 名前:デフォの名無しさん mailto:sage [04/10/21 21:40:41] イースってゲームでSDに保存したJARファイルからデータを読み出して使ってるみたいなんですけど、 これは url = "jar://mc/test/test.jar/test.png"; connector.open(url, Connector.READ); とすれば開けるのでしょうか? 開発ガイドには jar://ファイル名+リソース名 としか書いてなかったもので・・・ 知ってる方居ましたら宜しくお願いします
505 名前:504 [04/10/22 00:50:52] すいません訂正です url = "jar://mc/test.jar/test/test.png"; でした。 SD内の、test.jarの中のtestフォルダ内のtest.pngを指定しています
506 名前:488=495=499 mailto:sage [04/10/22 02:54:48] >>490 全部で動かそうと思うとC4型用のAPIのみで作る必要がある。C4のAPI使えばP4/P5でも動くと思う。 機種のライブラリを判別して個別処理させるんなら、判別法がTips編の1.12に載ってるね。 >>491 閉じるとVアプリは一時停止する仕様だから閉じたままは無理。 継続型待ち受けアプリならいけるかもしれんが、P6型ではこのタイプのアプリは廃止されたそうな。 開いたままでもかまわんなら、キーコード表示するデバッグ用のアプリを端末に入れて、 押したキーとキーコード対応を自分で解析すれば何とかなるかもしれん。 もし解析した場合はキーコード情報の報告ヨロ >>500-501 jarの中身のファイルをストリームで開くのはClass.getResourceAsStreamを使うのが一般的じゃね? Connector.openとかのURL部分に何が指定できるのかオレは詳しくシラネ。
507 名前:488=495=499 mailto:sage [04/10/22 02:55:12] >>502 普通にっていわれても、アプリでどんなけの処理をしたいかによるから一概にはいえんと思うが。 1回の描画で40*40のImageを使って(使い回して)Canvas#paintのGraphicsに400回ほどdrawRegionを呼んで転送するアプリをオレは書いたけど、 エミュで特に動作速度に不満はなかったなぁ。Time取得して描画前・描画後の差分取ったら0.1秒以下だった、おおむね30-40msecほど。 Pen4 2.4CGHz/1GB/Win2kSP4 あと直接関係ないが、>P4 という表記は紛らわしいのでやめた方がいいと思われ。。 それと、エミュでなく実機でのみの話だと思うが、少数のImageだけ使った方が高速処理できるそうな(新機種手引P6型端末編2.3.3より) >>503 オレはアプリLive使ってないので知らんが、ページ構成見る限りそう取れるよねぇ。 直接アプリLiveサポに聞いてみたらどう? アプリゲットの方は、全部で動くアプリの登録は1回でOK >>504-505 該当箇所(概要編4.6)読んだが、自分でWebからダウソ・RecordStoreに保存したjarファイルにアクセスする場合って前置きがあるが。 SDカードにアクセスするためにはStorageConnection使う方法しかないとオレは理解してるんだが。 で、誰か >488 もおながいします。。
508 名前:488=495=499 mailto:sage [04/10/22 02:58:35] >>507 > Pen4 2.4CGHz/1GB/Win2kSP4 +VアプリエミュP5型 あと、文章が横に長くなってしまってスマソ
509 名前:デフォルトの名無しさん mailto:sage [04/10/22 04:09:16] >>488 は >TextBoxで気にせず素直にcommandActionでネイティブ呼び出すような処理を書いたら、 > 次同じソフトキーを押したときのイベントが起こりませんでした。 ここが問題点の核心なんだが2行目がイミフメでコメントできない ソフトキーでのTextBox呼び出し処理自体は書いたことあって普通に動作してる
510 名前:488=495=499 mailto:sage [04/10/22 05:11:47] >>509 Command登録したTextBoxで、ソフトキー押されたときにネイティブ連係する機能 (具体的にはStorageConnection使ってファイルを保存する操作、 保存時に上書き確認メッセージがネイティブ側で表示される) を用意した場合で、 TextBoxに遷移→ユーザがソフトキー押す→commandActionイベント通知→保存処理を実行 →保存確認メッセージ(ネイティブ)→ユーザがOK→TextBoxに戻る→ユーザがもう一度ソフトキー押す →イベントが通知されない・commandAction呼ばれない となります。さらに続けてもう一回ソフトキーを押すと反応します。 ネイティブ連携しない機能をcommandActionで呼ぶ場合は問題ないです。 TextBoxをCanvasに、ソフトキー(Command)イベントをkeyPressedイベントに 置き換えた場合の説明がTips編(SH53/V601SH箇所)に説明されてますが、 この場合はkeyPressedではなくkeyReleasedでやれと書いてあります。 でもcommandActionイベントはボタンを押したタイミングで起こり、 またボタンを放したタイミングはイベント取得できないので、 同様の回避法は使えません。 で考えたのが >488 後半のThread使った回避法で、 要はユーザがボタンを放すタイミングの時にネイティブ機能が動いているといけないということなので、 ユーザがボタンを押してから離すまでの時間くらいwaitでずらしてから機能を呼ぼうということをしてます。 でも何か根本的解決ではないので、別の回避法やってたり同様の現象で悩んだりしている人がいないかどうかが確認したいんです。
511 名前:500 mailto:sage [04/10/22 05:40:48] >>506 サンクス。試してみマツ
512 名前:509 mailto:sage [04/10/22 08:42:25] >>510 回避策は2つ思い浮かぶ。 1つめ。 keyReleased()で処理すればうまく行くと思うのであればcommandAction()を keyPressed()とkeyReleased()に分解すればいい。 やりたい処理(ファイルアクセス)をcommandAction()ではなくkeyReleased()に書き、 commandAction()からはkeyPressed()とkeyReleased()を呼び出す。 これで見かけ上はソフトキー押下が数字キー同様のkeyPressed()/keyReleased() に反応しているかのようになるのでドキュメントの条件を満たしたことになる。 …なーんて、これじゃ回避策になってないね。スマソ
513 名前:509 mailto:sage [04/10/22 08:43:48] 2つめ。これが本命の回答。 commandAction()内で重い処理をしていることがズバリ原因なので、その点を変更する。 システムからのイベント通知を受け取るcommandAction()/keyPressed()/keyReleased() といったメソッド内では、画面描画、通信、ストレージアクセスといった重い処理を してはいけない。 これらのメソッド内ではフラグ操作や、パラメータをとあるメソッドに送り付けるだけの 処理にとどめる。そしてメインの処理ループでそのフラグなり何なりを監視しておき、 反応があればメイン処理の中で、指定の重い処理を行うようにする。 >ネイティブ連携しない機能をcommandActionで呼ぶ場合は問題ないです。 このことはcommandAction()内で重い処理を行わないからこそと言える。
514 名前:490 mailto:sage [04/10/22 15:21:02] >>506 確かにP4のstubclasses.zipにはcom.j_phone.amuseパッケージが 含まれておりました。 com.j_phone.amuseAPIを使用してみたいと思います。 回答いただきありがとうございました。
515 名前:504 mailto:sage [04/10/22 18:39:44] StorageConnection使って、 Connector.open("jar://mc/test/test.jar/test.png", Connector.READ); とURLの部分のみ変更を加えてみたのですが NullPointerExceptionが出て動かないみたい URL変更前はfile:スキームで正しくファイルが読めていました。 ちなみに読み出そうとしてるtest.pngは空ソースだけのプロジェクトを作って、RESフォルダにtest.pngを入れた状態でjar化したものです。 どなたかSDのjarからリソースを読み込むのに成功した人居ませんでしょうか