トップページ⇒tech
984コメント347KB

CLDC+MIDP+携帯電話用Javaスレッド part 2

■ このスレッドは過去ログ倉庫に格納されています
0001誰NGNG
J2ME CLDC+MIDPベースの携帯電話用Java(主にEZアプリ、Vアプリ)に関するスレッドです。
質問でも議論でも何でもこい、と。

前スレ:
携帯JAVAのスレッド
http://pc2.2ch.net/test/read.cgi/tech/1011977260/

--
Java一般に関しては:
【初心者】Java質問・相談スレ37【大歓迎】
http://pc2.2ch.net/test/read.cgi/tech/1070159693/

NTT DoCoMoのiモード携帯電話用Java(iアプリ)については:
iモード携帯電話用Java(iアプリ) Part 4
http://pc2.2ch.net/test/read.cgi/tech/1067139509/

>>2あたりにリンク集
0153145NGNG
>> 147
コンパイルでエラーでちゃうんですよ。
getWidth()がintとサイズ違うんだかなんなんだかわかりませんけども・・・

画面サイズで表示サイズ指定したかったんですが、できないのかなぁ・・・
0154150NGNG
>>152
バージョン違ったらダメだろ。普通。

エミュと言ってるのは、WirelessToolkitのエミュのことか?
であれば、ボダの拡張APIのクラスファイルがないから動かないのは当然。
ボダ用のエミュレータなら、MIDP2.0のAPI使ってないか、確認しろ。

>>153
せめて、コンパイルエラーの文言ぐらい書いてくれ。
0155デフォルトの名無しさんNGNG
昨日からこっそり開発を始めたMIDP初心者です。

Vアプリのエミュレーターを使って動作確認を
しているのですが、このP5型では無いエミュレーターでも
100k~256kのjarファイルを動作させることはできるのでしょうか?

おしえてエロイ人
0156デフォルトの名無しさんNGNG
>>154
JSCL1.2.1のAPIを使っていなければ
サイズのみ100〜200kのjarは可能
256kでは無いので注意
残りはレコードストアね
0157デフォルトの名無しさんNGNG
>>156
即レスありがとうです!

動作確認は取れるということですね。
jarが200kまでとは・・。もう一回仕様書読んできます。

ほんとにありがとうでした(^。^
0158142NGNG
>>150,156
apiは1.0の範囲で収まってると自信をもって言えます。
でも念のため今はWTK104でやってます。でも状況は変わってないです。
ちなみに圧縮方法変えてみたりしてみましたが。やはりNo such method getWidth.()I が。
あ、ちなみにエミュはvodafoneのj-sky application emulatorで、
WTK付属のエミュでやってみると
ALERT: Unable to load class com/jblend/media/MediaPlayerListener
です。ま、こっちは当然ですが。

vodafoneの拡張API使ったアプリを作っていらっしゃる皆々様はコンパイルのときいちいちコマンドプロンプト使ってるんですか?
まさか・・・ね。
0159142NGNG
…ヤッタ!

midpapiのjavax/microeditionにstubclassesのjavax/microeditionを
上書きして圧縮したらできました。
結局プログラムとは試行錯誤なんだなぁ、と。(違)
>>150,>>156両氏、レス感謝です。
0160デフォルトの名無しさんNGNG
>>157
コマンドプロンプトだけど何か?

つーか、普段使っているSolarisもコマンドプロンプトみたいなもんだから
違和感ないんだよね
0161デフォルトの名無しさんNGNG
Vで文字や絵を点滅させるにはどうすればいいんですか?
0162デフォルトの名無しさんNGNG
>>161
描く→消す→描く→消すを繰り返す。
0163デフォルトの名無しさんNGNG
JBuilder パーソナルでEZアプリを作ろうとがんばっているのですが、エミュレータで以下のようなエラーが出てしまいます。プログラム内容は単にHelloWorldと表示するだけのものです。
Loading JAD:
cannot run: helloworld
java.lang.ClassNotFoundException
Exception.........: e5f0560 'java/lang/ClassNotFoundException'
Application EMERGENCY termination. (-1)
0164163NGNG
環境はJ2MEWTK+JDK1.3.1_10 エミュはEZPLUS開発ツールのやつです。助けて神サマー
0165デフォルトの名無しさんNGNG
>>163
「ClassNotFoundException」でググれば即解決。
0166163NGNG
>>165
ありがとうございます。早速調べましたが私初心者なものでいまいちよく分かりません(**)
差し支えなければどういう意味か教えてはいただけませんか?
0167デフォルトの名無しさんNGNG
>>166
「クラスが見つからない例外」
・・・これで意味がわからなければ、Javaを基礎から勉強してみた方がいいかも。
0168デフォルトの名無しさんNGNG
Vアプリの待ち受けで、メールの着信通知の見分け方って
どうすればよい?
普通に待ち受けアプリを作ってみたら、着信通知でもメールが
来たことになってしまった
エミュレータにもそれらしいイベントないし。。。。

普通のSKYメールと着信通知は、何を見分ければよいか
教えてプリーズ!>JAVAのエロイ人
0169デフォルトの名無しさんNGNG
>>168
MailListener
0170デフォルトの名無しさんNGNG
>>163
>単にHelloWorldと表示する
の前に、HellowWorldとログ出力するだけのでも作ってみ。
それから、Canvasに文字や図を書くのをやってみよう。
0171デフォルトの名無しさんNGNG
レコードストアにJARを保存して、JARに含まれるファイルを個別に取り出すことってできるんですか?
そのあたりの仕様が載っているサイトや本があれば教えていただきたいのですが・・・
0172デフォルトの名無しさんNGNG
>>168
VアプリのP5型のJavaDocを見たけど
MailListenerのトコには、それらしい記述が
無いのですが?
もうちっとヒントをお願いします
0173163NGNG
>170
ありがとうございます。少しずつ調べながらがんばってみます!
0174デフォルトの名無しさんNGNG
>>171
JARに含まれるファイルをとりだすことは可能。
しかし、レコードストアをJARに保存するできない。
というか、JARは書き換えられないのでは?
0175デフォルトの名無しさんNGNG
>>172
>このインタフェースを実装したリスナを、DeviceControlのsetMailListener()メソッドを呼び出して
>登録してください。 メール着信に関するイベントは、MailListenerインタフェースのreceived()
>メソッドに通知されます。
と思いっきり書いてあるのだが。

>>171
Vアプリなら、Connector.open("jar://Filename/Resourcename");
とかでRecordStoreに保存したJARの中身にアクセスできるとドキュメントに書いてあった。
ezは知らない。

>>174
レコードストアをJARに保存するのではなくて、JARをレコードストアに保存したいのだと思われ。
0176171NGNG
>>175
>Vアプリなら、Connector.open("jar://Filename/Resourcename");
>とかでRecordStoreに保存したJARの中身にアクセスできるとドキュメントに書いてあった。
ありがとうございます!!

ところで、そのドキュメントって具体的にはなんと言うファイルでしょうか?
VodafoneのPDF資料を見ていたんですが、それらしい部分を見つけられなくて・・・
詳しい制限等知りたいので、お手数ですが教えていただければ助かります。
0177174NGNG
げ。日本語が読めてなかった。

>> 175
"jar://" スキームは、単にJAR内のファイルを読むだけでなかったけ?
0178デフォルトの名無しさんNGNG
Vアプリ開発ガイド概要編の4.6 JAR の項を読む限りではできそうに思えるんだけどなあ。
今月いっぱいは試そうにも試せないから、質問者の人に試してもらうって事で。
0179デフォルトの名無しさんNGNG
RecordStoreに保存したjar内のファイルへのアクセスはこんな感じで出来るかと

byte buf[] = new byte[65536];
InputConnection c = (InputConnection)Connector.open("jar://"+レコードストア名+"/"+ファイル名 , Connector.READ);
InputStream is = c.openInputStream();
is.read(buf);
is.close();
c.close();
0180デフォルトの名無しさんNGNG
キーイベントでちょっとお聞きしたいのですが、
現在

/** キー押下イベントが発生した時に呼ばれるメソッド */
protected synchronized void keyPressed(int keyCode) {
if(gameState != GAME_PLAYING ||
(gameState == GAME_PLAYING && isPaused)) {
//ゲーム中ではない、又はゲーム中で一時停止中の場合はreturn
return;}
int gameCode = getGameAction(keyCode);
switch(gameCode) {
case LEFT://左キー押下時
for(int i = 0;i < 8;i++){
doLeft();
try{
Thread.sleep(50);
}catch(InterruptedException e){}
}
       以下上下右が入ります。
              }
}
/** キー押下状態の時に繰り返し呼ばれるメソッド */
protected void keyRepeated(int keyCode) {
keyPressed(keyCode);
}
という様に拾っているのですが(do〜は移動描画をしています)押しっぱなし状態だと
一歩動いてその後押してた方向に動きっぱなしになってしまいます。
スレッドの扱い方が悪いのでしょうか?

ご教授おねがいしまつ。

0181デフォルトの名無しさんNGNG
>>180
キー入力がキューイングされてるためだと思う。
keyPressed()で重い処理をすると、どうしてもキーに遅れが発生する。

keyPressed()と描画が、N:1 にできるように作れば、大丈夫とおもう。
0182wikiのVアプリスレまとめサイト”管理”人 ◆zaLvCUpNTU NGNG
○○キーは押されてるの?放されてるの?テーブル を作って
押されたり放されたりしたときにフラグを上げ下げするとか?
0183デフォルトの名無しさんNGNG
>>174
resさんきゅ
しかし、MailListenerのJavaDocを読む限りは、
recieveのSMSの種類ってやつは
通常ステーション着信
緊急ステーション着信
グリーティング
スーパーメール
リレーメール
スカイメール
ウェブ着信
しか無いんだよ
実機で試してみると、skyMailの着信通知のときは
スカイメールが帰ってきてるみたい
なんか、そもそものアプローチが何か間違ってる?
0184デフォルトの名無しさんNGNG
>>183
そもそものアプローチというか、何がやりたいのかわからんのだけどなぁ。
一応整理しておくと、
・RingStateListener
→(ユーザーへの)着信通知(端末側での呼出音鳴動など)の開始、終了の際に呼び出される。
・MailListener
→端末にメールが着信した場合に呼び出される。
・TelephonyListener
→端末に音声着信した場合、電話が切れた場合に呼び出される。
0185デフォルトの名無しさんNGNG
>>183
済まん、用語の使い方が間違っていたよ>おれ
知りたいのは、SkyMailを送信した後の「配信確認」というやつです。

配信確認の通知もreceived()に来るみたいなんですが、
その時のSMSの種類がスカイメールみたいなので
困ってます
という話でした(^^;
0186デフォルトの名無しさんNGNG
>>180
MIDPじゃ、Keyイベントはすぐに処理を終わらせないといけない。
50msecを8回も待つとかやっちゃダメ。

Vなら以下のメソッドを使うのがいい
DeviceControl#getDeviceState( KEY_STATE)

それか、 >>182 のいうようにKeyPressed/KeyReleasedイベントで方向フラグを立てる・下げるをやって、
別スレッドでそのフラグを参照しながら描画するか。


>>185
実機使って実際にイベント起こして、
int detailの値を調べてみるしかないのでは。
そもそもDocに載ってないから、返ってくる値の保証もないだろうけど。
(時間や日付によって違う・機種によって違う、など)
0187デフォルトの名無しさんNGNG
ボーダホン用のエミュレータってどこを探せばありますか?
0188デフォルトの名無しさんNGNG
>>187
>>2
0189デフォルトの名無しさんNGNG
Vアプリでhttpconnectionを使うアプリを作成中です。
通信相手は自分で立てた外部アクセス可能なサーバで、
エミュレータからはうまくいったのですが実機からはダメでした。
これは、やはりサーバの設定に問題があるということなのでしょうか?
以下、仕様&ソースです。
0190189NGNG
サーバ
・Tomcat+java servlet
実機
・SH-52
0191189NGNG
//ソース
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import com.jblend.micro.io.*;
import java.io.*;

public class httpTest2 extends MIDlet implements CommandListener
{

private Form myForm;
private TextField tf;
private Command cm1,cm2;

private String formStr;

private final String URL = "http://smlsgrp.u-aizu.ac.jp:8080/test/servlet/saveDataServlet2";
private HttpConnection conn;
private InputStream in;

int ch;
StringBuffer result;
0192189NGNG
public httpTest2() {
inithttpTest();
Display.getDisplay(this).setCurrent(myForm);
}

public void inithttpTest() {
formStr = "Input File Name";

myForm = new Form("HTTP TEST");
myForm.append(formStr);
tf = new TextField("File Name",null,10,TextField.ANY);
myForm.append(tf);
cm1 = new Command("送信開始", Command.SCREEN, 1);
myForm.addCommand(cm1);
cm2 = new Command("終了", Command.SCREEN, 2);
myForm.addCommand(cm2);
myForm.setCommandListener(this);
}
0193189NGNG
public void commandAction(Command c, Displayable d){

int i;

if( c == cm1 ){

if(tf.getString()==null){
formStr = "Please Input File Name!!";
}else{
try{

i=5;
result = new StringBuffer();

conn = (HttpConnection)Connector.open(URL+"?name="+tf.getString()+"&data="+Integer.toString(i), Connector.READ, true);
conn.setRequestMethod(HttpConnection.GET);
in = conn.openInputStream();
while ((ch = in.read()) != -1) {
result.append((char)ch);
}

in.close();
conn.close();

}catch(Exception e){
}
}

}else if( c == cm2 ){
0194189NGNG

destroyApp(false);
notifyDestroyed();

}
}

// エントリポイント
public void startApp() {
}

// アプリの一時停止
public void pauseApp() {
}

// アプリの廃棄
public void destroyApp(boolean unconditional) {
}

}
0195189NGNG
//サーブレット
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException{

String fileName = req.getParameter("name");
int data = Integer.valueOf(req.getParameter("data")).intValue();

try{
res.setContentType("text/plain");
DataOutputStream dout = new DataOutputStream(new FileOutputStream(dir + fileName, true));

dout.writeInt(data);

OutputStreamWriter osw =
new OutputStreamWriter(res.getOutputStream());
PrintWriter pw = new PrintWriter(osw);
pw.print("true");
pw.flush();
pw.close();

dout.close();

}catch(Exception e){
}
0196189NGNG
あ、URLもそのまま書き込んでしまった・・・・
0197デフォルトの名無しさんNGNG
Vってポートの指定(:8080とか)あるとエラーになった と思う。
0198デフォルトの名無しさんNGNG
EZ端末での現象なのですが、アプリをダウンロードするページを開き、
アプリをダウンロード。※ダウンロードは成功。

その後に、ダウンロードしたぺージに戻りたいのですが、
なぜか、全然別のページに飛んでしまいます。
(EZWebのTopページだったり)

ダウンロードページは下記のような記述をしています。
<a href="device:data/dnld?url=http://www.aaa.com/appli/download.cgi&;name=aaa.kjx&size=123&disposition=devkdj2&title=テスト">ダウンロード</a>

なにかわかるかたが、いらっしゃいましたらおしえてください。
0199デフォルトの名無しさんNGNG
そうそう。Port80しか繋がらないね。
これが意外と不便。
0200189NGNG
>197,199
レスありがとうございました。
mod_jk2でApacheとTomcatを連携させることで解決しました。

ついでに質問なんですが、
「連続的なデータを携帯アプリからサーバに送ってそれをservletがファイルに書き込む。」
みたいな処理をさせたいのですが、この場合streamを使うとうまいこといきません。

携帯のほうで
for(){
conn = (HttpConnection)Connector.open(URL+"?file_name="+xxxxx+"&data=xxxxx", Connector.READ, true);
}
のようにしても、途中で途切れてしまいます。

何かよいお知恵はありませんでしょうか?
0201デフォルトの名無しさんNGNG
URLの制限があったような。
0202デフォルトの名無しさんNGNG
QVGAで画面自動拡大されたアプリって、文字サイズはどうなんの?
Vはまだいいんだがauの方で文字がでかくなりすぎるんだが・・。
0203デフォルトの名無しさんNGNG
文字も画像もそのまま拡大されるはず。
0204デフォルトの名無しさんNGNG
どなたか神の人に、激しくお伺いしたい。

VodafoneのC4アプリを書いてて、大分大きくなってきたので、噂のjargで縮めようと思ったのですが、
適用後のjarの挙動が変わってしまうのです。

スプライトの扱いが面倒だったので、そこだけ本体とは別クラスにしたのですが、
その別クラスの中にあるfor(int i=0; i<10; i++)みたいなベタなループが無限ループ化してしまって…。

こんなことって、あるもんなんでしょうか。

javac -encoding SJIS -g:none -O -target 1.1 -bootclasspath C:\V-appli_SDK_101\lib\stubclasses.zip src\*.java -d class
preverify -classpath C:\V-appli_SDK_101\lib\stubclasses.zip;.\class AppName
preverify -classpath C:\V-appli_SDK_101\lib\stubclasses.zip;.\class Main
preverify -classpath C:\V-appli_SDK_101\lib\stubclasses.zip;.\class Sprite
jar cfm bin\AppName.jar bin\MANIFEST.MF -C output .
java -jar jarg.jar -j2me-prev preverify.exe -j2me-cp C:\V-appli_SDK_101\lib\stubclasses.zip bin\AppName.jar

みたいなバッチを書いてビルドしてるんですけど…。
AppNameがMIDlet継承、Mainが実際の本体クラス、Spriteがスプライトの取り扱いクラスです。
うまくいかないのは漏れが童貞なせいですか?


ついでに、pause〜resumeの流れの中で、たまにPhraseTrackerがレジュームをサボりやがって
音が復元しないで止まってしまうのも、漏れが童貞なせいですか?
0205デフォルトの名無しさんNGNG
auのはPhase3.0でも、データフォルダからの画像読みだしは公式CP
じゃないとムリですか?
表示できればいいのでImageオブジェクトで十分なのですけど、
Phase2.5ではそれすらできなくて鬱。
0206デフォルトの名無しさんNGNG
>>204
jargのバグかもよ
バイトコードの最適化を切ってみそ
0207デフォルトの名無しさんNGNG
>>203
自分のアプリで使ってみたよ
上の行をそのままDOS窓から叩いてみた
70kが68kになった
画像が多かったから、あまりお徳では無かったよー
動作は特に支障なし
ちなみに、童貞は卒業済み
0208デフォルトの名無しさんNGNG
追伸
スプライトは使っていない(実は使ったこと無い)
forループは満載
C出身なので、クラス分けも盛大にやってる
0209デフォルトの名無しさんNGNG
>>207
おれも使ってみよう
ちなみにまだ卒業してません(もうすぐ30歳)
0210デフォルトの名無しさんNGNG
>>209
魔法が使えるようになるまでもう少しだね。
0211デフォルトの名無しさんNGNG
UDPパケットを送ることはできますか?
0212デフォルトの名無しさんNGNG
そもそもTCP/IPどころか、httpしか対応してないような。
0213デフォルトの名無しさんNGNG
>>204
retroguardじゃだめなの?
0214デフォルトの名無しさんNGNG
アプリ動作中に携帯電話本体の終了ボタンを押すと、
ソフトキーのボタンが利かなくなってしまうのですが
どのように対応すればよいのでしょう?
0215204NGNG
遅レスだけど魔法使えるようになりますた。
もとい、>>206氏の指摘どおり -noboc でバイトコード最適化切ったら動くようになりました。
他のオプションもひとしきりためしたけど、動作が変わったのは -noboc だけですた。
似たような構造のほかのプログラムにも jarg かけたけど、普通に動いちゃったし、レアケースなのかなあ。
とにかく、マゾでありがとうございます。

ついでに 7zip かけたら、トータル 30KB が 25KB くらいまでダイエットされました。
漏れの童貞もらってやってください。
0216デフォルトの名無しさんNGNG
やっぱjargのバイトコード最適化にはバグがあるって事か…
ProGuardとかに乗り換えた方がいいのかな?

それと、7zipを使う場合はアーカイブするファイル数に注意
昔使ったとき、N503(4かも?)でアーカイブするファイル数が多いと起動出来なかった記憶がある

DTはイラネ。適当にその辺に捨ててくれ
不法投棄になりそうなら、業者に引き取ってもらえ
0217デフォルトの名無しさんNGNG
MIDPやろうと開発環境の準備を始めました。Vodafoneです。
でもどうしてもSun ONE Studio4 Mobile Edition と
VodafoneエミュのIDE統合ができない。
http://zdn.zentek.co.jp
のサポートからダウンできる資料を参考にやってみたけど。
この通りやって実行すると「メインクラスがない」とか怒られて
うまくアプリが動作しない。何を勘違いしているのだろう。
だれか出来た人います? JBuilderではどうでしょう?
0218217NGNG
補足。エミュを自分で立ち上げて実行すると上手く動く。当然か。。。
0219デフォルトの名無しさんNGNG
>>216
メインクラスがないって言われるのは、
きちんと大抵はCLASSPATHが通ってないか、
そんな理由ではなかったか?
0220217NGNG
>>219
どうやらそのようです。マニュアル通りにやるとDOSプロンプトから、
java -cp c:\J-PHONE-SDK\bin\jbmidp.jar;c:\J-PHONE-SDK\lib\stubclass.zip;c:\WTK104\lib\midpapi.zip com.zentek.jam.ControlPanel c:\test\test.jad
と呼ぶことに相当するようです。すると
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
と例外が多数発生。
どうやら、javaVMにクラスパスを渡すのに失敗してるようです。
javaVMのヘルプにはクラスパスは ; で区切れと書いてあるのですが。
最初は ; の前後にスペースを入れるのかと思ってましたが、
入れると不正な処理が発生(汗

結果としては
java -cp c:\J-PHONE-SDK\bin\jbmidp.jar com.zentek.jam.ControlPanel c:\test\test.jad
とやると通るようなので、そうなるようにIDEを設定したら上手くいきました。
うーむ謎だ。エミュが起動すればよいから、これで良いのですかね?
0221217NGNG
そしてIDEの設定にある、起動クラスパスとクラスパスの違いがよく分からない。
これらはIDEから使わないのか?なんで2つあるんだろう。
0222デフォルトの名無しさんNGNG
VodafoneのC4端末でPhraseデータを読み込もうと思っています。
どっかで、Phrase()のコンストラクタにbyte配列を渡すとうまくいく、とあったんだけど
できない・・

InputStream in = getClass().getResourceAsStream("/test.mmf") ;
int size = in.available();
byte[] b_data = new byte[size];
in.read( b_data, 0, b_data.length) ;
in.close() ;
Phrase p = new Phrase(b_data);

size は0が返ってきてしまう・・
それで、pはnullだと・・
どこに問題があるの?

P4端末だと「com.jblend.media.smaf.phrase」を使用して問題なく動作したんだけどな・・
0223デフォルトの名無しさんNGNG
InputStream#available()は常に0が返ってくるからだろ。
javadoc読めよ
0224222NGNG
>>223
すまん間違ってた・・

byte[] b_data = new byte[1000];
in.read(b_data, 0, b_data.length);
in.close();

Phrase p = new Phrase(b_data); <<-- ここ

ここで、Phrase:checkfailedって言われて落ちる・・

十分な長さの配列宣言してるのに。


0225デフォルトの名無しさんNGNG
>>224
0226デフォルトの名無しさんNGNG
>>224

in.readで指定したサイズ分が読めるとは限らないので
戻り値に-1が帰ってくるまで読み続けるのが良いかと。
こんな感じか?

boolean bQuit = false;
int offset = 0;
byte[] b_data = new byte[1000];
while(bQuit!=true)
{
  int readSize = in.read(b_data, offset, b_data.length);
  if(readSize == -1)
    bQuit = true;
  else
    offset += readSize;
}
in.close();
0227244NGNG
>>226 resサンキューです。

どうも、byte配列には読み込めてるみたい。
Phraseのコンストラクタに渡しているところで、データのチェックが失敗しているみたい・・
なんでだろう?
0228デフォルトの名無しさんNGNG
わろた
http://www.geocities.jp/p_java_lang/
0229デフォルトの名無しさんNGNG
>>227
読み込むファイルのサイズと、バイト配列のサイズが一緒じゃないとエラーになるぞ。
0230227NGNG
>>229
そうかと思ってやってみたんだけど、エラーになるなー。

バイナリエディタで開いてみたら、208Byteだったんで、やってみたけどダメだった・・

mmfファイルってC4端末で読めるんだよね?
0231デフォルトの名無しさんNGNG
SMAF Phraseって、.spfじゃないのか?
0232デフォルトの名無しさんNGNG
>>230
.mmfはAudio Phraseだよ

Audio Pharse再生できるのはP型以降、よってC4型では再生不可かと
0233230NGNG
231,232>>
え!?mmfってAudioPhraseなんだ!
スマン、入り口が間違ってた・・
みんなサソキュ。
0234デフォルトの名無しさんNGNG
MediaPlayerを介さずにVアプリで使える画像ってPNGの256色だけ
と理解していたのだけど違う?
フルカラーのjpgやPNGを動かしたりできるかな?
なぜか
Image img = Image.createImage("/test.jpg");
g.drawImage(img, 0, 0, Graphics.LEFT | Graphics.TOP);
とやると、P4型エミュだと画像が表示されるのだが。(WirelessToolkit だと無理
これって公式な動作?
0235デフォルトの名無しさんNGNG
初心者ですが、お願いします。m(_ _)m
ezplus(Java)で、HttpConnection (cgiファイルに対してGETリクエスト)
を利用して日本語のテキストを取得したいんですが、文字化けしてしまいます。
(通信は上手く言ってるようなのですが)

どこをいじればよいか色々調べたのですが、分からないのでどなたか教えてください。
というか、なにを調べたらいいかもよく分かりません。

推測ですが、『文字コード』という文字を解釈する約束みたいなのがあって、
その約束を上手く守れてないからでしょうか?
だとしたら、Java、cgi、どちらのコードに問題があるのでしょうか。
それとも見当ハズレの推測でしょうか?

ちなみに、英数字では思い通りの結果が得られます。
宜しくお願いいたします。m(_ _)m
0236235NGNG
それから、IEで取得した場合は正常に日本語が表示されています。

宜しくお願いします。
0237235NGNG
なんどもすいません。
CGIはパールです。
0238デフォルトの名無しさんNGNG
>>235
shift-jisしか駄目なはず。
IEでエンコードがどれになってるかを調べて、shift-jisになって
なかったらCGIが原因でしょう。
jcodeなりで変換してから出力しましょう。
0239235NGNG
>>283さん
どうもありがとうございます。

ところが
今IEで確認したのですが、
(表示)->(エンコード)
シフトJISになってました。
0240デフォルトの名無しさんNGNG
>>234
WTKはJPEG未サポートだったはず

>>235
その部分のソースコードさらしてみ?
0241デフォルトの名無しさんNGNG
俺はネットから画像(jpeg)を↓のように(途中は省く)して取得してるが。

image = Image.createImage(b_image, 0, b_image.length);

あかんのか?
0242デフォルトの名無しさんNGNG
MIDP1.0では、PNG形式をサポートしなければならない、としか決まってないと思うた。
JPEGでも動くし、動くならそれでもいいような、、、
0243デフォルトの名無しさんNGNG
出来る限り、バグの元は取っときたいので、上と掛け合ってみよう。
0244デフォルトの名無しさんNGNG
>>235
文字列化するときに、SJISを指定してる?
0245デフォルトの名無しさんNGNG
デフォルトがSJISなので無指定でもOKだった気がしないでもない
なので、変換をやってないと思われ
バイト列にSJISのデータを読み込んで、変換すればヨロシ
詳しくはCLDCのAPIマニュアルのStringクラスを参照の事
0246235NGNG
>>244さん、>>245さんありがとうございます。m(_ _)m

ご意見を参考にして必死で考えたつもりなんですが、
次のようなコードを書くことしか出来ませんでした。

//受け取った最初の文字列
String oStr;
/* oStrを受け取る処理がありますが省略 */

//Shift_JIS の文字コードのバイト配列に変換(という意味なんでしょうか?)
byte[] b = oStr.getBytes("SJIS");

//bをShift_JISコードを指定して文字列に変換
String nStr = new String(b,"SJIS");

ここまでやってみたのですが、やはり文字はほとんどが"?"(バイトをそのまま出すと"63"になりました)でした。

全く見当違いなのか、惜しいところまで行ってるのかも分かりません。
出来ましたらぜひ更なるご教授をお願いいたします。
0247235、246NGNG
ちなみに、
getByte(String)
String(byte[],String)
で、文字コードを指定する引数は以下のものを試しましたが、
”SJIS" 以外、全て UnsupportedEncodingException が返されます

"SJIS",
"Shift_JIS","EUC_JP","EUC_JP" (この3つは例外が返る)
0248デフォルトの名無しさんNGNG
あ、最後は
"EUC-JP"でした。。
0249235NGNG
>>240さんの発言を読み落としてました。あつかましいですが、さらさせていただきますm(_ _)m

1.Perl-CGIのコード : ez_sample.cgi

#!/usr/local/bin/perl

$title = "ez_sample";

&printData(); #このサブルーチンの呼び出しのみ

#表示する文字列を取得して、その長さを求める
sub printData(){
 $text = &getText();  #表示する文字列の取得
 $len = length($text); #文字列の長さ(i-mode に必要)

 print "Content-type: text/html\n";
 print "Charset: Shift_JIS\n";
 print "Content-length: $len\n";
 print "\n";
 print "$text";   #本文の出力
}

sub getText(){
 $text = "<HTML>\n<HEAD>\n\t<TITLE>$title</TITLE></HEAD>\n<BODY>\n";
 $text = $text."日本語のサンプル<br>\n";
 $text = $text."A sample in English.\n";
 $text = $text."</BODY>\n</HTML>\n";
 return $text;
}
0250235NGNG
続いて Java の該当メソッドです
test 1/4

 private boolean test(){
  System.out.println("データ受信");

  String url = "http://hpcgi2.nifty.com/zubora/ez_sample.cgi";
  HttpConnection hc = null;
  DataInputStream di = null;
  String res = null;
  byte[] bs = null;
  String newString = null;

0251デフォルトの名無しさんNGNG
  try{
   hc = (HttpConnection) Connector.open(url);
   di = new DataInputStream(hc.openInputStream());
   int ch;
   while((ch = di.read()) != -1){
    res += (char)ch;
   }
  }catch(Exception e){ }
  finally{
   try{
    if(hc != null)
     hc.close();

    if(di != null)
     di.close();
   }catch(Exception e){ }
  }
  
  System.out.println("受信直後のデータ");
  System.out.println(res);
0252235 test 3/4NGNG
  try{
   bs = res.getBytes("SJIS");
  }catch(UnsupportedEncodingException e){
   e.printStackTrace();
  }
  
  try{
   newString = new String(bs,"SJIS");
  }catch(UnsupportedEncodingException e){
   e.printStackTrace();
  }
  
  System.out.println("new String(getByte(res,\"SJIS\"),\"SJIS\")");
  System.out.println(newString);
  
  return true;
 }
■ このスレッドは過去ログ倉庫に格納されています