美文网首页
一种笨拙的方法读取U盘中的媒体文件并播放

一种笨拙的方法读取U盘中的媒体文件并播放

作者: Dale_Dawson | 来源:发表于2019-12-30 16:48 被阅读0次

    有这么一个需求:机顶盒读取U盘中的媒体文件展示并播放


    U盘中的文件已这种方式存在,所以只能通过后缀名来区分文件类型
    .jpg是媒体文件的一张海报
    .lyric是歌曲的歌词
    .message是歌曲的名字及歌手名字
    .ts文件就是媒体文件

    一、机顶盒获取U盘的目录

    public class USBDiskReceiver extends BroadcastReceiver {
        private static final String TAG = "USBDiskReceiver";
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            String path = intent.getData().getPath();
            if (!TextUtils.isEmpty(path)) {
                if ("android.intent.action.MEDIA_REMOVED".equals(action)) {
                    Log.e(TAG, "onReceive2: ---------------usb拨出-------------");
                }
                if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
                    Log.e(TAG, "onReceive3: --------usb路径-------" + path);
                    if (!TextUtils.isEmpty(path)) {
                        CheckSongActivity.usbPath = path;
                        TaskDataHelper.handleWthxResponseMessage(new BaseResponse(), TaskEvent.TRIGGER_SONG_UPDATE, 111);
                    }
                }
            }
        }
    }
    
      <receiver android:name=".USBDiskReceiver">
                <intent-filter android:priority="1000">
                    <action android:name="android.intent.action.MEDIA_MOUNTED" />
                    <action android:name="android.intent.action.MEDIA_UNMOUNTED" />
                    <action android:name="android.intent.action.MEDIA_REMOVED" />
    
                    <data android:scheme="file" />
                </intent-filter>
            </receiver>
    

    上面这种只能在U盘插入的时候触发。

    public static List getUSBPaths(Context con) {//反射获取路径
            String[] paths = null;
            List data = new ArrayList(); // include sd and usb devices
            StorageManager storageManager = (StorageManager) con.getSystemService(Context.STORAGE_SERVICE);
            try {
                paths = (String[]) StorageManager.class.getMethod("getVolumePaths", null).invoke(storageManager, null);
                for (String path : paths) {
                    String state = (String) StorageManager.class.getMethod("getVolumeState", String.class).invoke(storageManager, path);
                    if (state.equals(Environment.MEDIA_MOUNTED) && !path.contains("emulated")) {
                        data.add(path);
                        Logger.d("f", "usbPath=" + path);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return data;
        }
    

    这种方法通过反射可以读出路径,但是还包含有sd卡的路径

     List<String> list = usbDiskState.getUSBPaths(this);
            if (list != null && !list.isEmpty()) {
                if (list.size() == 1) {
                    usbPath = list.get(0);
                } else {
                    for (String str : list) {
                        if (str != null && !str.contains("sdcard")) {
                            usbPath = str;
                            break;
                        }
                    }
                }
            }
    

    所以使用以上方法获取到USB的路径

    二、遍历分类文件

    File path = new File(usbPath + "/wthx");
                        File[] files = path.listFiles();
                        parse(files);
    
    for (File file : files) {
                    if (file.isDirectory()) {
                        parse(file.listFiles());
                    } else {
                        String fileName = file.getName();
                        if (fileName.endsWith(".ts")) {
                        } else if (fileName.endsWith(".jpg") || fileName.endsWith(".png")
                                || fileName.endsWith(".bmp") || fileName.endsWith(".gif")) {
                        } else if (fileName.endsWith(".message")) {
                        } else if (fileName.endsWith(".lyric")) {
                        }
                    }
                }
    

    用以上方式可以找到对应的后缀名的文件,然后可以通过file.getAbsolutePath()获取文件所在的路径,当然现实图片或者是播放媒体文件,知道文件所在路径也就可以了。

    别忘了权限

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
     <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
            tools:ignore="ProtectedPermissions" />
    

    相关文章

      网友评论

          本文标题:一种笨拙的方法读取U盘中的媒体文件并播放

          本文链接:https://www.haomeiwen.com/subject/pzdmoctx.html