先要监听到U盘插入的广播并获取U盘的文件路径,一般使用动态注册。
UsbStateReceiver receiver = new UsbStateReceiver(); //new一个广播接收器
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_MEDIA_UNMOUNTED); //注册 U盘拔出广播
filter.addAction(Intent.ACTION_MEDIA_MOUNTED); //注册U盘插入广播
// filter.addAction(Intent.ACTION_MEDIA_REMOVED);
// filter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
// filter.addAction(Intent.ACTION_BOOT_COMPLETED);
filter.addDataScheme("file"); // 需要为过滤器设置URL匹配标签,使用file来匹配隐式intent,否则无法接收U盘插拔事件,非常重要
// filter.addAction("com.lishun"); //注册 com.lishun广播
this.registerReceiver(receiver, filter);
注册以后,要重写广播接收器BroadcastReceiver的onReceiver方法,自己写一个类来继承BroadcastReceiver
public class UsbStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
// Log.d(TAG, "onReceive: *************************收到广播");
Log.d(TAG, "onReceive: " + action);
Log.d(TAG, "onReceive: ======================================" + intent);
// Intent intent2 = new Intent(context, VideoActivity.class);
// intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加标记
// context.startActivity(intent2);
switch (action) {
case Intent.ACTION_MEDIA_MOUNTED://收到U盘插入广播
// File file=new File("/sdcard/UDiskAssistant/Video"); //新建一个file传入文件夹目录
// if(!file.exists()){ //如果不存在就创建一个文件夹
// file.mkdirs();
// }
Log.d(TAG, "onReceive: U盘已插入" + intent.getData().getPath() + " ");
Toast.makeText(context, "U盘已插入", Toast.LENGTH_SHORT).show();
String fromFile = null;
final String toFile = "/sdcard/UDiskAssistant/Video";
fromFile = intent.getData().getPath();
readUDiskDevsList(fromFile, toFile); //复制MP4文件
initVideo(); //播放复制的MP4文件
break;
case Intent.ACTION_MEDIA_UNMOUNTED:
Log.d(TAG, "onReceive: U盘已拔出");
Toast.makeText(context, "U盘已拔出", Toast.LENGTH_SHORT).show();
break;
// case Intent.ACTION_BOOT_COMPLETED:
// Intent service = new Intent(context, Services.class);
// context.startService(service);
// break;
default:
break;
}
}
}
使用mkdirs新建一个指定目录,将MP4文件拷贝到这里
public void readUDiskDevsList(String oldPath, String newPath) {
try {
(new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹
File a = new File(oldPath);
String[] file = a.list();
File temp = null;
//读取文件夹中的文件
for (int i = 0; i < file.length; i++) {
if (oldPath.endsWith(File.separator)) {
temp = new File(oldPath + file[i]);
} else {
temp = new File(oldPath + File.separator + file[i]);
}
if (temp.isFile() && temp.getName().endsWith(".mp4")) { //只复制MP4文件
//建立通道对象
FileInputStream input = new FileInputStream(temp);
FileOutputStream output = new FileOutputStream(newPath + "/" +
(temp.getName()).toString());
Log.d(TAG, "readUDiskDevsList: " + temp.getName() + "复制成功");
//定义存储空间
byte[] b = new byte[1024 * 5];
//开始读文件
int len;
while ((len = input.read(b)) != -1) {
//将b中的数据写入到FileOutputStream对象中
output.write(b, 0, len);
}
//关闭流
output.flush();
output.close();
input.close();
if (temp.isDirectory()) {//如果是子文件夹
readUDiskDevsList(oldPath + "/" + file[i], newPath + "/" + file[i]);
}
}
}
} catch (Exception e) {
System.out.println("复制整个文件夹内容操作出错");
e.printStackTrace();
}
}
判断是否有该文件夹,没有的话新建一个,然后遍历文件夹,找到MP4文件并播放
private void initVideo() {
File Createfile = new File("/sdcard/UDiskAssistant/Video"); //新建一个file传入文件夹目录
if (!Createfile.exists()) { //如果不存在就创建一个文件夹
Createfile.mkdirs();
}
final String path = "/sdcard/UDiskAssistant/Video";
Log.d(TAG, "initView: path============================" + path);
File a = new File(path);
final String[] file = a.list();
final ArrayList<String> listPath = new ArrayList<String>();
File temp = null;
t = 0;
//读取文件夹中的文件
for (int i = 0; i < file.length; i++) { //读取path中的MP4文件
if (path.endsWith(File.separator)) {
temp = new File(path + file[i]);
listPath.add(String.valueOf(temp));
t++;
} else {
temp = new File(path + File.separator + file[i]);
listPath.add(String.valueOf(temp));
t++;
}
}
if (t != 0) { //判断播放Video文件夹内是否为空
i = 0;
videoUrl1 = String.valueOf(listPath.get(i));
Log.d(TAG, "initVideo: temp==" + temp);
uri = Uri.parse(videoUrl1);
// Log.d(TAG, "initVideo: ====================================测试x");
// Log.d(TAG, "initVideo: ====================================测试0");
// videoView.setMediaController(new MediaController(this));
MediaController mediaController = new MediaController(this);
mediaController.setVisibility(View.GONE); //隐藏进度条
videoView.setMediaController(mediaController);
// Log.d(TAG, "initVideo: ====================================测试1");
videoView.setVideoURI(uri);
// Log.d(TAG, "initVideo: ====================================测试2");
videoView.start();
// Log.d(TAG, "initVideo: ====================================测试3");
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (i < t - 1)
i++;
else i = 0;
videoUrl1 = String.valueOf(listPath.get(i));
uri = Uri.parse(videoUrl1);
videoView.setVideoURI(uri);
videoView.start();
}
});
// videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mp) {
// mp.setLooping(true);
// videoView.start();
// }
// });
}
}
这里用的是setOnCompletionListener,用来监听视频播放是否完成,播放完一个视频后,执行onCompletion方法。我是将复制后的文件路径保存到Arraylist中,播放完一个视频后,遍历Arraylist存放的路径,自动播放下一个视频。