• Android学习笔记_25_多媒体之在线播放器


    一、布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#FFFFFF"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/filename" />
    
        <EditText
            android:id="@+id/filename"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="11.RMVB" />
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <ImageButton
                android:id="@+id/play"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/play" />
    
            <ImageButton
                android:id="@+id/pause"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pause" />
    
            <ImageButton
                android:id="@+id/reset"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/reset" />
    
            <ImageButton
                android:id="@+id/stop"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/stop" />
        </LinearLayout>
    
        <SurfaceView
            android:id="@+id/surfaceView"
            android:layout_width="fill_parent"
            android:layout_height="240dip" />
    
    </LinearLayout>
    View Code

    二、代码实现:

    package com.example.video;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import android.R.integer;
    import android.app.Activity;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnPreparedListener;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageButton;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
        private static final String TAG = "VideoActivity";
        private EditText filenameText;
        private SurfaceView surfaceView;
        private MediaPlayer mediaPlayer;
        private String filename;// 当前播放文件的名称
        private int position;// 记录播放位置
        private boolean pause=false;//是否被暂停
        private  File file;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            this.mediaPlayer = new MediaPlayer();
            this.filenameText = (EditText) this.findViewById(R.id.filename);
            this.surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
            ImageButton playButton = (ImageButton) this.findViewById(R.id.play);
            ImageButton pauseButton = (ImageButton) this.findViewById(R.id.pause);
            ImageButton resetButton = (ImageButton) this.findViewById(R.id.reset);
            ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);
    
            ButtonClickListener listener = new ButtonClickListener();
            playButton.setOnClickListener(listener);
            pauseButton.setOnClickListener(listener);
            resetButton.setOnClickListener(listener);
            stopButton.setOnClickListener(listener);
    
            /* 下面设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户面前 */
            this.surfaceView.getHolder().setType(
                    SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            this.surfaceView.getHolder().setFixedSize(176, 144);// 设置分辨率
            //让屏幕高亮,不要锁频
            this.surfaceView.getHolder().setKeepScreenOn(true);
            this.surfaceView.getHolder().addCallback(new SurfaceListener());
        }
    
        private class ButtonClickListener implements View.OnClickListener {
            @Override
            public void onClick(View v) {
                try {
                    switch (v.getId()) {
                    case R.id.play:// 来自播放按钮
                        filename = filenameText.getText().toString();
                        file=new File("/storage/sdcard0/Music",filename);
                        if (file.exists()) {                        
                            play(0);
                        }else {
                            Toast.makeText(getApplicationContext(), "文件不存在", Toast.LENGTH_LONG).show();
                        }
                        break;
    
                    case R.id.pause:// 来自暂停按钮
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.pause();
                            pause=true;
                        } else {
                            if (pause) {
                                mediaPlayer.start();
                                pause=false;
                            }
                        }
                        break;
    
                    case R.id.reset:// 来自重新播放按钮
                        if (mediaPlayer.isPlaying()) {
                            mediaPlayer.seekTo(0);
                        }else {
                            if(file!=null){
                                play(0);
                            }
                        }
                        break;
                    case R.id.stop:// 来自停止按钮
                        if (mediaPlayer.isPlaying())
                            mediaPlayer.stop();
                        break;
                    }
                } catch (Exception e) {
                    Log.e(TAG, e.toString());
                }
            }
        }
    
        /**
         * 播放视频
         */
        private void play(int position) throws IOException {
            mediaPlayer.reset();
            //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mediaPlayer.setDataSource(file.getAbsolutePath());// 设置需要播放的视频
            mediaPlayer.setDisplay(surfaceView.getHolder());// 把视频画面输出到SurfaceView
            mediaPlayer.prepare();//进行缓冲处理,完成之后播放
            mediaPlayer.setOnPreparedListener(new PrepareListener(position));
            
        }
        private final class PrepareListener implements OnPreparedListener{
            private int position;
            public PrepareListener(int position) {
                this.position=position;
            }
    
            //当缓冲完成之后就会调用onPrepared方法
            @Override
            public void onPrepared(MediaPlayer mp) {
                mediaPlayer.start();//播放
                if (position>0) {
                    mediaPlayer.seekTo(position);
                }
            }
        }
    
        private class SurfaceListener implements SurfaceHolder.Callback {
            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
    
            //当画面再次回到前台时调用
            @Override
            public void surfaceCreated(SurfaceHolder holder) {// 方法在onResume()后被调用
                Log.i(TAG, "surfaceCreated()");
                if (position > 0 && filename != null) {
                    try {
                        play(position);
                        position = 0;
                    } catch (Exception e) {
                        Log.e(TAG, e.toString());
                    }
                }
            }
    
            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                if (mediaPlayer.isPlaying()) {
                    position = mediaPlayer.getCurrentPosition();// 得到播放位置
                    mediaPlayer.stop();
                }
                Log.i(TAG, "surfaceDestroyed()");
            }
        }
    
        @Override
        protected void onDestroy() {
            if (mediaPlayer.isPlaying())
                mediaPlayer.stop();
            mediaPlayer.release();
            super.onDestroy();
        }
        
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }
  • 相关阅读:
    如何提高PHP执行效率
    PHP MySQL 预处理语句
    CDN拾遗
    Rendering React components to the document body
    模拟select,隐藏下拉列表的几种实现
    前端数据范式化
    其实我们可以少写点if else和switch
    [译]the cost of javascript in 2018(1)
    provisional headers are shown 知多少
    f5到底刷新了点什么,你知道吗
  • 原文地址:https://www.cnblogs.com/lbangel/p/3463183.html
Copyright © 2020-2023  润新知