Android学习之播放背景音乐

由于布局页面中只有1个Button按钮,所以此处不再提供布局代码,播放背景音乐的主要代码如下:

/*注意:

 * SoundPool仅适合用于操作短促、密集的   音效*/

package cn.eoe.playsound;



import java.io.IOException;



import android.media.AudioManager;

import android.media.MediaPlayer;

import android.media.SoundPool;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.Button;



public class MainActivity extends Activity {



    private Button btnPlaySound,btnPlaySong; 

    

    private MediaPlayer mp = null;

    

    private SoundPool sp;

    private int soundId;

    

    

    

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        

        /*获取SoundPool对象,只有在获取对象之后才能以SoundPool操作声音资源*/

        sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

        /* 使用load()方法 加载声音资源,  返回值为该声音的id

         * 必须放在onCreate()方法内部吗?

         * 此处仅证实了放在onClick方法内无法成功加载声音资源*/

        soundId = sp.load(MainActivity.this, R.raw.note1, 1);

        

        btnPlaySound = (Button) findViewById(R.id.btnPlaySound);

        btnPlaySound.setOnClickListener(new View.OnClickListener() {

            

            @Override

            public void onClick(View arg0) {



                /*SoundPool()第一个参数是声音数量

                 * 第二个参数是声音类型, 【AudioManger.具体参数】      代表了什么

                 * 第三个参数是声音的品质【一般情况下用0,那么0代表了什么】

                 *  */

                

                /*放在此处无法加载文件吗??为什么无法播放*/

//                sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);

//                soundId = sp.load(MainActivity.this, R.raw.note1, 1);

                sp.play(soundId, 1, 1, 1, 0, 2.0f);

                /* 最后一个参数rate的值为2.0f  表示这是一个浮点型的数据

                 * rete代表播放比率,取值返回在0.5--2.0   

                 * 其中:  1为正常比率(声音正常)  1以下(声音低且长) 1以上(声音高且端)*/

            }

        });

        

        btnPlaySong = (Button) findViewById(R.id.btnPlaySong);

        btnPlaySong.setOnClickListener(new View.OnClickListener() {

            

            @Override

            public void onClick(View arg0) {

                /*播放MediaPlayer加载的音频*/

//                playSong();



//                mp.start();

            

                if(mp!=null){/*为什么要在此处添加判断*/

                    mp.start();

                }

            }

        });

    }



    



    /*出错,start方法执行不到*/

//    public void playSong(){

//        if(mp == null){

//            /*获取MediaPlayer对象实例*/

//            mp = new MediaPlayer();

//            /*通过MediaPlayer提供的      静态方法create()    "装载"音频 

//             * ====需要注意的是,此处并未真正装载,

//             * 需要调用MediaPlayer对象的      prepare()方法"准备"   才是真正装载音频*/

//            mp = MediaPlayer.create(this, R.raw.song);

//            System.out.println(">>>>>>>start()方法执行了吗");

//            try {

//                /*为MediaPlayer对象装载音频*/

//                mp.prepare();

//                /* 播放:start()        暂停:pause()        停止:stop()*/

//                mp.start();

//                System.out.println(">>>>>>>start()方法执行了");

//

//            } catch (IllegalStateException e) {

//                e.printStackTrace();

//            } catch (IOException e) {

//                e.printStackTrace();

//            }

//        }

//

//    }

    

    

    @Override

    /*根据activity的生命周期来看,第一次启动时,程序会运行到onResume()方法

     *

     * 在程序进入运行状态前,加载完MediaPlayer所需的音频

     * */

    protected void onResume() {

        

        /*为什么不能加入if语句中??????????????????????????????????????

         * 加入 if语句中会出现IllegalStateException异常,这是什么异常,为什么会出现*/

//        if(mp == null){

////            mp = new MediaPlayer();

//            mp = MediaPlayer.create(this, R.raw.song);

//        }

        

        /*从if语句中提出以后,可以运行,但在logcat日志中会有警告,如何消除?/*/

        mp = MediaPlayer.create(this, R.raw.song);



        try {

            mp.prepare();

        } catch (IllegalStateException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

        }

        

        super.onResume();

    }

    

    @Override

    /*在程序暂停时,停止MediaPlayer播放的音频,并释放资源*/

    protected void onPause() {

        

        if(mp!=null){

//            mp.stop();

            mp.release();/*释放占用的资源*/

        }

        super.onPause();

    }

    

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }



}

代码中附上了小编初学时遇到的问题,供大家参考.

你可能感兴趣的:(Android学习)