"用户界面和多媒体"版面问题[二][j2medev][0406更新]

第一部分在 "用户界面和多媒体"版面问题整理[j2medev.com][不断更新中]。下面是后续更新的部分。

全部目录为:

1 全屏问题
2 Image和ByteArray转换问题
3 getRGB问题
4 字符串换行问题
5 字体问题
6 重新播放音乐问题
7 MediaException问题
8 混音问题
9 CustomItem问题
10 Nokia播放Tone音乐问题

6 重新播放音乐问题

 

player/stop/start

关键词

详细描述

音乐停止播放后如何从起始位置重新播放?

“如果你的音乐自己播放完毕了,而用户手动提交命令要求重新播放,那么你可以直接调用player.play()即可。或者一开始播放音乐的时候就利用player.setLoopCount设定循环播放次数。

 

如果你希望音乐自动重新播放,那么就必须实现“播放器状态更新事件”:

以下内容为程序代码:

// 绑定状态更新事件过程

player.addPlayerListener(this);

 

/*

 * 本类实现了PlayerListener接口。通过这个事件来告知媒体已经播放完毕

 */

public void playerUpdate(Player player, String event, Object data){

       System.out.println("Enter playerUpdate>>" +

                     event);

      

       if(event == PlayerListener.END_OF_MEDIA){

              try{

                     ....                       

              }catch(Exception e){

                     e.printStackTrace();

              }

       }

       else if(event == PlayerListener.STOPPED)

       {

              System.out.println("playerUpdate>>PlayerListener.STOPPED");

       }

       else if(event == PlayerListener.STARTED)

       {

              System.out.println("playerUpdate>>PlayerListener.STARTED");

       }

}

--- zhengyun

 

SonyEricsson

K750手机上无法实现暂停,续播功能?

“发觉在索爱K750手机上无法实现暂停,续播功能。该功能在MOTO,NOKIA手机上可以使用。”

--trysunset

 

 

7 MediaException问题

 

player/stop/start

关键词

详细描述

播放MIDI时,真机上会爆出MediaException

异常,而在其他机器上可正常播放MIDI?

“is = getClass().getResourceAsStream("/title.mid");

 

if (is != null)

{

 player_ = Manager.createPlayer(is, "audio/midi");

    player_.setLoopCount(-1);

    player_.start();

}

这个代码是我用来监测一款机器用的,在播放MIDI时,其真机上会爆出MediaException异常,而在其他机器上可正常播放MIDI

有意思的是这个代码用来播放WAV则是正常的,由于该PDA机自带播放器,我将MIDI直接传入其中播放时可以播放的,所以应该不会有MIDI格式不兼容的问题!

--- imtrash

 

虚拟机不支持MIDI的播放!  我用过的NOKIA6630的手机就是这样的!

--- zgly

 

你可以将虚拟机可以播放的音乐类型用下面的代码

   public void showForm() {

        String[]  protocols, contentTypes;

 

        protocols = Manager.getSupportedProtocols(null);

        for (int i = 0; i < protocols.length; i++) {

            contentTypes

= Manager.getSupportedContentTypes(

protocols[i]);

            for (int j = 0; j < contentTypes.length; j++) {

                m_errForm.append(protocols[i] + ":" + contentTypes[j]); 

            }

        }

    }

将信息显示在一个FORM里!

--- zgly

 

必须明确的一点是,我们的MIDlet是运行在Java ME平台环境下的。  不一定设备提供的功能在Java ME平台都得到了实现!

--- mingjava

 

在真机测试中,

Nokia7610弹出一个错误:

javax.

microedition.

media.

MediaException: -18

“很明显是nokia 7610上不支持这种媒体格式设置media time,所以抛出了MediaException

p.setMediaTime(5 * SECS_TO_MICROSECS);删除即可”

-- mingjava

 

error opening MIDI/tone device”或“fail in writing data to native”?

“播放MIDI的代码在k7006600上都没问题,在moto上不知道怎么回事却报如下异常:

javax.microedition.media.MediaException:

fail in writing data to native

e680i的模拟器仍然会报错,

不过报出来的是:

javax.microedition.media.MediaException:

error opening MIDI/tone device

        at com.sun.mmedia.MIDIPlayer.doPrefetch(+19)

        at com.sun.mmedia.BasicPlayer.prefetch(+34)

最后找到原因了,moto的机器不能同时有两个midiplayerprefetch()中,即使前面那个player并没有执行start(),后面生成player都会在prefetch()start()的时候产生上面的异常!

因为我有一个midi player一直在prefetch状态,所以新生成的midiplayer都不能start().

真是个奇怪的现象阿,在其他手机上都不会有这个问题。”

---saltedfish

 

 

 

8 混音问题

 

player/mixer

关键词

详细描述

Moto真机上如何在播放背景音乐的时候再播放音效?

“摩托罗拉V300-V500-V600同时播放音乐的讲究:

唯一支持的同步播放音乐的办法是,midiwav声音混合播放。

即使是这样,也存在着一个限制:

应用程序必须先播放midi(可以作为背景音乐),然后再播放wavwav文件还必须是以下的格式:

PCM 8000KHZ

8Bit

Mono

除了上面这种方法,只要是一个新的media被播放,上一个Player必须被停止而且释放资源。”

--moto文档

 

MOTO系列手机中JAVA程序播放一个声音文件比较简单,但是用于交互式音效时就有问题了。

根据MOTO的一些资料显示,在MOTO手机中播放声音有下面几条约束:

1、除了同时播放一个MIDI和一个WAV以外,MOTO手机无法同时播放多个声音,而且必须是先播放MIDI然后播放WAV

2、除了MIDI或音阶序列以外,不能同时实现player的多个实例进入prefetched状态(预读取声音流);

3、播放新的声音之前,前一个player必须停止并释放资源(stop();deallocate())。

如果你遇到以下问题,可以试试我的解决方法:

1)只能播一次,或几次,接着就无法发出声音;

2)播放新的声音时,总是会多播放一次前一个声音。”

---linchangyu

nokia6230i上的MediaException现象

“当一个Playerprefetched,那么其他Player也就不再能够prefetched,除非它们都是midi或都是amr

如果你没有在start/prefetch一个Player之前把其他的Player停下来,那么你将得到一个MediaException。”

-- 无名

 

 

9 CustomItem问题

 

CustomItem/repaint/traverse

关键词

详细描述

CustomItemrepaint

repaint()产生重绘事件,在CustomItem里它有两个同名的方法,其中一个有四个参数,用来指定重画区的起始XY坐标,宽度和高度;另外一个没有参数,表示重画CustomItem的整个区域。paint()方法里的后两个参数也是宽度和高度,但是这两个方法的宽度和高度没有任何联系, paint方法里的WHItem内容区域的宽度和高度,并且只有这两个值大于0时,paint()方法才会被调用。”

--mydeman

 

repaint()被调用之后会立刻返回,而调用paint()回调函数的工作会有另外一个专门处理UI的线程来完成。因此如果希望得到paint()方法完成后再返回,那么就可以在repaint()之后立刻调用serviceRepaint(),来强制队列中重绘事件快点完成。”

--- mydeman

CustomItem上处理过左右上下方向键

“由于我的CustomItem控件和一个Gauge控件同处于一个Form上,所以按上下左右键的时候,实际上被Form处理了,Form就认为上下左右键是在切换控件的焦点,而不会把这个按键事件传给我的CustomItem了。也就是说,我的写法一样不会得到上下左右键的按键事件。”

-- zhengyun

 

“一部手机是否实际支持CustomItem internal traversal,需要向getInteractionModes()方法查询才可知道,因为这是隐含的策略,并不是一定的。听说,在Nokia真机上,traverse好像并不好使用。

在我这里,这段代码在模拟器上能够使用,在真机上我不敢保证:

 

以下内容为程序代码:

     protected boolean traverse(int dir,int viewportWidth,

    int viewportHeight,int visRect_inout[])

  {

          System.out.println("Enter traverse");

 

         if(dir == Canvas.UP){

       System.out.println("traverse>>Press Up key!");

              return true;

          }else if(dir == Canvas.DOWN){

     System.out.println("traverse>>Press Down key!");

              return true;

          }else if(dir == NONE){

     System.out.println("traverse>>Press None key!");

              return true;

          }

 

          return false;

  }

     protected void traverseOut(){

         System.out.println("Enter traverse out");

     }

-- zhengyun

 

protected boolean traverse(int dir, int viewportWidth, int viewportHeight,   int[] visRect_inout) {

 

  switch (dir) {

  case Canvas.DOWN:

   if (location == UPPER) {

    location = IN;

   } else {

    repaint();

    location = LOWER;

    return false;

   }

   break;

 

  case Canvas.UP:

   if (location == LOWER) {

    location = IN;

   } else {

    repaint();

    location = UPPER;

    return false;

   }

   break;

 

  case Canvas.LEFT:

   System.out.println("LEFT");

   break;

  case Canvas.RIGHT:

   System.out.println("RIGHT");

   break;

  }

  return true;

}

实际上在FORM里的左右键事件,也被用来处理焦点,只不过在CUSTOM ITEM里左右键没有响应,用上下键来处理焦点事件了。”

---hebaochen

     

 

10 Nokia播放Tone音乐问题

 

Sound/

关键词

详细描述

按键,音乐被中断

“在Nokia 3650,7650上使用Tone播放声音,如果用户一按键,那么音乐马上被中断。这个问题是已经在Nokia官方开发论坛上得到确认。是Symbian 6.0系统上的一个bug,Symbian 7.0系统的手机(Nokia 7610,6600)上没有这个问题,Nokia 40上也没有这个问题。

解决之道:这是系统的bug,只有使用其它方式的音乐播放,比如midi格式音乐,否则是没有办法的。”

--二当家的

 

 

 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=652715


你可能感兴趣的:(j2me)