[表示 : 全て 最新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/


968 名前:デフォルトの名無しさん mailto:sage [2007/08/20(月) 21:51:34 ]
スリープ入れるとか関係ないし
あるイベントを処理してるあいだ次のイベントが飛んでこないのはあたりまえ
イベント処理の中でループしないというのが正しい方法

969 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 05:58:47 ]
SDカードへの保存について質問です。

MediaManager.getImage("www.〜〜"); で取得したMediaImageをSDカードに保存したいのですが、
StorageDevice sd = StorageDevice.getInstance("/ext0");
Folder folder = sd.getFolder((AccessToken)DoJaStorageService.getAccessToken(0, DoJaStorageService.SHARE_APPLICATION));
File file = folder.createFile("test.jpg");
FileEntity fe = file.open(File.MODE_WRITE_ONLY);
OutputStream os = fe.openOutputStream();
とし、OutputStreamを取得できるのは分かったのですが、ここへMediaImageを書き込む方法が分かりません。

writeメソッドでは、byte配列を書き込むようなのですがMediaImageをbyte配列へ変換する方法があるのでしょうか?

970 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 11:20:23 ]
>>968
まぁまぁ、知らないものはしょーがない。

>>967
processEventは大半が単一スレッドで実装されているものなので、
スリープすると他のイベント処理も一緒に停止する。
Win32の実装も同じだったと思うけど、そういうもの。
なので、根本的に作り変えないとダメ。

メインループ作るなら、IApplication#start() が別スレッドなので、
ここで無限ループ作る方法が楽だよ。
タイマーなんて不安定なもの使うより確実。

>>969
httpでダウンロードできるファイルなら、
素直にhttpConnectionでダウンロードすりゃいいんでない?
MediaImageから変換する方法が無いでも無いけど。


971 名前:970 mailto:sage [2007/08/21(火) 15:24:54 ]
970踏んだのでテンプレ更新してるんだが・・・
>>1のまとめサイトが全く更新されてないので消しても良いだろうか。
wikiさえも役に立ってねぇ


972 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 15:38:27 ]
とりあえず残しておいた(´・ω・`)
次スレ

iモード携帯電話用Java(iアプリ) Part15
ttp://pc11.2ch.net/test/read.cgi/tech/1187677946/


973 名前:デフォルトの名無しさん mailto:sage [2007/08/21(火) 23:32:06 ]
>>969
970さんが言っているように、HttpConnectionでjpgファイルをダウンロードするのが吉。
もし、どうしてもMediaImageからbyte配列にしたいんだったら、
MediaImageからgetImageでImage取り出して、それをImageEncoderにぶちこむ。
結果として得られるEncodedImageからはInputStreamが取れる。

974 名前:967 mailto:sage [2007/08/22(水) 00:48:14 ]
>>968 >>970
ありがとうございました!
根本的な作り方がよろしくないようですね。。
とは言え、なんとか自己解決しました!
解決方法はこの間のソースを例にとると…

void paint{
  メイン描画処理
}
processEvent{
  getKeypadState();で決定キー押下の場合{
    keywaitフラグが0ならばkeywaitフラグに"1"を立て、メイン処理を実行    ←追加
      分岐にて各種処理
      ※ここでfadeout()へ飛んだりする    ←移動してきた
    }
  }
  ショートタイマー{
    repaint();
    keywaitフラグが"2"の場合に"0"に戻す  ←追加
  }
  決定キーRELEASE
  keywaitフラグに"2"を立てる    ←追加
}
void fadeout(){
  forループで描画処理
}

このような感じで問題ありませんでした。多分、相当な回り道だと思いますが(笑)
これなら、ループ中にいくら連打しても"一度タイマーイベントを通らないと"次の決定キー
が有効にならないためうまくいきました。

975 名前:デフォルトの名無しさん mailto:sage [2007/08/22(水) 02:57:29 ]
>>970 >>973
ご教授ありがとうございます。
MediaImageで取るほうが楽に見えて、HttpConnection使おうとすらしていませんでしたorz
何でもやってみないとダメですね。
お手数おかけしました。

HttpConnectionで取得しようとした際に、
setRequestMethodでHttpConnection.GETを指定し、
setRequestPropertyでContent-Typeにimage/jpegを指定してconnectすると、
Illegal headerと言われてしまいうまく取得出来なかったのですが、
setRequestPropertyを消すとちゃんと取得できました。

>>973
MediaImageで取得した際の方法も教えて頂いてありがとうございます。

976 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 10:44:27 ]
umeるか



977 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:25:33 ]
うめ

978 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:35:38 ]
うめ

979 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:40:02 ]
public class ume extends Canvas{

980 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:57:04 ]
ただうめるのもつまらんな。
なんか情報残して埋めるか。

Doja5.0のエミュレータを起動する際に -u オプションを使用して
ADFへのURLを設定する際、そのURLが有効でないと起動時に落ちる


981 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 11:58:16 ]
Doja5.0のVer3.0.0のエミュレータはコマンドプロンプトから
起動した場合、DOS画面にSystem.out.printlnの出力を吐き出さないため
デバッグ情報が見れない。
なおVer2.0.0以前なら見れる。


982 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:40:48 ]
んじゃ俺も。

processEventのトラブル多いので、Canvas継承クラス貼り付け。
見た目の都合、全角スペースを沢山含んでいるので要削除。
多少問題もあるけどそこそこ動くと思う。
有識者の方適当に修正よろ。


983 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:44:04 ]
class appMain extends Canvas {
  private int  keyDown; // キーが押された瞬間にビットが立つ
  private int  keyArea; // キーが押されっぱなしならビットが立つ
  private int  keyUp;  // キーが上がった瞬間にビットが立つ

  public appMain() {  // コンストラクタ。お好きにどーぞ
  }

  // TODO IApplication#start()で以下を呼ぶ
  public void appStart() {
    try {
      while(true) {
        keyUp = keyArea;
        keyArea = keyDown | getKeypadState();
        keyUp = keyUp & (~keyArea);

        mainLoop();

        keyDown = 0;
        paint(getGraphics());

        Thread.slepp(100);  // 好きな時間で調節
      }
    }catch(Exception e){
      // TODO 強制終了前に何か一言
    }
  }


984 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 12:46:15 ]
  public void paint(Graphics g){
    // TODO 描画処理
  }

  public synchronized void processEvent(int type, int param) {
    if (type == Display.KEY_PRESSED_EVENT ){
      keyDown |= 1 << param;
    }
  }

  public void mainLoop() {
    // TODO キーイベント処理など。以下例
    if(keyUp & (1<<Display.KEY_UP) != 0 ) {
      // 上キーが上がった
    }
  }
}

今使ってるものからかなりいじってたんで、
コンパイル通らなかったらゴメンナサイ。


985 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 13:19:27 ]
ファイル名を指定してリソースを読み込むメソッド

byte[] loadResFile(String file) {
  byte[] b = null;
  
  DataInputStream dis = null;
  ByteArrayOutputStream out = null;
  try {
    dis = Connector.openDataInputStream("resource:///" + file);
    byte[] buf = new byte[10 * 1024];
    out = new ByteArrayOutputStream(buf.length);
    int ret;
    while ((ret = dis.read(buf)) != -1) {
      out.write(buf, 0, ret);
    }
    b = out.toByteArray();
  } catch (Exception e) {
  } finally {
    try {
      out.close();
    } catch (Exception e) {
    }
    try {
      dis.close();
    } catch (Exception e) {
    }
  }

  return b;
}

986 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 13:38:54 ]
スクラッチパッドの番号を指定してそのデータを全て読み込むメソッド

byte[] loadScratchpad(int num) {
  byte[] b = null;
  int size = 0;
  try {
    DataInputStream dis = Connector.openDataInputStream("scratchpad:///" + num);
    int ret;
    while ((ret = (int)dis.skip(100 * 1024)) > 0) {
      size += ret;
    }
    dis.close();

    b = new byte[size];
    dis = Connector.openDataInputStream("scratchpad:///" + num);
    dis.read(b, 0, size);
    dis.close();
  } catch (Exception e) {
    try {
      dis.close();
    } catch (Exception e2) {
    }
    return null;
  }

  return b;
}




987 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:27:35 ]
/**
Jarファイルからの画像のロード
@param fname ファイル名
@return Image 失敗の場合はnull
*/
private Image LoadImage( String fname )
{
Image img = null;

//バイナリデータのロード
try{
//Jarサイズの取得
DataInputStream din = Connector.openDataInputStream( "scratchpad:///0;pos=" + OFFSET_JAR_SIZE );
int size = din.readInt();
din.close();
//JarInflaterの取得
din = Connector.openDataInputStream( "scratchpad:///0;pos=" + OFFSET_JAR_DATA + ",length=" + size );
JarInflater ji = new JarInflater( din );

//画像の読み込み
MediaImage mi = MediaManager.getImage( ji.getInputStream( fname ) );
mi.use();
img = mi.getImage();

ji.close();
din.close();
}
catch( IOException e ){ DBGPRINTF( "Load " + e ); }
catch( Exception e ){ DBGPRINTF( "Load " + e ); }
return img;
}


988 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:52:44 ]
>>985
動かしてないけど・・・10KBまでしか読めない?


989 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 14:54:01 ]
ごめん、気のせいだった。
10KB単位で読み込むのね、りょーかい。


990 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:35:14 ]
FPSを保つコード需要ある?

991 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:41:04 ]
張っておけば喜ぶ人もいるんじゃない?


992 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 15:44:47 ]
ある
つか急激に良スレ化

993 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:00:01 ]
えらそうなこといってあれなんだが、実機ではいまいち正確に保ってくれないんだ
まぁ一応置いておく、誰か改変きぼう

public class FPS {

private static final int FLAMERATE = 30; //フレームレート。
private static final int FLAMETIME = 1000 / FLAMERATE; //1周期あたりの_秒

private boolean isFix; // FPSを固定するか
private long oldTime; // 一つ前の時間(Control)
private long beforeTime; // 一つ前の時間(Draw)
private long fpsCount; // 計測用FPS
private long fps; // 表示用FPS(1秒に一度更新)

FPS()
{
isFix = true;
beforeTime = 0;
oldTime = 0;
}



994 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:00:34 ]
あ、コンパイル通らねぇw

>>984
× if(keyUp & (1<<Display.KEY_UP) != 0 ) {
○ if((keyUp & (1<<Display.KEY_UP)) != 0 ) {

他にもありそうだなぁ(=´∇`=)

で、残り7レス。


995 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:01:09 ]
続き

/**
* スレッドのループ内に置くとFLAMERATEを調整してくれる
*
*/
public void control()
{
if(!isFix) return;

long nowTime = System.currentTimeMillis(); //経過時間。

long difTime = nowTime - oldTime;

if( difTime >= FLAMETIME ) //時間が余っている場合。
{
oldTime = nowTime;
return;
}

difTime = FLAMETIME - difTime;

//余り時間分待つ。
try
{
Thread.sleep( difTime );
}
catch( Exception e ){};

oldTime = oldTime + FLAMETIME;
}

996 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:01:43 ]
ラスト
/**
* FPSを計測して描画する
*
*/
public void draw(Graphics g)
{
long time = System.currentTimeMillis();

// FPS の計測
if(time - beforeTime >= 1000)
{
// 1秒経ったところで表示用のFPSに代入
fps = fpsCount;

// 初期化
beforeTime = time;
fpsCount = 0;
}
fpsCount++;

g.drawString("FPS:" + fps, 5, 15);
}
}




997 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:04:54 ]
余り時間計測する前に
Thread.yield();
を呼んで、他のスレッドの処理を入れてやるのが吉

998 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:09:24 ]
さぁうめるざますよ!

999 名前:345 mailto:sage [2007/08/24(金) 16:17:39 ]
>>993
こんな感じでメインループを空回ししてフレーム固定させてる。
ダイアログ出したりサスペンドの処理は長くなるので割愛。
  public void appStart(){
    long bt = System.currentTimeMillis();  // 処理基準時間
    long nt = 0;   // 次に処理する時間
    long t, ct = 1;
    while( true ){
      t = System.currentTimeMillis() - bt;
      if( nt > t){
        try{
          Thread.sleep( 1 );
        } catch( Exception e){}
        continue;
      }
      // スキップしたフレーム数分メインループを回す
      for(int i = (int)(( t - nt ) * FLAMERATE / 1000); i >= 0; i--)
      {
        keyUp = keyArea;
        keyArea = keyDown | this.getKeypadState();
        keyUp = keyUp & (~keyArea);
        mainLoop();
        ct++;
        keyDown = 0;
      }
      nt = ct * 1000L / FLAMERATE;
      paint( getGraphics() );
    }
  }


1000 名前:デフォルトの名無しさん mailto:sage [2007/08/24(金) 16:18:51 ]
345って・・・orz
983でした。ってことで1000


1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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