android非常好的在线视频播放器源码(包含在线音频播放源码)

2023-05-16

一、在线音频播放器
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
	android:id="@+id/textView"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    >
    <ImageButton 
    android:id="@+id/startButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/start"
    />
    <ImageButton 
    android:id="@+id/pauseButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/pause"
    /><ImageButton 
    android:id="@+id/resetButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/reset"
    /><ImageButton 
    android:id="@+id/stopButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/stop"
    />
    </LinearLayout>
</LinearLayout>

package com.xgr.OnlineMp3;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.URLUtil;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class OnlineMp3Activity extends Activity {
	private TextView textView;
	private ImageButton startButton,pauseButton,resetButton,stopButton;
	private  MediaPlayer mediaPlayer;
	private boolean isReleased=false;
	private boolean isPaused=false;
	private static final String TAG="onlinemp3";
	
	private String currentFilePath="";
	private String currentTempFilePath="";
	private String strVideoURL="";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mediaPlayer=new MediaPlayer();
	
        strVideoURL="http://10.0.2.2:8080/tomcatpro/a1.mp3";
        textView=(TextView)findViewById(R.id.textView);
        //设置透明 度
        getWindow().setFormat(PixelFormat.TRANSPARENT);
        startButton=(ImageButton)findViewById(R.id.startButton);
        pauseButton=(ImageButton)findViewById(R.id.pauseButton);
        resetButton=(ImageButton)findViewById(R.id.resetButton);
        stopButton=(ImageButton)findViewById(R.id.stopButton);
        
        startButton.setOnClickListener(new ImageButton.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				playVideo(strVideoURL);
				textView.setText("正在播放"+"\n"+strVideoURL);
			}
        	
        });
        
        resetButton.setOnClickListener(new ImageButton.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(isReleased==false){
					if(mediaPlayer!=null){
						mediaPlayer.seekTo(0);
						textView.setText("reset");
					}
				}
			}
        	
        });
        pauseButton.setOnClickListener(new ImageButton.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				if(mediaPlayer!=null){
					if(isReleased==false){
						if(isPaused==false){
							mediaPlayer.pause();
							isPaused=true;
							textView.setText("pause");
						}
						else if(isPaused==true){
							mediaPlayer.start();
							isPaused=false;
							textView.setText("start");
						}
					}
				}
			}
        	
        });
        
        stopButton.setOnClickListener(new ImageButton.OnClickListener(){

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				try{
					if(mediaPlayer!=null){
						if(isReleased==false){
							mediaPlayer.stop();
							mediaPlayer.release();
							isReleased=true;
							delFile(currentFilePath);
							textView.setText("stop");
						}
					}
				}catch(Exception e){
					textView.setText(e.toString());
					e.printStackTrace();
				}
			}
        	
        });
    }
	
	private void playVideo(final String strPath) {
		// TODO Auto-generated method stub
		try{
			//if(currentFilePath!=null&&mediaPlayer!=null){
			mediaPlayer.setDataSource(strPath);
    		mediaPlayer.prepare();
    		mediaPlayer.start();
				
		//return;
		//}else{
		//	Toast.makeText(getApplicationContext(), "fileNotFound", Toast.LENGTH_LONG).show();
	//	}
		//	currentFilePath=strPath;
		//   mediaPlayer=new MediaPlayer();
		//mediaPlayer.setAudioStreamType(2);
			
			mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
				
				@Override
				public boolean onError(MediaPlayer mp, int what, int extra) {
					// TODO Auto-generated method stub
					Log.i(TAG,"Error on Listener,what:"+what+"extra:"+extra);
					return false;
				}
			});
			
			mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {
				
				@Override
				public void onBufferingUpdate(MediaPlayer arg0, int arg1) {
					// TODO Auto-generated method stub
					//Log.i(TAG,"Update:"+Integer.toString(percent)+"%");
				}
			});
			
			mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener(){

				@Override
				public void onCompletion(MediaPlayer arg0) {
					// TODO Auto-generated method stub
					Log.i(TAG,"mediaPlayer Listener completed");
					mediaPlayer.seekTo(0);
				}
				
			});
			
			mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
				
				@Override
				public void onPrepared(MediaPlayer arg0) {
					// TODO Auto-generated method stub
					Log.i(TAG,"prepared Listener");
				}
			});
			
			Runnable r=new Runnable(){
				public void run(){
					try{
						setDateSource(strPath);
						mediaPlayer.prepare();
						Log.i(TAG,"Duration:"+mediaPlayer.getDuration());
						mediaPlayer.start();
						isReleased=false;
					}
					catch(Exception e){
						Log.e(TAG,e.getMessage(),e);
					}
				}
			};
				new Thread(r).start();
			
			
		}catch(Exception e){
			if(mediaPlayer!=null){
				mediaPlayer.stop();
				mediaPlayer.release();
			
			}
			e.printStackTrace();
		}
	}
	
	private void setDateSource(String strPath) throws Exception
	{
		if(!URLUtil.isNetworkUrl(strPath)){
			mediaPlayer.setDataSource(strPath);
		}
		else{
			if(isReleased==false){
				URL myUrl=new URL(strPath);
				URLConnection conn=myUrl.openConnection();
				conn.connect();
				
				InputStream is=conn.getInputStream();
				if(is==null){
					throw new RuntimeException("stream is null");
				}
				File myTempFile=File.createTempFile("yinyue","."+getFileExtendsion(strPath));
				currentFilePath=myTempFile.getAbsolutePath();
				if(currentTempFilePath!=null){
					Log.i(TAG,"currentTempFilepath");
					System.out.println(currentFilePath);
				}
				FileOutputStream fos=new FileOutputStream(myTempFile);
				byte[] buf=new byte[128];
				do{
					int numread=is.read(buf);
					if(numread<=0){
						break;
					}
					fos.write(buf,0,numread);
				}while(true);				
				//mediaPlayer.setDataSource(currentTempFilePath);
				try{
					is.close();
				}catch(Exception e){
					Log.e(TAG,"error:"+e.getMessage(),e);
				}
			}
		}
	}
	
	private String getFileExtendsion(String strFileName){
		File myFile=new File(strFileName);
		String strFileExtendsion=myFile.getName();
		strFileExtendsion=(strFileExtendsion.substring(strFileExtendsion.lastIndexOf(".")+1)).toLowerCase();
		if(strFileExtendsion==""){
			strFileExtendsion="dat";
		}
		return strFileExtendsion;
	}
	
	private void delFile(String strFileName){
		File myFile=new File(strFileName);
		if(myFile.exists()){
			myFile.delete();
		}
	}
	
	
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.xgr.OnlineMp3"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".OnlineMp3Activity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    
</manifest>

二、在线视频播放器
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SurfaceView
        android:id="@+id/surfaceView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ProgressBar
        android:id="@+id/loadingVideo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center" />
    
    <RelativeLayout
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_gravity="top"
        android:layout_margin="8dip"
        android:background="#00000000"
        android:focusable="true"
        android:gravity="center_vertical">
	
	    <Button
	        android:id="@+id/backBtn"
	        android:layout_width="60dip"
	        android:layout_height="35dip"
	        android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
	        android:gravity="center"
	        android:textColor="#ffffff"
	        android:text="返 回"
	        android:background="@drawable/video_back_btn_seletor" />
	
	    <TextView
	        android:id="@+id/cacheT"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:layout_alignParentRight="true"
	        android:layout_centerVertical="true"
	        android:textColor="#0000ff"
	        android:textSize="15sp"
	        android:textAppearance="?android:attr/textAppearanceMedium"/>
	</RelativeLayout>
	
    <RelativeLayout
        android:id="@+id/opLy"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom"
        android:layout_margin="8dip"
        android:background="#00000000"
        android:focusable="true"
        android:gravity="center_vertical">

        <Button
	        android:id="@+id/playBtn"
	        android:layout_width="40dp"
	        android:layout_height="40dp"
	        android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
	        android:background="@drawable/btn_play" />

        <SeekBar
            android:id="@+id/seekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxHeight="4dip"
            android:minHeight="4dip"
            android:paddingLeft="15dip"
            android:paddingRight="15dip"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/playBtn"
            android:progressDrawable="@drawable/seek_drawable"
            android:thumb="@drawable/seek_thumb"/>
    </RelativeLayout>

</FrameLayout>

package com.mymovieplay;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager.LayoutParams;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.webkit.URLUtil;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;



public class MainActivity extends Activity{
	private final static int NETWORK_PARSE_ERROR = 0;
	private final static int VIDEO_FILE_ERROR = 1;
	private final static int VIDEO_STATE_BEGIN = 2;
	private final static int VIDEO_CACHE_FINISH = 3;
	private final static int VIDEO_UPDATE_SEEKBAR = 5;
	
	private Button playBtn,backBtn;  //用于开始和暂停的按钮
	private SurfaceView videoSurfaceView;   //绘图容器对象,用于把视频显示在屏幕上
	private String url;   //视频播放地址
	private MediaPlayer mediaPlayer;    //播放器控件
	private int postSize=0;    //保存已播视频大小
	private SeekBar seekbar;   //进度条控件
	private boolean flag = true;   //用于判断视频是否在播放中
	private RelativeLayout opLy;   
	private boolean display;   //用于是否显示其他按钮
	private ProgressBar loadingVideoV;
	private TextView cacheT;
	private UpdateSeekBarR updateSeekBarR;   //更新进度条用
	
	private long mediaLength = 0 , readSize = 0;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);//全屏
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // 应用运行时,保持屏幕高亮,不锁屏
		
		url = "http://www.mgokc.com/theme/exercises/video/english_edu_1.mp4";   //视频播放地址
//		url =Environment.getExternalStorageDirectory().getAbsolutePath()+"/9533522808.f4v.mp4";
		initVideoPlayer();//初始化数据
		setPalyerListener();//绑定相关事件
	}
	private void initVideoPlayer() {
		mediaPlayer = new MediaPlayer();   //创建一个播放器对象
		updateSeekBarR = new UpdateSeekBarR();  //创建更新进度条对象
		
		setContentView(R.layout.main);   //加载布局文件
		
		seekbar = (SeekBar) findViewById(R.id.seekBar);//进度条
		opLy = (RelativeLayout) findViewById(R.id.opLy);
		loadingVideoV = (ProgressBar) findViewById(R.id.loadingVideo);
		cacheT = (TextView) findViewById(R.id.cacheT);
		
		backBtn = (Button) findViewById(R.id.backBtn);
		playBtn = (Button) findViewById(R.id.playBtn);
		playBtn.setEnabled(false); //刚进来,设置其不可点击
		
		videoSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
		
		videoSurfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);   //不缓冲
		videoSurfaceView.getHolder().setKeepScreenOn(true);   //保持屏幕高亮
		videoSurfaceView.getHolder().addCallback(new videoSurfaceView());//设置监听事件,从这里监听surface创建完成开始播放视频
	}
	
	//视频播放视图回调事件
	private class videoSurfaceView implements Callback {     //上面绑定的监听的事件
		@Override
		public void surfaceChanged(SurfaceHolder holder, int format, int width,int height){}
		
		@Override
		public void surfaceCreated(SurfaceHolder holder) {//创建完成后调用
			//不是网络视频,直接播放
			if(URLUtil.isNetworkUrl(url)) {
				try {
					new Thread(new CacheNetFileR()).start();
				}catch (Exception e) {
					mHandler.sendEmptyMessage(NETWORK_PARSE_ERROR);
					e.printStackTrace();
				}
			}else{
				File videoFile=new File(url);
				if(videoFile.exists()){
					readSize = mediaLength = videoFile.length();
					System.out.println("这是本地视频,直接播放!");
					mHandler.sendEmptyMessage(VIDEO_STATE_BEGIN);
				}
			}
		}
		@Override
		public void surfaceDestroyed(SurfaceHolder holder) { //activity调用过pause方法,保存当前播放位置
			if (mediaPlayer != null && mediaPlayer.isPlaying()) {
				postSize = mediaPlayer.getCurrentPosition();
				mediaPlayer.stop();
				flag = false;
				loadingVideoV.setVisibility(View.VISIBLE);
			}
		}
	}
	//播放视频的线程
	class PlayMovieT extends Thread {   
		int post = 0;
		public PlayMovieT(int post) {
			this.post = post;
		}
		@Override
		public void run() {
			try {
				mediaPlayer.reset();    //回复播放器默认
				mediaPlayer.setDataSource(url);   //设置播放路径
				mediaPlayer.setDisplay(videoSurfaceView.getHolder());  //把视频显示在SurfaceView上
				mediaPlayer.setOnPreparedListener(new videoPreparedL(post));  //设置监听事件
				mediaPlayer.prepare();  //准备播放
			} catch (Exception e) {
				mHandler.sendEmptyMessage(VIDEO_FILE_ERROR);
			}
			super.run();
		}
	}
	//视频播放视图准备事件监听器
	class videoPreparedL implements OnPreparedListener {
		int postSize;
		public videoPreparedL(int postSize) {
			this.postSize = postSize;
		}

		@Override
		public void onPrepared(MediaPlayer mp) {//准备完成
			loadingVideoV.setVisibility(View.GONE);  //准备完成后,隐藏控件
			backBtn.setVisibility(View.GONE);
			opLy.setVisibility(View.GONE);
			
			display = false;
			if (mediaPlayer != null) { 
				mediaPlayer.start();  //开始播放视频
			} else {
				return;
			}
			if (postSize > 0) {  //说明中途停止过(activity调用过pause方法,不是用户点击停止按钮),跳到停止时候位置开始播放
				mediaPlayer.seekTo(postSize);   //跳到postSize大小位置处进行播放
			}
			new Thread(updateSeekBarR).start();   //启动线程,更新进度条
		}
	}
	
	//设置操作监听器
	private void setPalyerListener() {
		mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() {//缓冲去更新
			@Override
			public void onBufferingUpdate(MediaPlayer mp, int percent) {
			}
		});

		mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { //视频播放完成
			@Override
			public void onCompletion(MediaPlayer mp) {
				flag = false;
				playBtn.setBackgroundResource(R.drawable.btn_play);
			}
		});
		//如果视频在播放,则调用mediaPlayer.pause();,停止播放视频,反之,mediaPlayer.start()  ,同时换按钮背景
		playBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (mediaPlayer.isPlaying()) {    
					playBtn.setBackgroundResource(R.drawable.btn_play);
					mediaPlayer.pause();
					postSize = mediaPlayer.getCurrentPosition();
				} else {
					if (flag == false) {
						flag = true;
						new Thread(updateSeekBarR).start();
					}
					mediaPlayer.start();
					playBtn.setBackgroundResource(R.drawable.btn_pause);
				}
			}
		});
		seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int value = seekbar.getProgress() * mediaPlayer.getDuration() / seekbar.getMax();  //计算进度条需要前进的位置数据大小
				mediaPlayer.seekTo(value);
			}
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {}
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {}
		});
		//点击屏幕,切换控件的显示,显示则应藏,隐藏,则显示
	    videoSurfaceView.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (display) {
					backBtn.setVisibility(View.GONE);
					opLy.setVisibility(View.GONE);
					display = false;
				} else {
					backBtn.setVisibility(View.VISIBLE);
					opLy.setVisibility(View.VISIBLE);
					videoSurfaceView.setVisibility(View.VISIBLE);
					
					//设置播放为全屏
					/*ViewGroup.LayoutParams lp = videoSurfaceView.getLayoutParams();
					lp.height = LayoutParams.FILL_PARENT;
					lp.width = LayoutParams.FILL_PARENT;
					videoSurfaceView.setLayoutParams(lp);*/
					display = true;
				}

			}
		});
	    backBtn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				if (mediaPlayer.isPlaying()) {
					mediaPlayer.stop();
					mediaPlayer.release();
				}
				mediaPlayer = null;
				MainActivity.this.finish();
			}
		});
	}
	//handler
	Handler mHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case NETWORK_PARSE_ERROR://错误信息
				Toast.makeText(getApplicationContext(), "网络连接错误,不能完成播放!",Toast.LENGTH_LONG).show();
				loadingVideoV.setVisibility(View.GONE);
				break;
			case VIDEO_FILE_ERROR://错误信息
				Toast.makeText(getApplicationContext(), "视频文件错误,不能完成播放!",Toast.LENGTH_LONG).show();
				loadingVideoV.setVisibility(View.GONE);
				break;
			case VIDEO_STATE_BEGIN://开始播放视频
				playMediaMethod();
				playBtn.setEnabled(true);
				playBtn.setBackgroundResource(R.drawable.btn_pause);
				break;
			case VIDEO_CACHE_FINISH://视频缓存完成,使用本地文件播放
				Toast.makeText(getApplicationContext(), "视频已经缓存完毕,为保证播放的流畅性,正在切换成本地文件播放!",Toast.LENGTH_LONG).show();
				postSize = mediaPlayer.getCurrentPosition();
				playMediaMethod();
				break;
			case VIDEO_UPDATE_SEEKBAR:// 更新进度条
				if (mediaPlayer == null) {
					flag = false;
				}else{
					double cachepercent = readSize * 100.00 / mediaLength * 1.0;
					String s = String.format("已缓存:[%.2f%%]", cachepercent);
					
					if(mediaPlayer.isPlaying()) {
						flag = true;
						int position = mediaPlayer.getCurrentPosition();
						int mMax = mediaPlayer.getDuration();
						int sMax = seekbar.getMax();
						seekbar.setProgress(position * sMax / mMax);
						
						mMax = 0 == mMax ? 1 : mMax;
						double playpercent = position * 100.00 / mMax * 1.0;

						int i = position / 1000;
						int hour = i / (60 * 60);
						int minute = i / 60 % 60;
						int second = i % 60;

						s += String.format(" 当前播放:%02d:%02d:%02d [%.2f%%]", hour, minute, second, playpercent);
					}else{
						s += " 视频当前未播放!";
					}
					cacheT.setText(s);
				}
				break;
			default:
				break;
			}
		};
	};
	//播放视频的方法
	private void playMediaMethod(){
		if (postSize > 0 && url!= null) {    //说明,停止过 activity调用过pause方法,跳到停止位置播放
			new PlayMovieT(postSize).start();//从postSize位置开始放
			flag = true;
			int sMax = seekbar.getMax();
			int mMax = mediaPlayer.getDuration();
			seekbar.setProgress(postSize * sMax / mMax);
			
			loadingVideoV.setVisibility(View.GONE);
		}else {
			new PlayMovieT(0).start();//表明是第一次开始播放
		}
	}
	//每隔1秒更新一下进度条线程
	class UpdateSeekBarR implements Runnable {
		@Override
		public void run() {
			mHandler.sendEmptyMessage(VIDEO_UPDATE_SEEKBAR);
			if (flag) {
				mHandler.postDelayed(updateSeekBarR, 1000);
			}
		}
	}
	@Override
	protected void onDestroy() {   //activity销毁后,释放资源
		super.onDestroy();
		if (mediaPlayer != null) {
			mediaPlayer.stop();
			mediaPlayer.release();
			mediaPlayer = null;
		}
		System.gc();
	}
	//在线播放时后台缓存文件,方便下次直接播放
	class CacheNetFileR implements Runnable{
		@Override
		public void run() {
			System.out.println("------------开始缓存视频了!");
			FileOutputStream out = null;
			InputStream is = null;
			try {
				HttpURLConnection httpConnection = (HttpURLConnection)new URL(url).openConnection();
			    String cacheUrl = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Cache/"+url.substring(url.lastIndexOf("/")+1);
				File cacheFile = new File(cacheUrl);
				boolean isNeedCache=false;
				if (cacheFile.exists()) {
					readSize = mediaLength = cacheFile.length();
					//先讲属性设置好,不然getContentLength之后已经打开连接了,不能再设置了
					httpConnection.setRequestProperty("User-Agent", "NetFox");
					httpConnection.setRequestProperty("RANGE", "bytes=" + readSize + "-");//从断点处请求读取文件
					if(httpConnection.getContentLength() == readSize){//视频已经成功缓存完成
						url=cacheUrl;
						isNeedCache=false;
					}else{
						isNeedCache=true;
					}
				}else{
					cacheFile.getParentFile().mkdirs();
					cacheFile.createNewFile();
					isNeedCache=true;
				}
				mHandler.sendEmptyMessage(VIDEO_STATE_BEGIN);//开始播放视频
				if(isNeedCache){//需要缓存视频
					out = new FileOutputStream(cacheFile, true);

					is = httpConnection.getInputStream();
					mediaLength = httpConnection.getContentLength();
					if(-1 == mediaLength) {
						System.out.println("-------------视频文件缓存失败,不能成功获取文件大小!");
						return;
					}
					mediaLength += readSize;

					byte buf[] = new byte[4 * 1024];
					int size = 0;

					while((size = is.read(buf)) != -1){//缓存文件
						System.out.println("--------------缓存文件部分:"+size);
						try {
							out.write(buf, 0, size);
							readSize += size;
						}catch (Exception e) {
							e.printStackTrace();
						}
					}
					url=cacheUrl;//将url替换成本地
					mHandler.sendEmptyMessage(VIDEO_CACHE_FINISH);//视频缓存结束,将当前视频切换成播放本地的文件
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				if (out != null) {
					try {
						out.close();
					} catch (IOException e){
					}
				}
				if (is != null) {
					try {
						is.close();
					} catch (IOException e){
					}
				}
			}
		}
	}
}

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mymovieplay"
    android:versionCode="1"
    android:versionName="1.0" >

       <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="12" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.mymovieplay.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN"
        android:configChanges="keyboardHidden|orientation"></action>
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
</manifest>



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android非常好的在线视频播放器源码(包含在线音频播放源码) 的相关文章

随机推荐

  • 开关电源三种控制模式:PWM/PFM/PSM

    1 PWM PFM PSM 三种控制模式的定义 通常来说 开关电源 xff08 DC DC xff09 有三种最常见的调制方式分别为 xff1a 脉冲宽度调制 xff08 PWM xff09 脉冲频率调制 xff08 PFM xff09 脉
  • PCB布线走直角或锐角问题研究

    首先需要说明的一点 xff0c 在正常布线的过程中还是要尽量避免布线走直角和锐角 这里只是研究深入下布线走直角或锐角会有多大的危害性 xff0c 结尾给出答案 无论是教科书还是公司的技术规范都会强调布线避免出现走直角和锐角 xff0c 不过
  • 磁珠基本原理

    概念 磁珠的全称为铁氧体磁珠滤波器 xff0c 是一种抗干扰元件 xff0c 主要功能是滤除高频噪声 xff0c 消除存在于传输线结构 xff08 电路 xff09 中的噪声 工作原理 磁珠通过阻抗吸收并以发热的形式将不需要频段的能量耗散掉
  • BUCK型DC-DC变换器

    前述 DCDC从控制手段上来说分为PWM式 谐振式以及他们的结合式 每 一种方式中从输入与输出之间是否有变压器隔离又可以分为有隔离 无隔离两类 每一类有六种拓扑结构 BUCK Boost BUCK Boost Cuk Sepic和Zeat
  • dubbo服务超时导致的异常org.apache.dubbo.remoting.TimeoutException

    1 dubbo服务超时异常提示信息如下 xff1a cause org apache dubbo remoting TimeoutException Waiting server side response timeout by scan
  • 基于TCP/IP实现串口到网络的通讯转换

    工作模式 通过串口服务器 xff0c 采集到天平的称量值发送到PC端 操作步骤 1 软件测试 测试工具 xff1a USR M0 V2 2 5 8 基础设置 xff1a 模块静态IP 设置成服务器IP xff0c HTTP服务端口 设置成4
  • 结构体的对其规则以及为什么要对其

    结构体的内存对齐规则以及为什么要对齐 内存对齐规则 span class token number 1 span 第一个成员在与结构体变量偏移量为 span class token number 0 span 的地址处 span class
  • 宏定义参数

    宏定义的参数以逗号 xff08 作为分隔符 span class token macro property span class token directive keyword include span span class token s
  • [STM32]关于环形队列的实现

    在程序中使用环形队列判断接收数据格式 xff0c 避免在中断中处理造成程序响应速度慢的问题 直接贴代码 xff1a LoopRxCommu h ifndef LOOPRXCOMMU H define LOOPRXCOMMU H includ
  • C#旅程——串口发送数据

    串口发送数据时可以一个byte一个byte的发送数据 xff0c 也可以一次性丢出 xff0c 分多次丢出的话会导致一段数据被分成多段发出 xff0c 中间的延时可能会超过2ms xff0c 与FW通讯时会出现异常 span class t
  • 【记录】一次51单片机串口乱码问题排查

    记录 一次51单片机串口乱码问题排查 项目场景问题描述原因分析解决方案结语 项目场景 在51串口收发仿真实验中使用两个单片机互相通信 xff0c 程序设定A上电1s后通过串口以16进制给B发送AA 直到B收到AA后回复BB xff0c 当A
  • IO流java基础

    二十四 IO流 24 1 File 1 1 File 类概述和构造方法 File 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言 其封装的并不是一个真正存在的文件 仅仅是一个路径名而已 它可以是存
  • TX2上布置vins_fusion_gpu指南

    1 参考链接 如果初次安装 xff0c 新的TX2环境 xff0c 请参考文档 https github com arjunskumar vins fusion gpu tx2 nano 2 问题记录 1 xff0c 自己的环境情况 我的环
  • Ubuntu下安装cmake

    Ubuntu下安装cmake 今天因为项目的原因需要将cmake升级一下 xff0c 原来我是按照链接没有卸载旧版本 xff0c 直接升级 但是出现一些问题 xff0c 然后我全部卸载后 xff0c 重新安装 以下就是我的安装步骤 第一步
  • AUTH:basic认证和digest认证

    Http authentication BASIC In the context of an HTTP transaction basic access authentication is a method for a web browse
  • Quick Audience组织和工作空间功能解读

    简介 xff1a Quick Audience完成了权限系统全面升级 xff0c 可以解决集团企业不同品牌 不同运营组织 xff0c 不同消费者运营的诉求 xff0c 精细化保障企业数据访问安全 xff0c 提升管控的灵活度 更多关于数智化
  • Socket编程基础总结,全网最全

    IP地址 xff1a 可以在网络环境中 xff0c 唯一标识一台主机 端口号 xff1a 可以定位网络的一台主机上 xff0c 唯一标识一个进程 ip地址 43 端口号 xff1a 可以在网络环境中 xff0c 唯一标识一个进程 在TCP
  • 嵌入式开发--RS-485通讯的问题

    嵌入式开发 RS 485通讯的问题 RS 485说明接口芯片硬件连接CubeMX设置代码编写引脚定义使能串口中断函数发送数据接收数据 有一个问题 xff0c 多收了一个数数据线上的波形问题分析问题解决 RS 485说明 RS 485一般简称
  • UNIX网络编程卷1(第三版)字节排序函数测试

    内存中存储多字节有两种方法 xff0c 即小端字节序和大端字节序 xff0c Ubuntu10 04 是小端字节序 xff0c 网际协议所用的字节序为大端字节序 内存地址增长方向 低序字节 gt 高序字节 小端字节序 高序字节 gt 低序字
  • android非常好的在线视频播放器源码(包含在线音频播放源码)

    一 在线音频播放器 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt lt LinearLayout xmlns android 61 34 http schemas androi