0

我在启动屏幕上为我的应用程序添加了一个 5 秒的声音 mp3,但在加载应用程序时播放会波动,我需要做什么才能流畅播放?

public class Splash extends Activity{
    MediaPlayer ourSong;
    @Override
    protected void onCreate(Bundle TravisLoveBacon) {
        // TODO Auto-generated method stub
        super.onCreate(TravisLoveBacon);
        setContentView(R.layout.splash);
        ourSong = MediaPlayer.create(Splash.this, R.raw.onkar);
        ourSong.start();
        Thread timer = new Thread(){
            public void run(){
                try{
                    sleep(4000);
                } catch (InterruptedException e){
                    e.printStackTrace();
                }finally{
                    Intent openStartingPoint = new Intent("com.sport.sport.MAINLAUNCHER2");
                    startActivity(openStartingPoint);
                }
            }
        };
        timer.start();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        ourSong.release();
        finish();
    }
}
4

2 回答 2

1

您需要做什么才能流畅播放?更多 CPU,尤其是在 UI-Thread 中。(好吧,开个玩笑:-)

您可以SoundPool在播放前使用和预加载歌曲。SoundPool 专为游戏等中的短声音而设计。

这是加载播放音乐的最短代码。记得在AsyncTask. 启动可能需要半秒钟,但随后运行没有问题。

SoundPool soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
    @Override
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
        if(status == 0) soundPool.play(sampleId, 1f, 1f, Integer.MAX_VALUE, 0, 1f);
    }
});
try {
    soundId = soundPool.load(getAssets().openFd(file), 1);
} catch (IOException e) {
    Log.e("TAG", e.getMessage(), e);
    return;
}

它至少需要 API 级别 8 并使用音量播放音乐。

我在您的代码中看到的另外两件事:

  • 无论是 SoundPool 还是媒体播放器。您应该在后台运行声音播放部分。
  • 你是怎么startActivity在另一个线程中做到的???那部分不应该工作。
于 2013-10-02T11:09:54.307 回答
0

这是我如何构建一个带有一些声音的启动画面。

它变得很长,所以让我对此发表一些评论。

  • 因为它太长了我已经把它变成了一个新的答案
  • 由于加载和播放声音仍然是异步的,因此您的 Splash 屏幕可能会闪烁,并且下一个 Activity 将立即启动。在这种情况下,您必须使用 Java-Lock,例如Semaphore您设置的 a 和aquireindoInBackground以及您release()onLoadComplete().

就是这样。尚未对其进行大量测试,但希望您可以使用它作为起点:

public class Splash extends Activity {
@Override
protected void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    setContentView(R.layout.splash);
    /*
     * I would finish here, to give
     * Android some time for layout
     * and other things
     */
}

/* (non-Javadoc)
 * @see android.app.Activity#onResume()
 */
@Override
protected void onResume() {
    super.onResume();

    /*
     * Now start background task
     * There was a discussion about
     * Splash screen some time ago.
     * Especially when you should do the
     * startActivity and what flags you
     * should use in the Intent.
     */

    // Start playing sound asynchronously
    // R.raw.onkar
    new AsyncTask<Void, Void, Void>() {
        private SoundPool soundPool = new SoundPool(
                1, AudioManager.STREAM_MUSIC, 0);

        @Override
        protected Void doInBackground(Void... params) {
            // Put in here the code I've already posted!
            return null;
        }

        /* (non-Javadoc)
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            soundPool.release();

            Intent openStartingPoint = new Intent(
                    "com.sport.sport.MAINLAUNCHER2");
            startActivity(openStartingPoint);
            /*
             * Actually, you can start the next activity here
             * or from onResume method with postDelayed(...)
             * This way here ensures that the Activity is
             * started right after the sound was played.
             */
        }
    }.execute((Void) null);
}
}
于 2013-10-02T13:52:38.873 回答