[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 07/22 13:26 / Filesize : 254 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

iモード携帯電話用Java(iアプリ) Part14



1 名前:デフォルトの名無しさん mailto:sage [2007/03/16(金) 18:13:16 ]
NTT DoCoMoのiモード携帯電話用Javaに関する話題を扱うスレッドです。

※DoCoMo以外は下記スレへ。
CLDC+MIDP+携帯電話用Javaスレッド part 6
pc11.2ch.net/test/read.cgi/tech/1155174514/

■ iアプリ特有ではなくJava一般に関する質問はこちらへ
【初心者】Java質問・相談スレッド99【大歓迎】
pc11.2ch.net/test/read.cgi/tech/1173026128/

■ iモード携帯電話用Java(iアプリ)まとめサイト
ton.my-sv.net/

■関連スレ
【日本携帯】Mascot Capsule/Micro3D【標準】
pc8.2ch.net/test/read.cgi/tech/1117773530/

過去スレ
Part13 ttp://pc11.2ch.net/test/read.cgi/tech/1164168601/


830 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 20:41:46 ]
サポートしてなくても、とりあえずThrowableをcatchしとけばいいんでない?

831 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 22:31:39 ]
質問させてください。
アプリから、端末に保存している曲データ(MFiやSMFではなく、圧縮音声データ)
を再生したいと思っています。

単純に思いつくのは、MovieStore.selectEntry()でiモーションデータ取得する方法
ですが、このクラスはNとSHの端末でしかサポートされていないようです。
(今回はFをターゲットにしているので、この方法は使えません)

曲データはサイズがでかいので、アプリ同梱や通信でとってくる方法も出来れば
使いたくありません。
あくまで、あらかじめ端末に保存されている曲データを再生したいと思っています。

他に良い方法はあるでしょうか?


832 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 23:35:49 ]
偽装gifして読み込む

833 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 00:05:33 ]
903以降のFって、偽装GIFのコメントヘッダを勝手にとっちゃうから使えないって聞いたけど…

834 名前:デフォルトの名無しさん mailto:sage [2007/08/01(水) 21:58:21 ]
偽装jpgという手もあるぞ
F903iXだけどgifdeladでjpg偽装したテキストが
iアプリのテキストリーダーで読めたからいけるはず

www.moeracode.net/software/gifdelad/

835 名前:831 mailto:sage [2007/08/01(水) 23:27:54 ]
>>831-834
情報dクスです。
偽装なんとかについては詳しくないので、一度研究してみます。

836 名前:デフォルトの名無しさん [2007/08/02(木) 11:18:52 ]
DoJaってLinkedList持ってないよな?
リスト構造が必要になった時って皆どうしてるんだ?

837 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 13:03:04 ]
無いなら作れ

838 名前:836 [2007/08/02(木) 15:10:32 ]
Vectorで代用することにしたよ。
使えるらしいし。



839 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:18:47 ]
>>838
LinkedListとVectorじゃ、計算量的な特徴は全く違うけどね。

840 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 01:38:22 ]
サスペンドイベントと終了イベント(MIDPで言うところのpauseApp()とdestroyApp())が
取れないことがわかって絶望した。
アプリ終了されたときにセーブか何かするってできんやん……

841 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:10:33 ]
サスペンド発生のタイミングは基本的に着信やバッテリー残量不足など
即座にアプリから端末へ制御を渡さなければならない状況。
そのためアプリに余計な処理をさせないようにしてある。

終了イベントをアプリで受け取れるようじゃ端末として問題ありだろう。
電源キーで強制終了しようにも、わざと(またはバグで)無限ループ、
バッテリー抜くまで終了できないアプリが作れちゃう。

で、セーブデータ保存タイミングだけど、アプリ実行中にこまめに保存するしかない。
ゲームなら1ステージクリアごととか、タイトル画面へ戻る度にとか。

842 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 03:23:20 ]
841だが何かズレたこと言ってるな自分
暑さのせいだ、スルーしといてくれ

843 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 04:43:50 ]
もしかしてMIDP準拠のアプリで、destroyAppで無限ループすると操作効かなくなるの?

844 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 09:23:09 ]
Maximum byte code length (32KB) exceeded
というエラーがいきなり出るようになったんですが
なんなんですかこれは?
ネットで調べても見つかりません

845 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 10:37:53 ]
英語の意味のまんま。
直訳してみ?

846 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 10:51:52 ]
バイトコードが32KBを越えた
意味不明

847 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 10:56:00 ]
だからそのままだって。
1メソッド32KBの制約に引っかかったから普通のプログラム組めってこと。


848 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:10:41 ]
>>843
実機依存かもしれないが、イベントハンドラから一定時間リターンしなかったら
強制終了、だったような。



849 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:54:49 ]
>>844
ネットで何を調べたんだ?

850 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 20:28:57 ]
>>844
っていうかこのスレくらい検索しようぜw
ソースうpしてくれ。
>>379のときは見れなかったんだ。興味あるw

851 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:45:48 ]
ボタンを一ドット単位で配置設定なんてことできないよね?

852 名前:379 mailto:sage [2007/08/04(土) 21:12:12 ]
メソッドのサイズを削るために
メソッド内の変数を外に出したらクラスの容量が一気に増えて
今度はクラスの容量が32KBオーバーになっちゃったみたい。
メソッドのサイズ削るよりクラス削るほうが難しそうです・・
ちょうど話題に上がってたみたいなのでもう1回うpしてみました。
zif.hp.infoseek.co.jp/tmp/tori2.zip

853 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:06:16 ]
クラスに32Kの容量制限があるなんて初耳だ

854 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:08:03 ]
500シリーズとか700シリーズの話じゃね?
30kだっけか。


855 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 23:15:05 ]
おそらく暗黙的に宣言される static {} のサイズが32Kを超えたと思われ。
単純な配列データは別ファイルにしてリソースとして読み込むようにして、
その他のものは幾つかのクラスに分散すべし。

856 名前:379 mailto:sage [2007/08/05(日) 00:32:23 ]
>>855
レスありがとうございます
リソースとして読み込むってのがよく分からないけど
とりあえず変数は別のクラスに分散させてみます

857 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 03:53:49 ]
>>856
855さんが言ってるのは、配列の初期化だと思われ。
byte[] a = { ....};
ってやつね。

858 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:28:20 ]
>>854
jarのサイズでなく、プログラム的に1メソッドのサイズ制限だと思われ。
どっかのpdfに書いてあった気がするが忘れたし暑くて探す気がしないから調べといて。



859 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 12:26:58 ]
>>851
できちゃうんだな、これが。

860 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:45:13 ]
クラスのメンバ変数は、バイトコード上ではすべて特別なメソッドに置かれる。
そのメソッドが32kBを超えたからコンパイルエラーになった。

855のリソースにして読むというのは、大きな配列はスクラッチパッドやネットワークとかのクラス外に置いて、実行時に動的に読み込めということだろう。

861 名前:379 mailto:sage [2007/08/05(日) 21:17:15 ]
>>860
普通のメソッドは3000行書いても大丈夫だったのに
クラスのメンバ変数はちょっと書いただけで32KB超えたってことは
メンバ変数にすると容量を大量に消費するってことかな

大きな配列は別クラスに移してあるのでリソースにしなくても大丈夫かな

862 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:07:33 ]
int[] a = { 10, 20, 30, 40 };
とかっていうのは
a = new int[4];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;
って書いたのとほぼ同じだから、相当に容量を食う。

863 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 22:11:59 ]
byte[] a = { 10, 20, 30, 40 };
に至っては
a = new byte[4];
a[0] = (byte)((int)10);
a[1] = (byte)((int)20);
a[2] = (byte)((int)30);
a[3] = (byte)((int)40);
と言う感じでintの即値をbyteにキャストするから、さらに食う。

864 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 23:34:03 ]
>>863
byteの配列ってそんな実装なんだ。
知らなかった。勉強になったよ。
まさか想定の4倍食ってるとは……。

865 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 00:49:26 ]
ヒント : javap -c

866 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 01:39:33 ]
どちらにせよ、データは外出ししておいた方が、管理しやすいし入れ替えやすいし良いよ。
理想的には、プログラムをいじらなくても敵キャラやステージを追加できるくらいにすべき。

867 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:16:36 ]
iアプリで音楽再生するプログラムを書いています。
サンプルを参考にして、MIDIから変換したMLDファイルの演奏はできました。
変換はフリーソフトを使いました。
次は効果音を鳴らしたいんですが、効果音はMIDIではないですよね。効果音は
どのように作成すればいいのでしょうか。
プログラムの話とは少し違いますが、iアプリで鳴らせる音について調べても
良く分からなかったので質問しました。

いろんなサイトを見ても、MLD形式のファイルがMIDIだと書いてあるのに、
着ボイスの拡張子もMLDだったりでよく分かりません。あと、YAMAHAのサイトで
変換するツールのようなものを見つけたのですが、NEC端末用と書いてあったので
違うのかもしれません。

お願いします。


868 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:17:38 ]
>>867
waveからmldに変換するツール探すといいよ。
多分殆どはシェアウェアで、
フリーのは2秒制限とかの制約がつくものが多いと思う。

mldは機種ごとにフォーマットが異なるので、
対応させる機種分mldファイルを用意しないとならない。
Nだけ対応すれば良いのなら、YAMAHAのでもいいかもね。




869 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:22:11 ]
>>859
どーやって?


870 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 14:23:35 ]
>>860
ちと試してみたけど、以下のケースでNGだった。
32KB制限云々に限って言えば、
メンバ変数の初期化はコンストラクタ内で実行されるのと同意なんでない?

class app{
 static byte buf[] = {0,1,2,3,4,・・・}; // ←バイトコードで16KB以上、32KB未満になる配列
 app() {
  byte buf2[] = {0,1,2,3,4,・・・}; // ←バイトコードで16KB以上、32KB未満になる配列
 }
};

>>861
前にも指摘されてるけどさ、
そもそも「3000行の普通のメソッド」なんて有り得ないから。
cだけどこの辺読んでみるといいかも。
ttp://www.pro.or.jp/~fuji/mybooks/cdiag/

まー、その場しのぎで良いならクラス2つに分けて、
変数部分だけごっそり移動すれば解決するんじゃないかね。
0から作り直したほうが早いと思うけど。


871 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 14:31:31 ]
一昔前のiアプリじゃいかにメソッドを作らないかを
試行錯誤したもんだが、随分とヌルくなっちまったな。


いいことだ(・∀・)

872 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 14:34:00 ]
インスタンス変数はコンストラクタで、static変数はstaticイニシャライザで初期化される

873 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 15:04:36 ]
インスタンス変数とコンストラクタが<init>で、スタティック変数とstatic{}内が<clinit>というメソッド名になる。
>>867
MLDは、MIDIのような情報、Wave(ADPCM)のような情報どちらも扱える。
>>863
配列の初期化のときの代入は、iastoreとbastoreの違いだけで、
バイトコード上でのキャストはなかったはず。

874 名前:379 mailto:sage [2007/08/06(月) 16:45:56 ]
>>870
メソッド少なくしたのはどっかのサイトにメソッドは少ないほうが
容量少ないって書いてあったからです。
次作るときはオブジェクトに分けるのを試してみたいです。

配列がバイトコードになったときのサイズどうやって調べたんですか?

875 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 18:41:46 ]
キーリビートってどう実装したらいいんですか?

876 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 18:59:38 ]
>>869
レイアウト管理オブジェクトを無効にして、
自分でコンポーネントの座標を設定する。

877 名前:867 mailto:sage [2007/08/06(月) 19:15:42 ]
>>868
ありがとうございます。
wav2mldというソフトを見つけて体験版を試してみたのですが、長さは
2秒もない音声ですがエミュレータ上では再生できませんでした。
そんなに高くなかったので製品版を購入してもう一度試してみようと思います。
他にも変換ソフトがあるようでしたら教えてもらえると嬉しいです。フリーじゃ
なくてもいいです。自分の端末はSOなのでYAMAHAのものではダメのようです。

>>873
ありがとうございます。
WAV形式のMLD形式(?)があって、どちらも拡張子がMLDということでよいでしょうか。
wav2mldというソフトの製品版を使ってみようと思います。

878 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 21:05:30 ]
>>875
毎フレームgetKeypadState()して、過去数フレームと見比べる。


ところで、Java->C, J2ME->BREW自動変換をうたうツールやベンチャーをたまに見かけるが、
GCをどう解決してるかについて何も言ってないのは詐欺認定でいいよな?



879 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 22:31:40 ]
>>875
俺はボタンが押されたら別スレッドでループを回して
離れたらスレッドを切るようにしてる

880 名前:831 mailto:sage [2007/08/06(月) 23:19:16 ]
>>831で質問した者です。
偽装JPEGファイル経由で音声iモーション(AACファイル)再生できたので、
やり方など残しておきます。

・ImageStore.selectEntry()でImageStore取得
・ImageStore.getInputStream()でInputStream取得
・InputStream.read()で不要なデータ読み捨て
・MediaManager.getImage(java.io.InputStream in)でMediaImage取得
・MediaManager.use()
・AudioPresenter.getAudioTrackPresenter()でAudioTrackPresenter取得
・AudioTrackPresenter.setSound(MediaImage sound)でiモーションセット
・AudioTrackPresenter.play()で再生

再度、>>831-834に感謝。

881 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 08:06:06 ]
>>880
おーすごい、レポ乙でつ(`・ω・´)ゝ

882 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 11:05:55 ]
>>880
俺偽装ファイル扱うの知らないんだが、最後から2番目の
MediaImage sound
てどこから出てくるん? MediaManager.getSoundの間違い?

883 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 11:36:22 ]
AudioTrackPresenterのリファレンス参照しる
> 動画のオーディオトラックは MediaImage オブジェクトであるため、
> setSound(MediaImage) メソッドにて設定する必要があることに
> 注意して下さい。

884 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 12:30:48 ]
>>877
>>376でも言った気がするが、PsmPlayerがあるだろ。無料で使えてwav変換も出来るぞ。

885 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 15:26:18 ]
PsmはN用に変換してもN903iで再生できなかった

886 名前:821 mailto:sage [2007/08/07(火) 15:49:06 ]
NはYAMAHAのサウンドを使っているから他と同じにしてはだめ。

今まで各端末メーカごとのサウンド作成する必要がったが
903から統一されて一つのサウンドでよくなった。
しかし、Nだけ903用のサウンドを使用しても鳴らず
N902i用のサウンドを使う羽目になった。

887 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 17:08:35 ]
IアプリからSOAP経由でWEBサービスを利用する事ってできるんでしょうか?
BREWアプリなら可能なんですが…。

888 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 17:25:00 ]
>>887






889 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 18:46:59 ]



890 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 18:54:40 ]
>>886
ごめん、それもっと詳しく教えてくほしい

891 名前:886 mailto:sage [2007/08/07(火) 20:07:50 ]
すまん、前提が違っていた。
俺がmld変換に使っているツールはpsmではなく
DoCoMoの公式CPに配信されるツールとプラグインなのよ。

ところで、俺はpsmについてはあまり詳しく知らないんだけど
これって505の世代までしか対応していないんじゃないかな?
そうだとすると、903とは世代が相当違うから
鳴る保障はほとんどないのでは?

892 名前:デフォルトの名無しさん mailto:sage [2007/08/07(火) 20:42:49 ]
MFiToolsか…

893 名前:831 mailto:sage [2007/08/07(火) 22:39:16 ]
>>882
AudioTrackPresenter.setSound(MediaImage sound)の括弧の中は、
単なる引数を書いてるだけなので、AudioTrackPresenter.setSoundに
MediaImageオブジェクトを渡すってことです。
("sound"は単なる引数名)

894 名前:デフォルトの名無しさん [2007/08/08(水) 23:08:34 ]
Javaを勉強するぞおおぉ!

895 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 22:34:11 ]
やっぱりあんまりメモリ気にしなくて良いのは楽だなぁ。
自分で弄れた方が良い場面もあったが、最近は殆ど関係無いから
やっぱJavaって良いわ。

896 名前:デフォルトの名無しさん [2007/08/10(金) 13:39:35 ]
>886

>今まで各端末メーカごとのサウンド作成する必要がったが
>903から統一されて一つのサウンドでよくなった。

これのソースが知りたい…
(ソースと言ってもプログラムじゃなくて情報源のほう)

897 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 00:11:05 ]
たぶんサウンドというのはMIDI音源のことじゃなくて
PCM音源のことを言っているんだと思う
PCM音源だと機種によっては実装していない


898 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 01:03:29 ]
MFiTools(?)の吐くmldが1種類になったってことだろ



899 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 02:08:43 ]
音源がなければMLDに変換してもWAVE再生は不可能ということじゃないの?


900 名前:886 [2007/08/11(土) 02:58:10 ]
898の言っているのが正解。一種類で済むようになったって話。
ただしNは例外。
イロイロ調べてみたけど、一般の資料では、この辺の事書いてあるやつないんだな。
ってなわけで、この件について俺はもう語らん。

901 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 03:08:37 ]
>>896
903が発売されたころ公式CPにはサウンドの互換性一覧
みたいなのが公開されて滝がする。俺は部署違うので、中身
見てないし、知ってても言えないんだけどそれじゃないのかなあ。
# 知ってはいないが経験的にはN以外全部一緒で鳴る

そうでなくとも、SH/D/FについてはFUETREKのPCM音源を
積んだSH-Mobile G1だと報道発表されているので当然全く
同一の仕様で確定。NがMA-7なのは変わらず。Pだけは音源が
不明だけど、実際に鳴るってことは少なくともROHMからFUETREKの
音源に乗り換えたんじゃないのかな。と思ってる。

902 名前:デフォルトの名無しさん mailto:sage [2007/08/11(土) 11:23:13 ]
ドコモとFueTrekは去年くらいに近業務提携したはずだから、それの影響?
wav2mldのサイトを見ると、903シリーズ以降は、[P F D SA]、[SH SO]、Nの3種類みたいだね。
1種類になったってことは、N以外は全部同じになるのか。
そのうちフォーマット公開されないかな

903 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 04:28:38 ]
サーバーサイドにあるPHPにアクセスして、
ネットワークごしに画像をダウンロードする方法で戸惑っています。

// PHP側
<?php
 $img = imagecraetefromgif("img.gif");
 header("Content-Type: image/gif");
 imagegif($img);
?>

// Java側
void downloadImage(String url) {

904 名前:903 mailto:sage [2007/08/12(日) 04:42:27 ]
サーバーサイドにあるPHPにアクセスして、
ネットワークごしに画像をダウンロードする方法で戸惑っています。

// PHP側
<?php
 $img = imagecraetefromgif("test.gif");
 header("Content-Type: image/gif");
 imagegif($img);
?>

// Java側
void downloadImage(String url) {
 try {
  HttpConnection hc
   = (HttpConnection)Connector.open(path, Connector.READ, true);
  hc.setRequestMethod(HttpConnection.GET);

  hc.connect();
  InputStream in = hc.openInputStream();

  byte[] data = new byte[(int)hc.getLength()];
  in.read(data);
  
  ...
}

このような関数で、引数urlでphpのスクリプトにアクセスして画像をダウンロードしたいと思っているのですが、
これだとhc.getLength()が-1で、明らかに正常にアクセスできていません。
ちなみに、urlでgif画像の直リンクを張った場合は正常に動作します。
PHPの出力方法に問題がありそうな気がするので若干スレ違い気味ですが、原因がわかる方がいましたらお願いします。

905 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:00:26 ]
> 原因がわかる方がいましたらお願いします。
ヘッダーにコンテントレングスをセットしていないから。


906 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 07:13:22 ]
Content-Lengthの出力はサーバ側の設定によるもの。
アパッチのコンフィグで設定するなり何なり。

一方、iアプリ側はgetLength()が-1になることも考慮した組み方をしておく。
Content-Lengthを設定しておらず、自分でもいじれないサーバではアプリ側で対処するしかない。
if ((int)hc.getLength() == -1){〜} else{〜} てな記述。
具体的な記述内容はググればいくらでも例が見付かる。

907 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 10:43:49 ]
>>904
>これだとhc.getLength()が-1で、明らかに正常にアクセスできていません。

getLength() が -1 でも正常にアクセスできててデータの中身はちゃんと読める。

908 名前:904 mailto:sage [2007/08/12(日) 12:06:52 ]
>>905
PHP側でContent-Typeを出力する前に
 header("Content-Length : " . filesize("test.gif"));
を追加してみたのですが、connect()の段階で止まってしまうのです。

>>906-907
-1でも正常にアクセスできているのは、初耳でした。
確かにレスポンスコードは200だったのですが・・・、ありがとうございます。
以下のコードで、正常に動作することを確認しました。

// Java側 hc.openInputStream()以下
 ...
 byte[] data;
 if ((int)hc.getLength() != -1) {
  data = new byte[(int)hc.getLength()];
  in.read(data);
 }
 else {
  ByteArrayOutputStream bs = new ByteArrayOutputStream();
  while (true) {
   int temp = in.read();
   if (temp == -1) {
    break;
   }
   bs.write(temp);
  }
  data = bs.toByteArray();
 }
 ...



909 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 12:17:17 ]
公式資料に書いてあるっての

910 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:17:20 ]
>908
そして第2のはまりポイント
in.read(data); は一度で全部読み込めるとは限らないから
-1が返るまでループ処理してバッファに追記していくこと

911 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:17:53 ]
ってゴメン
それはちゃんと書いてあるね

912 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:25:07 ]
いや、getLength() != -1 のほうの

  data = new byte[(int)hc.getLength()];
  in.read(data);

これは良くない
↓のようにするか

data = new byte[(int)hc.getLength()];
int i = 0, n;
while ((n = in.read(data, i, data.length - i)) >= 0) {
i += n;
}

面倒かったら↓で

data = new byte[(int)hc.getLength()];
new DataInputStream(in).readFully(data);

913 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 14:52:40 ]
>>908
>connect()の段階で止まってしまうのです。
こりゃ実際に出力しているデータサイズが違うんじゃないの?

たとえば
ContentLength: 100を設定しておいて、データは90バイトしか送ってないとしたら
携帯側は残り10バイトが届くまで受信待ちの状態になってるだろうさ

914 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 17:59:27 ]
だな。鯖側の処理おかしいもん。
こんなんでどうよ?

<?php
$fname = "test.gif";
$fdata = file_get_contents($name);
$fsize = strlen($fdata);

header("Content-Length: ". $fsize );
echo $fdata;
?>

915 名前:914 mailto:sage [2007/08/12(日) 18:04:08 ]
あー、ちなみに何がおかしかったかというとimagecraetefromgif()でイメージリソース
として取得したデータを、PHPで出力時にGIFに再変換しているから元のデータと微妙に
変わっているということ(画像としては同じになるけどヘッダとか違う)。
で、出力サイズは元ファイルのを出しているから、正しいサイズになってない。
そもそもgd呼ぶような面倒なことはしないで、そのままバイナリ吐いてやればよかった。

916 名前:914 mailto:sage [2007/08/12(日) 18:05:49 ]
ごめ。2行目の引数は「$fname」な。
 - $fdata = file_get_contents($name);
 + $fdata = file_get_contents($fname);


917 名前:904 mailto:sage [2007/08/12(日) 21:18:41 ]
>>912
ネット上で調べた文献の多くがこの方法だったので・・・、迂闊でした。
一回のread()で読み切れない場合があるってことですかね?
今ひとつ理解できていませんが、直しておきます。

>>913-916
この方法を使ったら、普通にgetLength()で取得できるようになりました。
file_get_contents()でリソースを取得すれば良かったのですね。

ありがとうございます、おかげ様で理想通りに動作するようになりました。


918 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 21:24:49 ]
>>917
InputStream#read は 「1バイト以上読む」 っていう仕様なので。
1バイトでも読めたらそれで返ってくることが許されてる。



919 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:44:44 ]
女の子にもてもてになるiアプリの作り方を教えてください。

920 名前:デフォルトの名無しさん mailto:sage [2007/08/12(日) 23:51:52 ]
エロゲーでも参考にして作ればいいと思うよ

921 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 02:30:50 ]
>>919
女の子にモテモテになってからiアプリを作ればおk

922 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 04:41:14 ]
俺の女性の知り合いはみんなau_| ̄|○ il||li

923 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 05:46:13 ]
じゃあ、オープンアプリを作ればいいじゃない

924 名前:デフォルトの名無しさん mailto:sage [2007/08/13(月) 06:01:14 ]
オープンだとウイルス入ってそうで怖い

925 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 01:03:27 ]
スクリプトのパースメソッドだけで500行行きそうです

926 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 18:09:32 ]
質問させて下さい!
ショートタイマーを使ったリアルタイム処理のゲームを作っています。
複数の端末で実機テストを行った所、一切エラーは発生しなかったのでユーザに配布したのですが
同じ機種でもエラーが発生する場合と発生しない場合があり、しかも特定の箇所ではなく毎回違う
場所でエラーが発生するそうなんです。
携帯側に処理を渡してないからかなと思い、至る所にスリープ処理を入れたのですが、それでも
エラーが発生するそうなのです。

そこで一つ質問なのですが、現在のソースを見るとショートタイマーの発生時間は20に設定しています。
ループ内のスリープ時間の合計を見ると上記の20を超えておりました。
例えばショートタイマーイベントでの処理が終わっていないうちに次のショートタイマーのイベント発生時間に
なった場合、強制的に2つの処理が同時に行われてしまうのでしょうか?
それが原因でエラーが発生しているのかな?と思いましたので。
自分の端末でエラーが出るなら確認しやすいのですが、なにせ自分の端末ではエラーが発生しないので…。

長文で申し訳ありませんがよろしくお願い致します。

927 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 18:41:13 ]
ループ内のスリープ時間ってなによ
何かループしてんの?

928 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 19:39:41 ]
while(true)で回して中でsleepじゃなくて
timerでタイマーイベント取得して、更にその中でsleep?



929 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 21:26:36 ]
個人の携帯の使い方に問題があってエラーが出る事も多いから、
いちがいにプログラムが悪いとも言えない。


930 名前:デフォルトの名無しさん mailto:sage [2007/08/15(水) 22:34:28 ]
タイマー分解能やタイマー精度、CPU負荷の問題で、きっちり20msecずつwaitすることはまずない。
タイマーイベントは同時に起こらないはず。心配ならsynchronizedすればいい。ただしイベントがたまりすぎると変になる機種もある。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<254KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef