0

アプリのスプラッシュ スクリーンに 5 秒のサウンド mp3 を 1 つ追加しましたが、アプリの読み込み中に再生が変動します。スムーズに再生するにはどうすればよいですか??

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

スムーズなプレイのために何をする必要がありますか? 特に UI スレッドでの CPU の増加。(わかりました、冗談です:-)

再生する前に、曲を使用SoundPoolしてプリロードできます。SoundPool は、特にゲームなどの短いサウンド用に作られています。

これは、音楽を再生するための最短のコードです。で実行することを忘れないでくださいAsyncTask。起動に0.5秒かかる場合がありますが、問題なく動作します。

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 が必要で、音楽用のボリュームを使用します。

あなたのコードに見られる他の2つのこと:

  • それがSoundPoolであろうとメディアプレーヤーであろうと関係ありません。バックグラウンドでサウンド再生部分を実行する必要があります。
  • startActivity別のスレッドでそれをどのように行いましたか??? その部分は機能しないはずです。
于 2013-10-02T11:09:54.307 に答える
0

サウンド付きのスプラッシュ スクリーンを作成する方法を次に示します。

かなり長くなってしまったので、少し補足させてください。

  • 長いので、新しい回答に入れました
  • サウンドの読み込みと再生はまだ非同期であるため、スプラッシュ画面が点滅し、次のアクティビティがすぐに開始される可能性があります。この場合、 のように Java-Lock を使用する必要がありSemaphoreます。aquiredoInBackgroundrelease()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 に答える