我正在研究J2ME应用程序 我正在使用诺基亚6131 NFC手机。我正在使用NetBeans IDE 我有4种表格,我在填写表格时正在为用户播放一些通知声音。
问题是声音在3到4分钟后突然响起,唯一的解决方法是退出应用程序并再次打开它。
我的代码
public void playSoundOK()
{
try
{
InputStream is = getClass().getResourceAsStream("/OK.wav");
Player player = Manager.createPlayer(is,"audio/X-wav");
player.realize();
player.prefetch();
player.start();
}
catch(Exception e)
{
e.printStackTrace();
}
}
异常
at com.nokia.mid.impl.isa.mmedia.audio.AudioOutImpl.openSession(AudioOutImpl.java:206)
at com.nokia.mid.impl.isa.mmedia.MediaOut.openDataSession(MediaOut.java:282)
at com.nokia.mid.impl.isa.mmedia.MediaPlayer.doPrefetch(MediaPlayer.java:155)
at com.nokia.mid.impl.isa.amms.audio.AdvancedSampledPlayer.doPrefetch(+4)
at com.nokia.mid.impl.isa.mmedia.BasicPlayer.prefetch(BasicPlayer.java:409)
at org.ird.epi.ui.UtilityClass.playSoundOK(UtilityClass.java:139)
at org.ird.epi.ui.EnrollmentForm.targetDetected(+695)
at javax.microedition.contactless.DiscoveryManager.notifyTargetListeners(DiscoveryManager.java : 700)
at javax.microedition.contactless.DiscoveryManager.access$1200(DiscoveryManager.java:103)
at javax.microedition.contactless.DiscoveryManager$Discoverer.notifyIndication(DiscoveryManager.java:882)
at com.nokia.mid.impl.isa.io.protocol.external.nfc.isi.NFCConnectionHandler$IndicationNotifier.run(+67) javax.microedition.media.MediaException: AUD
答案 0 :(得分:2)
我建议你将NFC和音频播放分成两个不同的线程。
从API回调(如targetDetected)内部调用一个需要一些时间来完成(如预取)的方法通常是一个坏主意,因为它会让你依赖于一种特别强大的内部线程模型,实际上存在于手机的MIDP实现中。
您应该有一个主题,其唯一目的是播放应用程序可以发出的声音。使用NFC回调发送非阻塞命令来播放声音(通常使用对命令队列的同步访问)。音频播放线程可以决定忽略命令,如果它们是在忙于播放声音时发出的(通知用户多个同时发生的NFC联系人没有意义)
答案 1 :(得分:2)
你应该关闭你的播放器。将以下代码添加到您的方法中:
PlayerListener listener = new PlayerListener() { public void playerUpdate(Player player, String event, Object eventData) { if (PlayerListener.END_OF_MEDIA.equals(event)) { player.close(); } } }; player.addPlayerListener(listener);