Android拷贝U盘中的文件到指定目录,拷贝完成后自动播放MP4文件

本文介绍如何通过Android应用程序监听U盘的插入和拔出,并实现自动复制U盘中的MP4文件到指定文件夹及自动播放的功能。文章详细展示了如何注册广播接收器、处理广播事件以及文件操作的方法。

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

先要监听到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存放的路径,自动播放下一个视频。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值