文章目錄
- MediaPlayer類
- 播放音頻的實例
- VideoView類
- 播放視頻的實例
MediaPlayer類
對多種格式的音頻文件提供了全面的控制方法:
如何獲得MediaPlayer實例?
- 通過構造函數:
MediaPlayer mp = new MediaPlayer();
- 調用 MediaPlayer.create() 方法:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);
由于 create
方法內會調用 setDataSource
和 prepare
,因此后續無需再進行這兩個的步驟:
如何設置要播放的文件?
MediaPlayer 要播放的文件主要包括3個來源:
- 應用中的 resource 資源:
// 放在程序res/raw目錄下名為的test文件
MediaPlayer.create(this, R.raw.test);
- 存儲在SD卡或其他文件路徑下的媒體文件
// 通過Environment.getExternalStorageDirectory()獲得sd卡路徑
// mediaPlayer.setDataSource(Environment.getExternalStorageDirectory(), "music.mp3");
mp.setDataSource("/sdcard/test.mp3");
// 然后需要將MediaPlayer置為prepare狀態
mp.prepare();
- 網絡上的媒體文件,流程同上,只是
setDataSource
參數為網上資源的Uri
。
重要的控制方法
- seekTo(): 定位方法,該方法是個異步方法,返回時并不意味著定位完成,尤其是播放的網絡文件。真正定位完成時會觸發
OnSeekComplete.onSeekComplete()
,如果需要可以調用setOnSeekCompleteListener(OnSeekCompleteListener)
設置監聽器來處理的。 - prepareAsync() : 異步方式設置播放器進入
prepare
狀態。
播放音頻的實例
布局文件 audio_layout.xml
:
活動文件:
public class AudioActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "AudioActivity";private MediaPlayer mediaPlayer;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.audio_layout);Button button_play = findViewById(R.id.button_play);Button button_pause = findViewById(R.id.button_pause);Button button_stop = findViewById(R.id.button_stop);button_play.setOnClickListener(this);button_pause.setOnClickListener(this);button_stop.setOnClickListener(this);// 權限申請// 相等說明用戶已授權,不等說明未授權if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){// 申請授權ActivityCompat.requestPermissions(this,new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);} else {initMediaPlayer(); // 初始化MediaPlayer}}private void initMediaPlayer() {mediaPlayer = MediaPlayer.create(this, R.raw.shan_gui);}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_play:if(!mediaPlayer.isPlaying()){mediaPlayer.start();Log.e(TAG, "點擊play");}break;case R.id.button_pause:if(mediaPlayer.isPlaying()){mediaPlayer.pause();Log.e(TAG, "點擊pause");}break;case R.id.button_stop:if(mediaPlayer.isPlaying()){mediaPlayer.reset();// reset方法中會調用close、clear方法將MediaPlayer的資源進行清除// 因此需要重新初始化MediaPlayerinitMediaPlayer();Log.e(TAG, "點擊stop");}break;}}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {switch (requestCode){case 1:if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){initMediaPlayer();}else{Toast.makeText(this, "拒絕權限將無法使用程序", Toast.LENGTH_LONG).show();finish();}break;}}@Overrideprotected void onDestroy() {super.onDestroy();if(mediaPlayer != null){mediaPlayer.stop();mediaPlayer.release();mediaPlayer = null;}}
}
VideoView類
常用方法有:
播放視頻的實例
布局文件 video_layout.xml
:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><Buttonandroid:id="@+id/button_vPlay"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video play"/><Buttonandroid:id="@+id/button_vPause"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video pause"/><Buttonandroid:id="@+id/button_vReplay"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:text="video replay"/></LinearLayout><VideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="wrap_content"/>
</LinearLayout>
- 三個按鈕分別起到:播放、暫停、重置為視頻開頭的功能
VideoView
用以顯示視頻。
活動文件:
public class VideoActivity extends AppCompatActivity implements View.OnClickListener {private static final String TAG = "VideoActivity";private VideoView videoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.video_layout);videoView = findViewById(R.id.video_view);Button button_vPlay = findViewById(R.id.button_vPlay);Button button_vPause = findViewById(R.id.button_vPause);Button button_vReplay = findViewById(R.id.button_vReplay);button_vPlay.setOnClickListener(this);button_vPause.setOnClickListener(this);button_vReplay.setOnClickListener(this);if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1);}else {initVideoPath(); // 初始化VideoViewLog.e(TAG, "onCreate: initVideoPath over");}}private void initVideoPath() {Uri uri = Uri.parse("android.resource://"+getPackageName()+ "/"+R.raw.qinqin);videoView.setVideoURI(uri);Log.e(TAG, "initVideoPath: "+uri);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {switch (requestCode){case 1:if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){initVideoPath();}else{Toast.makeText(this, "拒絕授權則無法使用本APP", Toast.LENGTH_LONG).show();finish();}break;}}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_vPlay:if(!videoView.isPlaying()){videoView.start();}break;case R.id.button_vPause:if(videoView.isPlaying()){videoView.pause();}break;case R.id.button_vReplay:if(videoView.isPlaying()){videoView.resume();}break;}}@Overrideprotected void onDestroy() {super.onDestroy();if(videoView != null){videoView.suspend(); // 釋放資源}}
}