usbplayer demo

本文介绍了一种基于按键控制的无缝视频播放方案,通过解析配置文件实现特定时间片段的循环播放及跳转,适用于广告机等场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


package net.smc.usbplayer;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import net.smc.usbplayer.bean.TimePlayInfo;
import net.smc.usbplayer.tools.Tools;
import android.os.Bundle;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.MediaController;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;



/**
 * 快速播放模式   

      写一个文本档fastmode.txt
数据如下,数字可以任意更改。
00=0,20
01=20,50
02=50,100
03=100,200
开机的时候,播放机一直在,0到20循环播放,如果按了数控键1,就从上表定义
的,从20秒播放到50秒,如果播放完成,就跳回,00这一段,循环播放。
00定义开机循环播放时间段。
 *
 */
@SuppressLint("NewApi")
public class SeamlessHandoverActivity2 extends Activity{

	private static final String TAG = SeamlessHandoverActivity2.class.getSimpleName();
	
	private static final int PLAY_START_TIME = 0x001;
	
	private MVideoView videoPlayer;
	
	private String videoPath;
	
	private TimePlayInfo cusTimePlayInfo;
	
	private ArrayList<TimePlayInfo> timePlayList=new ArrayList<TimePlayInfo>();
	
	private UsbStateReceiver usbReceiver;
	
	private String videoName;

	private Handler mHandler=new Handler(){
		
		public void handleMessage(android.os.Message msg) {
			
			switch (msg.what) {
			case PLAY_START_TIME:
				
				if(cusTimePlayInfo!=null){
					
					Log.i(TAG, "videoPlayer seekTo-->"+cusTimePlayInfo.toString());
					
					videoPlayer.seekTo(cusTimePlayInfo.getStartTime());
					
					int delayTime=cusTimePlayInfo.getEndTime()-cusTimePlayInfo.getStartTime();
					
					Log.i(TAG, "delayTime-->"+delayTime);
					mHandler.removeMessages(PLAY_START_TIME);
					mHandler.sendEmptyMessageDelayed(PLAY_START_TIME,delayTime);
					
				}
				
				break;
			case UsbStateReceiver.USB_STATE_ON:
				break;
			case UsbStateReceiver.USB_STATE_OFF:
				
				finish();
				break;
			default:
				break;
			}
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.video);
		Log.i(TAG, "onCreate...");
		init();
		
	}
	

	
	private void init() {
		
		Log.i(TAG, "init...");
		
		videoPlayer = (MVideoView) findViewById(R.id.videoView);
		
		MediaController mediaController = new MediaController(this);
		
		mediaController.setMediaPlayer(videoPlayer);
		videoPlayer.setMediaController(mediaController);
		
		usbReceiver = new UsbStateReceiver(this, mHandler);
		usbReceiver.registerReceiver();
		
		
		Intent intent = getIntent();
		
		String usbPath = intent.getStringExtra(SecondActivity.USB_PATH);
		Log.i(TAG, "usbPath-->"+usbPath);
		
		if(!TextUtils.isEmpty(usbPath)){
			
			paseFile(usbPath+"/fastmode.txt");
			videoPath=usbPath+"/"+videoName;	
		}
		
		//先检查存贮设备,如果USB/外置SD卡和内置SD卡同时存在,播放U盘,只有内置SD卡则播放它
		List<String> drivers = Tools.getUsbDrivers(this);
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		Log.i(TAG, "onResume...");
		
		if(!TextUtils.isEmpty(videoPath)){
			
			Log.i(TAG, "videoPlayer setVideoPath...");
			videoPlayer.setVideoPath(videoPath);
			videoPlayer.start();
			
			if(timePlayList.size()>0){
				
				cusTimePlayInfo=timePlayList.get(0);
				Log.i(TAG, "cusTimePlayInfo-->"+cusTimePlayInfo);
				
				int delayTime=cusTimePlayInfo.getEndTime()-cusTimePlayInfo.getStartTime();
				
				Log.i(TAG, "delayTime-->"+delayTime);
				mHandler.removeMessages(PLAY_START_TIME);
				mHandler.sendEmptyMessageDelayed(PLAY_START_TIME,delayTime);
				
			}
		}
	}
	
	@Override
	protected void onStop() {
		super.onStop();
		
		timePlayList.clear();
		timePlayList=null;
		videoPlayer.stopPlayback();
		usbReceiver.unRegisterReceiver();
	}
	
	@Override
	protected void onDestroy() {
		super.onDestroy();
	}

	
	private void paseFile(String filePath) {
		
		boolean exists = new File(filePath).exists();
		Log.i(TAG, "paseFile filePath exists-->"+exists);
		if(!exists){
			Log.e(TAG, "paseFile no filePath -->"+filePath);
			return;
		}
		
		timePlayList.clear();
		
		String lineData;
		try {
			BufferedReader br = new BufferedReader(new FileReader(filePath));
			while ((lineData = br.readLine()) != null) {

				lineData = lineData.trim();
				Log.i(TAG, lineData);
				
				String[] arr = lineData.split("=");
				
				if(arr!=null&&arr.length>1){
					
					if(arr[0].equals("n")){
						
						videoName=arr[1].trim();
						
					}else{
						
						TimePlayInfo info = new TimePlayInfo();
						
						info.setKeyCode(Integer.parseInt(arr[0].trim()));
						
						String[] arr2=arr[1].split(",");
						
						if(arr2!=null&&arr2.length>1){
							
							info.setStartTime(Integer.parseInt(arr2[0].trim())*1000);
							
							info.setEndTime(Integer.parseInt(arr2[1].trim())*1000);
							
							timePlayList.add(info);
						}
					}
					
					
				}
			}
			
			for (int i=0;i<timePlayList.size();i++) {
				
				Log.d(TAG, "timePlayInfo -->"+timePlayList.get(i).toString());
			}
				
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		
		Log.d(TAG, "keyCode-->"+keyCode);
		
		if (keyCode >= KeyEvent.KEYCODE_0 && keyCode <= KeyEvent.KEYCODE_9) {
		
			for (int i=0;i<timePlayList.size();i++) {
				
				TimePlayInfo timePlayInfo = timePlayList.get(i);
				
				Log.d(TAG, "timePlayInfo -->"+timePlayInfo.toString());
				
				if(timePlayInfo.getKeyCode()==keyCode-7){
					
					Log.i(TAG, "=====================");
					Log.d(TAG, "timePlayInfo -->"+timePlayInfo.toString());
					
					videoPlayer.seekTo(timePlayInfo.getStartTime());
					
					int delayTime=timePlayInfo.getEndTime()-timePlayInfo.getStartTime();
					
					Log.d(TAG, "delayTime-->"+delayTime);
					mHandler.removeMessages(PLAY_START_TIME);
					mHandler.sendEmptyMessageDelayed(PLAY_START_TIME,delayTime);
					
					Log.i(TAG, "=====================");
					
					return true;
				}
				
			}
		}
		
		return super.onKeyDown(keyCode, event);
	}

	
}





package net.smc.usbplayer.bean;

public class TimePlayInfo {
	
	private int keyCode;
	
	private int startTime;
	
	private int endTime;

	public int getKeyCode() {
		return keyCode;
	}

	public void setKeyCode(int keyCode) {
		this.keyCode = keyCode;
	}

	public int getStartTime() {
		return startTime;
	}

	public void setStartTime(int startTime) {
		this.startTime = startTime;
	}

	public int getEndTime() {
		return endTime;
	}

	public void setEndTime(int endTime) {
		this.endTime = endTime;
	}

	@Override
	public String toString() {
		return "TimePlayInfo [keyCode=" + keyCode + ", startTime=" + startTime
				+ ", endTime=" + endTime + "]";
	}
	
	

}

n=xiaomi.mp4
00=0,20
01=30,50
02=60,80

video.xml

<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:background="@android:color/black"
    tools:context=".MainActivity" >

    
    <net.smc.usbplayer.MVideoView
        android:id="@+id/videoView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值