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;
    }

}

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

posted on 2015-07-16 13:56  晋级的巨人  阅读(143)  评论(0)    收藏  举报

导航