美文网首页
Android视频播放:SurfaceView+MediaPla

Android视频播放:SurfaceView+MediaPla

作者: 残非 | 来源:发表于2019-11-03 10:12 被阅读0次

首先是添加权限

<uses-permission
    android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.WRITE_APN_SETTINGS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Xml布局的规划

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">

<SurfaceView
    android:id="@+id/surfaceView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
<LinearLayout
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/biaoti"
        android:textColor="@color/colorAccent"
        android:textSize="20sp"
        android:text="<     视频播放"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
    android:id="@+id/imageView"
    android:layout_centerInParent="true"
    android:src="@mipmap/ic_launcher"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
<LinearLayout
    android:id="@+id/linear"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:orientation="horizontal">

    <Button
        android:id="@+id/play"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="play" />

    <Button
        android:id="@+id/pasue"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="pasue" />

    <Button
        android:id="@+id/stop"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="stop" />

</LinearLayout>
<SeekBar
    android:layout_above="@id/linear"
    android:id="@+id/seekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>

定义一个MyClickListener.java,用来对控件的点击和双击的判断和使用

public class MyClickListener implements View.OnTouchListener {
private static int timeout=400;//双击间四百毫秒延时
private int clickCount = 0;//记录连续点击次数
private Handler handler;
private MyClickCallBack myClickCallBack;

public interface MyClickCallBack{
    void oneclick();//点击一次
    void doubleClick();//点击两次
}
public MyClickListener(MyClickCallBack myClickCallBack){
    this.myClickCallBack=myClickCallBack;
    handler=new Handler();
}

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction()==MotionEvent.ACTION_DOWN){
        clickCount++;
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (clickCount==1){
                    myClickCallBack.oneclick();
                }else if (clickCount==2){
                    myClickCallBack.doubleClick();
                }
                handler.removeCallbacksAndMessages(null);
                clickCount=0;
            }
        },timeout);
    }
    return false;
}
}

最后是MainActivity的写入

public class MainActivity extends AppCompatActivity implements View.OnClickListener, MyClickListener.MyClickCallBack {

private SurfaceView mSurfaceView;
private Button mPlay;
private Button mPasue;
private Button mStop;
private SurfaceHolder surfaceHolder;
private MediaPlayer mediaPlayer;
private boolean noPlay = true;
private boolean playStare = true;
private SeekBar seekBar;
private TextView mBiaoti;
private ImageView mImageView;
//更改广播的进度
private String TAG = "tag";
private boolean flag = true;
private ProgressReceiver receiver;

@SuppressLint("ClickableViewAccessibility")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //全屏显示
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    mSurfaceView = findViewById(R.id.surfaceView);
    seekBar = findViewById(R.id.seekBar);
    mBiaoti = findViewById(R.id.biaoti);
    mImageView = findViewById(R.id.imageView);
    //控制视频的按钮
    mPlay = findViewById(R.id.play);
    mPasue = findViewById(R.id.pasue);
    mStop = findViewById(R.id.stop);
    //隐藏所有的控件
    mPlay.setVisibility(View.GONE);
    mPasue.setVisibility(View.GONE);
    mStop.setVisibility(View.GONE);
    seekBar.setVisibility(View.GONE);
    mBiaoti.setVisibility(View.GONE);
    mImageView.setVisibility(View.GONE);

    receiver = new ProgressReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction("alice.com.player");

    registerReceiver(receiver, filter);

    mediaPlayer = new MediaPlayer();
    surfaceHolder = mSurfaceView.getHolder();

    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);


//设置点击事件

    mSurfaceView.setOnTouchListener(new MyClickListener(this));
    mPlay.setOnClickListener(this);
    mPasue.setOnClickListener(this);
    mStop.setOnClickListener(this);
    mImageView.setOnClickListener(this);
//视频的长度
    int duration = mediaPlayer.getDuration();
    Log.i(TAG, "onCreate: 长度=" + duration);
    seekBar.setMax(25877);
    seekBar.setProgress(0);
    // 拖动改变视频播放进度
    seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            Log.i("tag", "onProgressChanged: " + i);

            if (b)
                mediaPlayer.seekTo(i);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
            mediaPlayer.pause();
        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            mediaPlayer.start();
        }
    });


}


@Override
public void onClick(View v) {
    switch (v.getId()) {
  
        case R.id.pasue:
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
            }
            break;
        case R.id.play:
            if (noPlay) {
                play();
                noPlay = false;
            } else {
                mediaPlayer.start();
            }
            break;
        case R.id.stop:
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
                noPlay = true;
            }
            break;
        case R.id.imageView:
            if (mediaPlayer.isPlaying()) {
                mediaPlayer.start();
            }
            break;

    }
}

private void play() {
    mediaPlayer.reset();
    mediaPlayer.setDisplay(surfaceHolder);

    try {
        mediaPlayer.setDataSource(Environment.getExternalStorageDirectory() + "/a.mp4");
        mediaPlayer.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.start();

    new MyThread().start();
  //  new MyThread2().start();
}

@Override
protected void onDestroy() {
    if (mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
    }
    super.onDestroy();
}

@Override
public void oneclick() {
    int visibility = mPlay.getVisibility();
    Log.i(TAG, "oneclick: visibility===" + visibility);
    if (visibility == 0) {
        mPlay.setVisibility(View.GONE);
        mPasue.setVisibility(View.GONE);
        mStop.setVisibility(View.GONE);
        seekBar.setVisibility(View.GONE);
        mBiaoti.setVisibility(View.GONE);
        mImageView.setVisibility(View.GONE);

    } else {
        mPlay.setVisibility(View.VISIBLE);
        mStop.setVisibility(View.VISIBLE);
        mPasue.setVisibility(View.VISIBLE);
        seekBar.setVisibility(View.VISIBLE);
        mBiaoti.setVisibility(View.VISIBLE);
        mImageView.setVisibility(View.VISIBLE);
    }

}

@Override
public void doubleClick() {
    if (playStare) {
        mediaPlayer.start();
        playStare = false;
        Log.i(TAG, "doubleClick: playStare==true");
    } else {
        mediaPlayer.pause();
        playStare = true;
        Log.i(TAG, "doubleClick: playStare==false");
    }

}

class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
        Intent intent = new Intent();
        intent.setAction("alice.com.player");
        while (flag) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (mediaPlayer != null) {
                int currentPosition = mediaPlayer.getCurrentPosition();
                intent.putExtra("progress", currentPosition);
                sendBroadcast(intent);
            }
        }
    }
}

class MyThread2 extends Thread{
    @Override
    public void run() {
        super.run();
        while (seekBar.getProgress()<=seekBar.getMax()){
            int currentPosition = mediaPlayer.getCurrentPosition();
            seekBar.setProgress(currentPosition);
        }
    }
}

class ProgressReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        int progress = intent.getIntExtra("progress", 0);
        seekBar.setProgress(progress);
     //   Log.i(TAG, "onReceive: progress===最大值=="+progress);
    }
}

}

相关文章

网友评论

      本文标题:Android视频播放:SurfaceView+MediaPla

      本文链接:https://www.haomeiwen.com/subject/mljfbctx.html