美文网首页
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