第一部分在 "用户界面和多媒体"版面问题整理[j2medev.com][不断更新中]。下面是后续更新的部分。
全部目录为:
1 全屏问题
2 Image和ByteArray转换问题
3 getRGB问题
4 字符串换行问题
5 字体问题
6 重新播放音乐问题
7 MediaException问题
8 混音问题
9 CustomItem问题
10 Nokia播放Tone音乐问题
关键词
|
详细描述
|
|
音乐停止播放后如何从起始位置重新播放?
|
“如果你的音乐自己播放完毕了,而用户手动提交命令要求重新播放,那么你可以直接调用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
|
|
关键词
|
详细描述
|
|
播放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
|
|
|
|
|
关键词
|
详细描述
|
|
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。”
-- 无名
|
|
关键词
|
详细描述
|
|
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
|
|
关键词
|
详细描述
|
|
按键,音乐被中断
|
“在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