1.播放audio或video通过MediaPlay提供的API

播放Audio:
- 1.播放保存在res/raw中的audio文件

MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music1);
        mediaPlayer.start();//通过create()方法创建的MediaPlay不需要Prepare
  • 2.播放远程网络提供的uri地址的audio文件
//需要有网络访问权限
String url = "http://........"; // 声音文件的远程uri地址
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepareAsync(); //可能需要很长一段时间来加载缓存文件,所以需要开一个字线程来加载
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//为设置监听事件,当异步准备加载完成后,系统会马上回调该监听时间
     @Override
     public void onPrepared(MediaPlayer mp) {
           mediaPlayer.start();
     }
});
/*Note:假如你通过一个URL以流的形式播放在线音频文件,该文件必须可以进行 
渐进式下载*/
  • 3.播放有contentResolve提供的本地的uri地址的audio文件
Uri myUri = ....; // ContentResolve提供的uri
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepareAsync(); //可能需要很长一段时间来加载缓存文件,所以需要开一个字线程来加载
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//为设置监听事件,当异步准备加载完成后,系统会马上回调该监听时间
     @Override
     public void onPrepared(MediaPlayer mp) {
           mediaPlayer.start();
     }
});

4.MediaPlay的工作流程及状态(state)及控制方法:注意状态顺序,调用方法的顺序,否则会出现IllegalStateException

MediaRecorder怎么用 media音频_MediaRecorder怎么用


5.如需播放器在后台播放,则需将MediaPlay在Service中初始化和控制

public class MyService extends Service implements MediaPlayer.OnPreparedListener {
    private static final String ACTION_PLAY = "com.example.action.PLAY";
    MediaPlayer mMediaPlayer = null;

    public int onStartCommand(Intent intent, int flags, int startId) {
        ...
        if (intent.getAction().equals(ACTION_PLAY)) {
            mMediaPlayer = ... // 初始化MediaPlay对象
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.prepareAsync(); // 异步加载audio文件以免堵塞主线程
            mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
             @Override
             public boolean onError(MediaPlayer mp, int what, int extra) {
             //当文件准备加载失败,系统回调
                return false;
            }
        });

     //以下需要申请唤醒锁权限    <uses-permission android:name="android.permission.WAKE_LOCK"/>
        //设置当系统处于闲置状态(息屏)时CPU也正常运转
         mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);

        //WifiLock,用于当系统处于闲置(息屏)状态时,WiFi也能照常链接网络
         WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        WifiManager.WifiLock wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL, "myWifiLock");
        wifiLock.acquire();
        //当不需要WiFiLock时需要释放资源 wifiLock.release();
        }
    }

    /** 设置监听当文件准备完毕系统回调该方法 */
    public void onPrepared(MediaPlayer player) {
        player.start();
    }
}
//当不需要MediaPlay时需要释放资源
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if(mediaPlayer!=null){
            mediaPlayer.release();
        }
    }
  • 6.AudioManager提供访问音量和振铃模式控制
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置声音文件有以下选择
                              //AudioManager.STREAM_MUSIC 背景音乐
                              //AudioManager.STREAM_ALARM  闹钟声音
                              //STREAM_NOTIFICATION  提示声音
                              //STREAM_RING  电话铃声
                              //STREAM_SYSTEM  系统提示声音
  • 7.MediaPlayer常用的方法:
getCurrentPosition( )://得到当前的播放位置
getDuration() ://得到文件的时间,注意需要在mediaPlayer处于PlayBack状态(在prepared状态才能调用)时调用,否则返回值为-1,
getVideoHeight() ://得到视频高度
getVideoWidth() ://得到视频宽度
isLooping()://是否循环播放
isPlaying()://是否正在播放
pause()://暂停
prepare()://准备(同步)
prepareAsync()://准备(异步)
release()://释放MediaPlayer对象
reset()://重置MediaPlayer对象
seekTo(int msec)://指定播放的位置(以毫秒为单位的时间)
setAudioStreamType(int streamtype)://指定流媒体的类型
setDisplay(SurfaceHolder sh)://设置用SurfaceHolder来显示多媒体
setLooping(boolean looping)://设置是否循环播放
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener):// 网络流媒体的缓冲监听
setOnCompletionListener(MediaPlayer.OnCompletionListener listener):// 网络流媒体播放结束监听
setOnErrorListener(MediaPlayer.OnErrorListener listener):// 设置错误信息监听
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener):// 视频尺寸监听
setScreenOnWhilePlaying(boolean screenOn):设置是否使用SurfaceHolder显示
setVolume(float leftVolume, float rightVolume)://设置音量
start()://开始播放
stop()://停止播放

/*常用回调接口*/
setOnPreparedListener(OnPreparedListener)
setOnVideoSizeChangedListener(OnVideoSizeChangedListener)
setOnSeekCompleteListener(OnSeekCompleteListener)//完成设置播放开始位置时调用
setOnCompletionListener(OnCompletionListener)//播放结束时调用
setOnBufferingUpdateListener(OnBufferingUpdateListener)//远程播放完成缓存时调用
setOnInfoListener(OnInfoListener)
setOnErrorListener(OnErrorListener)//播放时异步操作(如异步准备等)出现问题是调用,非异步的错误会抛出异常
  • 8.通过MediaPlayer来播放video文件
    8.1通过SurfaceView和MediaPlayer来video的画面
1.在xml文件中设置布局添加SurfaceView控件
    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
2.在代码中实例化
    SurfaceView surfaceView =(SurfaceView)findViewById(R.id.surfaceView);
    SurfaceHolder surfaceHolder = surfaceView.getHolder();//获得SurfaceHolder
    surfaceHolder.addCallback(new SurfaceHolder.Callback() { //为surface添加监听事件
     @Override
     public void surfaceCreated(SurfaceHolder holder) {//当surface被创建时将MediaPlayer实例化并设置参数
         mediaPlayer = MediaPlayer.create(VideoActivity.this, R.raw.easy_life);
         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置声音文件的类型
         mediaPlayer.setDisplay(holder);
            }
      @Override
      public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            }
      @Override
      public void surfaceDestroyed(SurfaceHolder holder) {
            }
        });

8.2通过VideoView来显示画面

1.在xml布局中加入VideoView控件
    <VideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
2.在代码中实例化
VideoView videoView = (VideoView)findViewByID(R.id.videoVidw);
videoView.setVideoUri(Uri.parse("android.resource://myPackageName/"+R.raw.fileName));//得到R.raw文件的Uri并设置给VideoView
//videoView.setVideoPath("absolutePath");//将文件绝对路径设置给videoView播放,需要添加后缀
videoView.start()//开始播放视频
videoView.stop()//结束播放视频


//注意通过videoView播放视频结束时不需要回收资源

通过MediaController来控制VideoView的播放

MediaRecorder怎么用 media音频_ide_02

当点击播放画面时底部会出现上图中的控件,中间三个键代码逻辑已经实现,下一个和下一个的代码逻辑需要自己完成

mediaController = new MediaController(this);
mediaController.setMediaPlayer(videoView);//mediaController和mediaPlayer需要相互设置才有效
videoView.setMediaController(mediaController);
 mediaController.setPrevNextListeners(new View.OnClickListener() {//设置上一个和下一个的逻辑
         @Override
         public void onClick(View v) {
               Toast.makeText(Second.this, "播放下一个", Toast.LENGTH_SHORT).show();
           }
        }, new View.OnClickListener() {
         @Override
         public void onClick(View v) {
                Toast.makeText(Second.this, "播放上一个", Toast.LENGTH_SHORT).show();
            }
        });

录音MediaRecorder

  • 1.通过系统内置的麦克风硬件记录声音需要显获得权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>//为危险权限需要用户授权

2.初始化MediaRecorder并设置相关属性

private void startRecord() {
        mediaRecorder = new MediaRecorder();
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置录音的来源是通过MIC
        fileName = getExternalCacheDir().getAbsolutePath();
        fileName += "/audioRecorderText.3gp";
        mediaRecorder.setOutputFile(fileName);//设置录音储存的文件绝对名
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//注意最后设置压缩格式
        try {
            mediaRecorder.prepare();//录音准备
        } catch (IOException e) {
            Log.i("wendy", "Recorder准备失败");
        }
        mediaRecorder.start();//开始录音
       /*结束时调用mediaRecorder.stop();
                 mediaRecorder.release();
                 mediaRecorder = null;
                 系统会自动将录音保存在指定绝对文件名的文件中*/
     // 暂停时调用 mediaRecorder.pause();
    }

问题描述 :

在mediaRecorder 出现illegalStateException异常

问题原因及方案:

1.mediaRecorder 不能同时启动多次,检查是不是启动了多次
2。mediaRecorder必须要在prepared准备状态下调用start