SurfaceView和Mediaplayer實現播放網路和本地視訊 一
阿新 • • 發佈:2019-01-06
程式碼是最好的老師!!直接上程式碼
package com.example.yaoan.surfaceviewtest;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import java.io.File;
import java.io.IOException;
/*
*
*1.VideoView本身就是對SurfaceView和MediaPlayer做了一個封裝
*2.實現視訊列表播放
*
* 如果讀取本地檔案,和網路的話 需要新增許可權
*
* */
public class MainActivity extends AppCompatActivity {
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
//讀取本地檔案
private File file=new File("/storage/sdcard1/音樂/", "曾經的你.mp4");
//訪問網路視訊
private String uri="http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com /D046015255134077DDB3ACA0D7E68D45.flv";
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = (SurfaceView) findViewById(R.id.surfaceView);
mediaPlayer = new MediaPlayer();
//獲取SurfaceHolder 可以通過該介面來操作SurfaceView中的Surface
SurfaceHolder surfaceHolder = surfaceView.getHolder();
//設定Meiaplayer的準備監聽
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//準備完成後播放
mediaPlayer.start();
}
});
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
//當SurfaceView中Surface建立時回掉
//該方法表示Surface已經建立完成,可以在該方法中進行繪圖操作
@Override
public void surfaceCreated(SurfaceHolder holder) {
mediaPlayer.reset();
try {
//設定視屏檔案影象的顯示引數
mediaPlayer.setDisplay(holder);
//file.getAbsolutePath()本地視訊
//uri 網路視訊
mediaPlayer.setDataSource(MainActivity.this, Uri.parse(uri));
//prepare();表示準備工作同步進行,(準備工作在UI執行緒中進行)
//當播放網路視訊時,如果網路不要 會報ARN 所以不採用該方法
//mediaPlayer.prepare();
//非同步準備 準備工作在子執行緒中進行 當播放網路視訊時候一般採用此方法
mediaPlayer.prepareAsync();
} catch (IOException e) {
e.printStackTrace();
}
}
//當SurfaceView的大小發生改變時候觸發該方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
//Surface銷燬時回掉
//當Surface銷燬時候,同時把MediaPlayer也銷燬
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mediaPlayer!=null) {
mediaPlayer.stop();
//釋放資源
mediaPlayer.release();
}
}
});
//設定 surfaceView點選監聽
surfaceView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
} else {
mediaPlayer.start();
}
break;
}
//返回True代表事件已經處理了
return true;
}
});
}
}
xml佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.yaoan.surfaceviewtest.MainActivity">
<!--第一步 在佈局檔案中新增SurfaceView控制元件-->
<SurfaceView
android:layout_centerInParent="true"
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/surfaceView" />
</RelativeLayout>
涉及到播放視訊更多內容:
新增自定義控制欄:點選檢視
新增緩衝資訊:點選檢視