代码之家  ›  专栏  ›  技术社区  ›  Alin

Android声音文件未完全播放,被粗暴地打断

  •  2
  • Alin  · 技术社区  · 14 年前

    脚本

    我有一个开始让我发疯的问题。在一个活动中,我有以下场景。创建时: -创建GPS列表器 -创建位置侦听器 -启动GPS列表器和位置侦听器 -启动从web下载映射的异步任务/或从缓存加载它 -播放一个wav文件,这是一个原始资源,非常小(约63公斤),这是短,基本上它说:“让我们开始点”,它使可见的文本视图10秒。

    问题

    很少声音得到充分发挥。有时我只听到“让我们头”,有时“让我们头到明星”,有时根本没有发挥。好像有什么东西挡住了声音。我用自己的思路移动了声音,但仍然没有成功:

    代码

    private void ShowTextPlayVoice(String message, int soundResId)
        {
            txtProceed.setText(message);
            txtProceed.setVisibility(View.VISIBLE);
            final int soundId = soundResId;
    
            Handler splashHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                        switch (msg.what) {
                        case 0:
                                txtProceed.setVisibility(View.INVISIBLE);
                                break;
                        }
                        super.handleMessage(msg);
                }
            };
    
                Message msg = new Message();
                msg.what = 0;
                splashHandler.sendMessageDelayed(msg, 10000);
    
                Thread thread = new Thread() {
                    public void run() {
                        MediaPlayer mp = MediaPlayer.create(ctx, soundId);
                        mp.start();
                        mp.setOnCompletionListener(new OnCompletionListener() {
                                        public void onCompletion(MediaPlayer mp) {
                                            mp.release();
                                        }
                                    });
                    }
                };
                thread.start();
        }
    

    谢谢大家的帮助。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Alin    14 年前

    经过一些尝试,这里有一个可行的解决方案

    private MediaPlayer mediaPlayer = new MediaPlayer();
    
    private void ShowTextPlayVoice(String message, int soundResId)
        {
            txtProceed.setText(message);
            txtProceed.setVisibility(View.VISIBLE);
    
            Handler splashHandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                        switch (msg.what) {
                        case 0:
                                txtProceed.setVisibility(View.INVISIBLE);
                                break;
                        }
                        super.handleMessage(msg);
                }
            };
    
                Message msg = new Message();
                msg.what = 0;
                splashHandler.sendMessageDelayed(msg, 10000);
    
               new SoundTask().execute(soundResId);
        }
    
        protected class SoundTask extends AsyncTask<Integer, Void, Void>
        {
            @Override
            protected Void doInBackground(Integer... params) 
            {
                AssetFileDescriptor afd = ctx.getResources().openRawResourceFd(params[0]);
    
                try
                {   
                    //final MediaPlayer mediaPlayer = new MediaPlayer();
                    mediaPlayer.reset();
                    mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
                    mediaPlayer.prepare();
                    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                        public void onPrepared(MediaPlayer arg0) {
                             mediaPlayer.seekTo(0);
                             mediaPlayer.start();
                                                    });
                        }
                    });
                    afd.close();
                }
                catch (Exception e) {
                }
    
                return null;
            }
        }