第一部分在 "用户界面和多媒体"版面问题整理[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的代码在k700和6600上都没问题,在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的机器不能同时有两个midi的player在prefetch()中,即使前面那个player并没有执行start(),后面生成player都会在prefetch()和start()的时候产生上面的异常! 因为我有一个midi player一直在prefetch状态,所以新生成的midi的player都不能start(). 真是个奇怪的现象阿,在其他手机上都不会有这个问题。” ---saltedfish | |
|
| |
8 混音问题
player/mixer
关键词 | 详细描述 | |
Moto真机上如何在播放背景音乐的时候再播放音效? | “摩托罗拉V300-V500-V600同时播放音乐的讲究: 唯一支持的同步播放音乐的办法是,midi和wav声音混合播放。 即使是这样,也存在着一个限制: 应用程序必须先播放midi(可以作为背景音乐),然后再播放wav;wav文件还必须是以下的格式: 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现象 | “当一个Player被prefetched,那么其他Player也就不再能够prefetched,除非它们都是midi或都是amr。 如果你没有在start/prefetch一个Player之前把其他的Player停下来,那么你将得到一个MediaException。” -- 无名
| |
9 CustomItem问题
CustomItem/repaint/traverse
关键词 | 详细描述 | |
CustomItem的repaint | “repaint()产生重绘事件,在CustomItem里它有两个同名的方法,其中一个有四个参数,用来指定重画区的起始X、Y坐标,宽度和高度;另外一个没有参数,表示重画CustomItem的整个区域。paint()方法里的后两个参数也是宽度和高度,但是这两个方法的宽度和高度没有任何联系, paint方法里的W和H是Item内容区域的宽度和高度,并且只有这两个值大于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格式音乐,否则是没有办法的。” --二当家的
| |